主成分分析(principal component analysis)是一种常见的数据降维方法,其目的是
在“信息”损失较小的前提下,将高维的数据转换到低维,从而减小计算量。

  PCA的本质就是找一些投影方向,使得数据在这些投影方向上的方差最大,而且这些投影方向是相互正交的。
这其实就是找新的正交基的过程,计算原始数据在这些正交基上投影的方差,方差越大,就说明在对应正交基上包含了更多的信息量。后面会证明,原始数据协方差矩阵的特征值越大,对应的方差越大,在对应的特征向量上投影的信息量就越大。反之,如果特征值较小,则说明数据在这些特征向量上投影的信息量很小,可以将小特征值对应方向的数据删除,从而达到了降维的目的。

  PCA的全部工作简单点说,就是对原始的空间中顺序地找一组相互正交的坐标轴
,第一个轴是使得方差最大的,第二个轴是在与第一个轴正交的平面中使得方差最大的,第三个轴是在与第1、2个轴正交的平面中方差最大的,这样假设在N维空间中,我们可以找到N个这样的坐标轴,我们取前r个去近似这个空间,这样就从一个N维的空间压缩到r维的空间了,但是我们选择的r个坐标轴能够使得空间的压缩使得数据的损失最小。

  因此,关键点就在于:如何找到新的投影方向使得原始数据的“信息量”损失最少?

1.样本“信息量”的衡量

  样本的“信息量”指的是样本在特征方向上投影的方差。方差越大,则样本在该特征上的差异就越大,因此该特征就越重要。
以《机器学习实战》上的图说明,在分类问题里,样本的方差越大,越容易将不同类别的样本区分开。




  图中共有3个类别的数据,很显然,方差越大,越容易分开不同类别的点。样本在X轴上的投影方差较大,在Y轴的投影方差较小。方差最大的方向应该是中间斜向上的方向(图中红线方向)。如果将样本按照中间斜向上的方向进行映射,则只要一维的数据就可以对其进行分类,相比二维的原数据,就相当降了一维。

      
在原始数据更多维的情况下,先得到一个数据变换后方差最大的方向,然后选择与第一个方向正交的方向,该方向是方差次大的方向,如此下去,直到变换出与原特征个数相同的新特征或者变换出前N个特征(在这前N个特征包含了数据的绝大部分信息),简而言之,PCA是一个降维的过程,将数据映射到新的特征,新特征是原始特征的线性组合。

2.计算过程(因为插入公式比较麻烦,就直接采用截图的方式)









在PCA的实现过程中,对协方差矩阵做奇异值分解时,能得到S矩阵(特征值矩阵)。




实际使用



用sklearn封装的PCA方法,做PCA的代码如下。PCA方法参数n_components,如果设置为整数,则n_components=k。
如果将其设置为小数,则说明降维后的数据能保留的信息。
from sklearn.decomposition import PCA import numpy as np from
sklearn.preprocessingimport StandardScaler x=np.array([[10001,2,55], [16020,4,11
], [12008,6,33], [13131,8,22]]) # feature normalization (feature scaling)
X_scaler = StandardScaler() x = X_scaler.fit_transform(x)# PCA pca =
PCA(n_components=0.9)# 保证降维后的数据保持90%的信息 pca.fit(x) pca.transform(x)
所以在实际使用PCA时,我们不需要选择k,而是直接设置n_components为float数据。

<>总结


PCA主成分数量k的选择,是一个数据压缩的问题。通常我们直接将sklearn中PCA方法参数n_components设置为float数据,来间接解决k值选取问题。 
但有的时候我们降维只是为了观测数据(visualization),这种情况下一般将k选择为2或3。
参数说明:
n_components:   意义:PCA算法中所要保留的主成分个数n,也即保留下来的特征个数n 类型:int 或者
string,缺省时默认为None,所有成分被保留。           赋值为int,比如n_components=1,将把原始数据降到一个维度。    
      赋值为string,比如n_components='mle',将自动选取特征个数n,使得满足所要求的方差百分比。
copy:
类型:bool,True或者False,缺省时默认为True。
意义:表示是否在运行算法时,将原始训练数据复制一份。若为True,则运行PCA算法后,原始训练数据的值不          
 会有任何改变,因为是在原始数据的副本上进行运算;若为False,则运行PCA算法后,原始训练数据的            
 值会改,因为是在原始数据上进行降维计算。

whiten:

类型:bool,缺省时默认为False

意义:白化,使得每个特征具有相同的方差。关于“白化”,可参考:Ufldl教程
<http://deeplearning.stanford.edu/wiki/index.php/%E7%99%BD%E5%8C%96>







<>2、PCA对象的属性

components_ :返回具有最大方差的成分。
explained_variance_ratio_:返回 所保留的n个成分各自的方差百分比。
n_components_:返回所保留的成分个数n。
mean_:
noise_variance_:



