MachineLearning-PCA

MachineLearning-PCA

标签: MachineLearning DataMining


算法概述

  主成分分析(PrincipalComponentsAnalysis)是最常用的一种降维方法。其优势是减低数据的复杂性,并且可以依靠排序协方差矩阵的特征值识别最重要的多个特征,但是有可能损失有用的信息。

算法思路

  对于正交属性空间中的样本点,如果用一个超平面(直线的高维推广)对所有样本进行恰当的表达,则它应该有如下性质:
   最近重构性:样本点到这个超平面的距离都足够近;
   最大可分性:样本点在这个超平面上的投影能够尽可能分开
  基于这两个性质,可以得到主成分分析的两种推导。
  基于最近重构性的思路是:假定样本进行中心化;再假定投影变化后得到的新坐标系{w1,w2,w3…wd}中wi为标准正交基向量。若丢弃新坐标系中的部分坐标,即将维度降低到d’< d,则样本点xi在低维坐标系中的投影是zi=(zi_1,zi_2…zi_d’)其中zi_j为xi在低维坐标系下的第j维的坐标。以原样本点与基于投影重构的样本点之间的距离之和为优化目标,找到合适的参数使得其最小。
  基于最大可分性的解释则较为直观,我们知道样本点在新空间中超平面上的投影,若所有样本点尽可能的分开,则可以使该投影后样本点的方差最大化,即找到合适的单位方向向量可以最大化投影方差:
                    Markdown
  发现最优结果为如下矩阵的主特征向量:
                        Markdown
  更详细的推导可以参考CS229的课件。
  基于以上的理论,以二维样本为例,我们可以得到算法的具体流程如下:
   1.分别求x和y的平均值,然后对于所有的样例,都减去对应的均值
   2.求特征协方差矩阵
   3.求协方差的特征值和特征向量
   4.将特征值按照从大到小的顺序排序,选择其中最大的k个,然后将其对应的k个特征向量分别作为列向量组成特征向量矩阵
   5.将样本点投影到选取的特征向量上
  基于以上步骤,则可以得到投影到新空间内的原坐标。

算法实现

  算法的实现应用了numpy中的linalg模块进行特征向量和特征值的计算。实现核心代码如下:

1
2
3
4
5
6
7
8
9
10
11
def 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
12
import 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
8
python run.py 
[[ -2.51033597e+00]
[ -2.86915379e+00]
[ 9.74108510e-02]
...,
[ -5.01662249e-01]
[ -5.89871235e-02]
[ -1.89787138e-01]]

  测试“reconMat”输出如下:
Markdown
  当测试用参数为2,即保留二维特征:

1
lowDMat,reconMat = pca.pca(dataMat,2)

  测试“lowDMat”输出如下:

1
2
3
4
5
6
7
8
python 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”输出如下:
Markdown

算法应用

  主成分分析方法有许多应用,最直接的用法就是降低数据集的维度进行可视化;另一个常用应用则是在进行监督学习之前对于样本进行预处理;另一方面,当数据收受到噪声影响时,最小的特征值所对应的特征向量往往与噪声有关,将其舍去可以在一定程度上起到去噪的作用。