吾本轻狂|主成分分析,PCA

前一篇提到的人脸识别中 , 我们在使用SVM支持向量机做人脸分类之前使用到PCA提取人脸数据中的主要成分 , 降低计算的维度 , 那么具体PCA是如何提取的呢?下文了解一下 。
PCAisamethodtoprojectdatainahigherdimensionalspaceintolowerdimensionalspacebymaximizingthevarianceofeachdimension--wiki
PCAismostlyusedasatoolinexploratorydataanalysisandformakingpredictivemodels.Itisoftenusedtovisualizegeneticdistanceandrelatednessbetweenpopulations.PCAiseitherdonebysingularvaluedecompositionofadesignmatrixorbydoingthefollowing2steps:
1.calculatingthedatacovariance(orcorrelation)matrixoftheoriginaldata
2.performingeigenvaluedecomposition(特征值分解)onthecovariancematrix(协方差矩阵).
--wiki
主成分分析 , 是一种统计方法 , 通过正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量 , 转换后的这组变量叫主成分 。 对于这些成分 , 有些就显得没有那么必要 。 那么我们可以从这些成分中挑取比较有用的 , 而对于我们模型的训练作用不大的可以去除掉 。 这个过程其实也是一个降维的过程 , 对高维度的数据集进行降维 , 减少一些信息含量 , 保留主要的那些维度 。 主要的那些维度是指在这些维度上具有更大的差异 , 而对于那些差异化不大的特征 , 有时候反而会影响我们的模型学习 , 而成为一种噪音 , 也会影响我们training时候的速度 。 所以在机器学习的过程中 , 去掉那些无关紧要的变量会使得我们的学习模型效率提高 。
因此我们要找到那些差异化比较大的特征 , 也就是说在表示它的特征的这一系列数中 , 它的variance(方差:是在概率论和统计方差衡量随机变量或一组数据时离散程度的度量)是比较大的 , 比较离散的 , 而对于那些不明显的特征 , 用数据来衡量他们的这种特征程度的话 , 他们更容易聚集在一起 , 而不那么离散 , 也就是variance的值很小 。 下面使用代码画图来形象地了解一下 。
%matplotlibinlineimportnumpyasnpimportmatplotlib.pyplotaspltimportseabornassns;sns.set()rng=np.random.RandomState(1)X=np.dot(rng.rand(2,2),rng.rand(2,200)).Tplt.scatter(X[:,0],X[:,1])plt.axis('equal')先画出散点图 , 观察一下我们的samples:
就是两个矩阵的乘积 , A矩阵的第一行乘以B矩阵的第一列所得的元素的和作为新矩阵C的第一列中第一行的数 , A矩阵第二行乘以B矩阵第一列所得元素的和作为C矩阵的第一列中第二行的数 , 以此类推 。
Numpy.random.RandomState.rand(2 , 200)randomvaluesinagivenshape,产生一个2x200的矩阵 。 矩阵中的每一个element(元)都是随机产生的介于0到1之间的一个数 。
X=np.dot(rng.rand(2,2),rng.rand(2,200)).T
这个代码的意思是先随机产生两个点 , 然后再用这两个点进行一个列变换(左乘行变换 , 右乘列变换)产生与左边矩阵具有相同行 , 与右乘的矩阵右相同列的shape为2x200的新矩阵 , 可以知道这个新的矩阵中的每个点的x或y坐标都不会大于2(1x1+1x1=2) 。 尾部的.T进行了矩阵的转置 , 使得矩阵从2x200的shape变成200x2 。
使用PCA来解出上图中散点的主成分 , 图中每个点需要两个参数(x,y坐标)才能表达准确 , 那么对于该图上的点来说 , numberofcomponents=2 , 有两个成分 。
fromsklearn.decompositionimportPCApca=PCA(n_components=2)pca.fit(X)看起来只有三行代码 , 但是相关的计算几乎全在里面了 。


推荐阅读