pca函数python PCA函数R语言

如何用python实现pca降维首先2个包:
import numpy as np
from sklearn.decomposition import PCA
然后一个m x n 的矩阵,n为维度,这里设为x 。
n_components = 12 是自己可以设的 。
pca = PCA(n_components=12)
pca.fit(x)
PCA(copy=True, iterated_power='auto', n_components=12, random_state=None,
svd_solver='auto', tol=0.0, whiten=False)
float_formatter = lambda x: "%.2f" % x
np.set_printoptions(formatter={'float_kind':float_formatter})
print 'explained variance ratio:'
print pca.explained_variance_ratio_
print 'cumulative sum:'
print pca.explained_variance_ratio_.cumsum()
PCA(主成分分析)python实现 回顾了下PCA的步骤,并用python实现 。深刻的发现当年学的特征值、特征向量好强大 。
PCA是一种无监督的学习方式,是一种很常用的降维方法 。在数据信息损失最小的情况下,将数据的特征数量由n,通过映射到另一个空间的方式 , 变为k(kn) 。
这里用一个2维的数据来说明PCA,选择2维的数据是因为2维的比较容易画图 。
这是数据:
画个图看看分布情况:
协方差的定义为:
假设n为数据的特征数,那么协方差矩阵M, 为一个n n的矩阵,其中Mij为第i和第j个特征的协方差,对角线是各个特征的方差 。
在我们的数据中,n=2,所以协方差矩阵是2 2的,
通过numpy我们可以很方便的得到:
【pca函数python PCA函数R语言】 得到cov的结果为:
array([[ 0.61655556,0.61544444],
[ 0.61544444,0.71655556]])
由于我们之前已经做过normalization,因此对于我们来说,
这个矩阵就是 data*data的转置矩阵 。
得到结果:
matrix([[ 5.549,5.539],
[ 5.539,6.449]])
我们发现,其实协方差矩阵和散度矩阵关系密切,散度矩阵 就是协方差矩阵乘以(总数据量-1) 。因此他们的 特征根 和 特征向量 是一样的 。这里值得注意的一点就是,散度矩阵是 SVD奇异值分解 的一步,因此PCA和SVD是有很大联系的,他们的关系这里就不详细谈了,以后有机会再写下 。
用numpy计算特征根和特征向量很简单,
但是他们代表的意义非常有意思,让我们将特征向量加到我们原来的图里:
其中红线就是特征向量 。有几点值得注意:
蓝色的三角形就是经过坐标变换后得到的新点,其实他就是红色原点投影到红线、蓝线形成的 。
得到特征值和特征向量之后,我们可以根据 特征值 的大小 , 从大到小的选择K个特征值对应的特征向量 。
这个用python的实现也很简单:
从eig_pairs选取前k个特征向量就行 。这里,我们只有两个特征向量,选一个最大的 。
主要将原来的数据乘以经过筛选的特征向量组成的特征矩阵之后,就可以得到新的数据了 。
output:
数据果然变成了一维的数据 。
最后我们通过画图来理解下数据经过PCA到底发生了什么 。
绿色的五角星是PCA处理过后得到的一维数据,为了能跟以前的图对比,将他们的高度定位1.2,其实就是红色圆点投影到蓝色线之后形成的点 。这就是PCA,通过选择特征根向量,形成新的坐标系 , 然后数据投影到这个新的坐标系,在尽可能少的丢失信息的基础上实现降维 。
通过上述几步的处理,我们简单的实现了PCA第一个2维数据的处理,但是原理就是这样,我们可以很轻易的就依此实现多维的 。
用sklearn的PCA与我们的pca做个比较:
得到结果:
用我们的pca试试
得到结果:
完全一致,完美~
值得一提的是,sklearn中PCA的实现,用了部分SVD的结果,果然他们因缘匪浅 。

推荐阅读