<>3、PCA对象的方法

* fit(X,y=None)
fit()可以说是scikit-learn中通用的方法,每个需要训练的算法都会有fit()方法,它其实就是算法中的“训练”这一步骤。因为PCA是无监督学习算法,此处y自然等于None。
fit(X),表示用数据X来训练PCA模型。
函数返回值:调用fit方法的对象本身。比如pca.fit(X),表示用X对pca这个对象进行训练。

* fit_transform(X)用X来训练PCA模型,同时返回降维后的数据。
newX=pca.fit_transform(X),newX就是降维后的数据。

* inverse_transform()将降维后的数据转换成原始数据,X=pca.inverse_transform(newX)

* transform(X)将数据X转换成降维后的数据。当模型训练好后,对于新输入的数据,都可以用transform方法来降维。
此外,还有get_covariance()、get_precision()、get_params(deep=True)、score(X,
y=None)等方法,以后用到再补充吧。

3.python实现

 下面介绍Sklearn中PCA降维的方法。
        导入方法:

[python] view plain <http://blog.csdn.net/eastmount/article/details/53285192#> 
copy <http://blog.csdn.net/eastmount/article/details/53285192#>
* from sklearn.decomposition import PCA          
调用函数如下,其中n_components=2表示降低为2维。
[python] view plain <http://blog.csdn.net/eastmount/article/details/53285192#> 
copy <http://blog.csdn.net/eastmount/article/details/53285192#>
* pca = PCA(n_components=2)           例如下面代码进行PCA降维操作:
[python] view plain <http://blog.csdn.net/eastmount/article/details/53285192#> 
copy <http://blog.csdn.net/eastmount/article/details/53285192#>
* import numpy as np  
* from sklearn.decomposition import PCA  
* X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])  
* pca = PCA(n_components=2)  
* print pca  
* pca.fit(X)  
* print(pca.explained_variance_ratio_)            输出结果如下所示:
[python] view plain <http://blog.csdn.net/eastmount/article/details/53285192#> 
copy <http://blog.csdn.net/eastmount/article/details/53285192#>
* PCA(copy=True, n_components=2, whiten=False)  
* [ 0.99244291  0.00755711]           再如载入boston数据集,总共10个特征,降维成两个特征:
[python] view plain <http://blog.csdn.net/eastmount/article/details/53285192#> 
copy <http://blog.csdn.net/eastmount/article/details/53285192#>
* #载入数据集  
* from sklearn.datasets import load_boston  
* d = load_boston()  
* x = d.data  
* y = d.target  
* print x[:10]  
* print u'形状:', x.shape  
*   
* #降维  
* import numpy as np  
* from sklearn.decomposition import PCA  
* pca = PCA(n_components=2)  
* newData = pca.fit_transform(x)  
* print u'降维后数据:'  
* print newData[:4]  
* print u'形状:', newData.shape           输出结果如下所示,降低为2维数据。
[python] view plain <http://blog.csdn.net/eastmount/article/details/53285192#> 
copy <http://blog.csdn.net/eastmount/article/details/53285192#>
* [[  6.32000000e-03   1.80000000e+01   2.31000000e+00   0.00000000e+00  
*     5.38000000e-01   6.57500000e+00   6.52000000e+01   4.09000000e+00  
*     1.00000000e+00   2.96000000e+02   1.53000000e+01   3.96900000e+02  
*     4.98000000e+00]  
*  [  2.73100000e-02   0.00000000e+00   7.07000000e+00   0.00000000e+00  
*     4.69000000e-01   6.42100000e+00   7.89000000e+01   4.96710000e+00  
*     2.00000000e+00   2.42000000e+02   1.78000000e+01   3.96900000e+02  
*     9.14000000e+00]  
*  [  2.72900000e-02   0.00000000e+00   7.07000000e+00   0.00000000e+00  
*     4.69000000e-01   7.18500000e+00   6.11000000e+01   4.96710000e+00  
*     2.00000000e+00   2.42000000e+02   1.78000000e+01   3.92830000e+02  
*     4.03000000e+00]  
*  [  3.23700000e-02   0.00000000e+00   2.18000000e+00   0.00000000e+00  
*     4.58000000e-01   6.99800000e+00   4.58000000e+01   6.06220000e+00  
*     3.00000000e+00   2.22000000e+02   1.87000000e+01   3.94630000e+02  
*     2.94000000e+00]]  
* 形状: (506L, 13L)  
* 降维后数据:  
* [[-119.81821283    5.56072403]  
*  [-168.88993091  -10.11419701]  
*  [-169.31150637  -14.07855395]  
*  [-190.2305986   -18.29993274]]  
* 形状: (506L, 2L)  

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信