MachineLearning-PCA
标签: MachineLearning DataMining
算法概述
主成分分析(PrincipalComponentsAnalysis)是最常用的一种降维方法。其优势是减低数据的复杂性,并且可以依靠排序协方差矩阵的特征值识别最重要的多个特征,但是有可能损失有用的信息。
算法思路
对于正交属性空间中的样本点,如果用一个超平面(直线的高维推广)对所有样本进行恰当的表达,则它应该有如下性质:
最近重构性:样本点到这个超平面的距离都足够近;
最大可分性:样本点在这个超平面上的投影能够尽可能分开
基于这两个性质,可以得到主成分分析的两种推导。
基于最近重构性的思路是:假定样本进行中心化;再假定投影变化后得到的新坐标系{w1,w2,w3…wd}中wi为标准正交基向量。若丢弃新坐标系中的部分坐标,即将维度降低到d’< d,则样本点xi在低维坐标系中的投影是zi=(zi_1,zi_2…zi_d’)其中zi_j为xi在低维坐标系下的第j维的坐标。以原样本点与基于投影重构的样本点之间的距离之和为优化目标,找到合适的参数使得其最小。
基于最大可分性的解释则较为直观,我们知道样本点在新空间中超平面上的投影,若所有样本点尽可能的分开,则可以使该投影后样本点的方差最大化,即找到合适的单位方向向量可以最大化投影方差:
发现最优结果为如下矩阵的主特征向量:
更详细的推导可以参考CS229的课件。
基于以上的理论,以二维样本为例,我们可以得到算法的具体流程如下:
1.分别求x和y的平均值,然后对于所有的样例,都减去对应的均值
2.求特征协方差矩阵
3.求协方差的特征值和特征向量
4.将特征值按照从大到小的顺序排序,选择其中最大的k个,然后将其对应的k个特征向量分别作为列向量组成特征向量矩阵
5.将样本点投影到选取的特征向量上
基于以上步骤,则可以得到投影到新空间内的原坐标。
算法实现
算法的实现应用了numpy中的linalg模块进行特征向量和特征值的计算。实现核心代码如下:1
2
3
4
5
6
7
8
9
10
11def pca(dataMat,topNfeat = 9999999):
meanVals = mean(dataMat,axis=0)
meanRemoved = dataMat - meanVals
covMat = cov(meanRemoved,rowvar = 0)
eigVals,eigVects = linalg.eig(mat(covMat))
eigValInd = argsort(eigVals)
eigValInd = eigValInd[:-(topNfeat+1):-1]
redEigVects = eigVects[:,eigValInd]
lowDDataMat = meanRemoved * redEigVects
reconMat = (lowDDataMat * redEigVects.T) + meanVals
return lowDDataMat,reconMat
其中输出lowDataMat为降维后的样本集,而reconMat为转换到新空间的样本集
测试代码如下:1
2
3
4
5
6
7
8
9
10
11
12import pca
import matplotlib
import matplotlib.pyplot as plt
dataMat = pca.loadDataSet('testSet.txt')
lowDMat,reconMat = pca.pca(dataMat,1)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(dataMat[:,0].flatten().A[0],dataMat[:,1].flatten().A[0],marker='^',s=90)
ax.scatter(reconMat[:,0].flatten().A[0],reconMat[:,1].flatten().A[0],marker='o',s=50,c='red')
plt.show()
当测试用参数为1,即保留一个特征,即:1
lowDMat,reconMat = pca.pca(dataMat,1)
测试“lowDMat”输出如下:1
2
3
4
5
6
7
8python run.py
[[ -2.51033597e+00]
[ -2.86915379e+00]
[ 9.74108510e-02]
...,
[ -5.01662249e-01]
[ -5.89871235e-02]
[ -1.89787138e-01]]
测试“reconMat”输出如下:
当测试用参数为2,即保留二维特征:1
lowDMat,reconMat = pca.pca(dataMat,2)
测试“lowDMat”输出如下:1
2
3
4
5
6
7
8python run.py
[[-2.51033597 0.15840394]
[-2.86915379 0.5092619 ]
[ 0.09741085 -0.20728318]
...,
[-0.50166225 -0.62056456]
[-0.05898712 -0.02335614]
[-0.18978714 -1.37276015]]
测试“reconMat”输出如下:
算法应用
主成分分析方法有许多应用,最直接的用法就是降低数据集的维度进行可视化;另一个常用应用则是在进行监督学习之前对于样本进行预处理;另一方面,当数据收受到噪声影响时,最小的特征值所对应的特征向量往往与噪声有关,将其舍去可以在一定程度上起到去噪的作用。