主成分分析(PCA)和基于核函数的主成分分析(KPCA)入门
来源:互联网 发布:怎么联系淘宝客服 编辑:程序博客网 时间:2024/05/29 19:25
前言
主成分分析是在做特征筛选时的重要手段,这个方法在大部分的书中都只是介绍了步骤方法,并没有从头到尾把这个事情给说清楚。本文的目的是把PCA和KPCA给说清楚。主要参考了YouTube上李政轩的Principal Component Analysis and Kernel Principal Component Analysis这个视频(强烈推荐看一下)。
PCA的原理
什么是投影
主成分分析所做的工作就是将数据集从高维投影到低维,从而用极少的几个特征来涵盖大部分的数据集信息。
所谓的投影,就是下图所示的这样。
其中,
由于向量之间的内积为
故有
如果我们把
也就是说我们只要求出
又由于在坐标当中,内积可以表示为
故可以用
投影后的方差
主成分分析认为,沿某特征分布的数据的方差越大,则该特征所包含的信息越多,也就是所谓的主成分。
我们已经知道了可以用
注意到
其中,
好了,如果我们要找到最大的方差,也就是要找到一个向量
转化为求特征值的问题
我们可以将求最大方差的问题写成
又由于
利用拉格朗日乘子法可以将上述问题转化为
其中,
上述方程组等价于
看到了没,
是不是很神奇!要求的方差就是我们这里的特征值!所以我们只需要把
符号的表示
值得注意的是,
其中,每个
其中,
为了方便表示,我们作出如下定义
于是,
KPCA的原理
基于核函数的主成分分析和主成分分析的步骤是一样的,只不过用核函数替代了原来的数据。这里对什么是核函数不作说明,请参考其它文章。
对于线性不可分的数据集,我们可以将其映射到高维上,再进行划分。
我们令
那么
在这里,
上述的
如果要求
其中,
我们对左右两边同时左乘一个
即
又由于
由于我们希望特征向量是单位向量,所以我们对其做一下单位化
在上式中,
上式中所有的量都是可以求得的,也就说我们在没有求出特征向量的情况下,直接算出了样本在特征向量上的投影!
这样一来问题就解决了!是不是很神奇!
PCA和KPCA在Python中的使用
在python的sklearn包中,已经对PCA和KPCA进行了实现,我们只需要调用函数即可,非常方便。
PCA的使用
我们用的数据集是UCI上关于葡萄酒的数据集,得到数据集后对其进行预处理,使得其均值为0。
import pandas as pdfrom sklearn.preprocessing import StandardScalerdf = pd.read_csv('http://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data', header=None)x, y = df.iloc[:, 1:].values, df.iloc[:, 0].valuessc = StandardScaler()x = sc.fit_transform(x)
这个时候得到的
我们用主成分分析法将
from sklearn.decomposition import PCApca = PCA(n_components=2)x_pca = pca.fit_transform(x)
然后我们来看下效果
import matplotlib.pyplot as pltplt.scatter(x_pca[y==1, 0], x_pca[y==1, 1], color='red', marker='^', alpha=0.5)plt.scatter(x_pca[y==2, 0], x_pca[y==2, 1], color='blue', marker='o', alpha=0.5)plt.scatter(x_pca[y==3, 0], x_pca[y==3, 1], color='lightgreen', marker='s', alpha=0.5)plt.xlabel('PC1')plt.ylabel('PC2')plt.show()
可以得到
很显然,此时已经可以看成是线性可分的数据集了,效果不错。
KPCA的使用
PCA的使用是有局限性的,如果遇到了,一个像下面这样的线性不可分的数据集,就比较麻烦了。
from sklearn.datasets import make_moonsx2, y2 = make_moons(n_samples=100, random_state=123)plt.scatter(x2_std[y2==0, 0], x2_std[y2==0, 1], color='red', marker='^', alpha=0.5)plt.scatter(x2_std[y2==1, 0], x2_std[y2==1, 1], color='blue', marker='o', alpha=0.5)plt.xlabel('PC1')plt.ylabel('PC2')plt.show()
不相信的话我们可以用PCA先试下看
x2_std = sc.fit_transform(x2)x_spca = pca.fit_transform(x2_std)fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(14,6))ax[0].scatter(x_spca[y2==0, 0], x_spca[y2==0, 1], color='red', marker='^', alpha=0.5)ax[0].scatter(x_spca[y2==1, 0], x_spca[y2==1, 1], color='blue', marker='o', alpha=0.5)ax[1].scatter(x_spca[y2==0, 0], np.zeros((50,1))+0.02, color='red', marker='^', alpha=0.5)ax[1].scatter(x_spca[y2==1, 0], np.zeros((50,1))+0.02, color='blue', marker='o', alpha=0.5)ax[0].set_xlabel('PC1')ax[0].set_ylabel('PC2')ax[1].set_ylim([-1, 1])ax[1].set_yticks([])ax[1].set_xlabel('PC1')plt.show()
从图中可以看出,经过主成分分析之后,数据仍旧是线性不可分的。接下来,我们用基于核函数的主成分分析来试下看。
from sklearn.decomposition import KernelPCAkpca = KernelPCA(n_components=2, kernel='rbf', gamma=15)x_kpca = kpca.fit_transform(x2_std)fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(14,6))ax[0].scatter(x_kpca[y2==0, 0], x_kpca[y2==0, 1], color='red', marker='^', alpha=0.5)ax[0].scatter(x_kpca[y2==1, 0], x_kpca[y2==1, 1], color='blue', marker='o', alpha=0.5)ax[1].scatter(x_kpca[y2==0, 0], np.zeros((50,1))+0.02, color='red', marker='^', alpha=0.5)ax[1].scatter(x_kpca[y2==1, 0], np.zeros((50,1))+0.02, color='blue', marker='o', alpha=0.5)ax[0].set_xlabel('PC1')ax[0].set_ylabel('PC2')ax[1].set_ylim([-1, 1])ax[1].set_yticks([])ax[1].set_xlabel('PC1')plt.show()
由图可知,只需要把数据集投影到经变换后的特征
参考文献
[1] https://www.youtube.com/watch?v=G2NRnh7W4NQ&t=1s
[2] Raschka S. Python Machine Learning[M]. Packt Publishing, 2015.
- 主成分分析(PCA)和基于核函数的主成分分析(KPCA)入门
- 核主成分分析KPCA分析
- 核主成分分析KPCA+C代码
- 主成分分析(PCA)
- 主成分分析(PCA)
- 主成分分析(PCA)
- 主成分分析(PCA)
- 主成分分析(PCA)
- 主成分分析(PCA)
- 主成分分析(PCA)
- 主成分分析(PCA)
- 主成分分析(PCA)
- 主成分分析(PCA)
- 主成分分析(PCA)
- 主成分分析(PCA)
- 主成分分析(PCA)
- 基于GDAL实现的PCA变换(主成分分析)
- 基于PCA(主成分分析)的人脸识别
- Linux执行ls,会引起哪些系统调用
- Android adb 命令总结_持续更新
- spark standalone集群模式搭建
- 【网络编程】MarioTCP 流程图(一)
- 查看MySql的版本
- 主成分分析(PCA)和基于核函数的主成分分析(KPCA)入门
- PowerDesigner中设置数据库类型,设置default value,Comment,自增属性,以及数据库设计中的需要考虑的示项,带有小数点的数据显示
- kernel版本号的修改
- 2017 Multi-University Training Contest
- matlab2c使用c++实现matlab函数开发配置全解
- 顺序队列
- 2017暑假训练之线段树
- C指针类型小结
- spring @Autowire详解