[关闭]
@CrazyHenry 2017-12-07T21:07:23.000000Z 字数 7591 阅读 3933

【原创】PCA算法详细推导

bbbb北邮模式识别实验室


2392-106.jpg-637.5kB

一、线性代数基本知识

1、特征值和特征向量

定义是这样的,设A为n阶方阵,如果存在数,使得,称为特征值,为特征向量。

2、特征值和特征向量的意义

某方阵经过其特征向量构成的矩阵的线性变化,可以成为对角阵。

即,如果有个方阵,其所有特征值组成的特征向量是下面这样的:


那么方阵有可能(不能保证)可以经过线性变化成一个对角阵:

3、线性变化的意义

线性变化的意义就是坐标轴的旋转,当然,这只在一位到三维空间比较容易想象,实际上对于高维,我们一般称之为基的选择变化

如果选择的一组基是标准正交基,那么就是标准正交变换。

标准正交基就是每组基之间两两线性无关,而且相互正交。

上边的就是一组基,但是我们还不能保证其一定线性无关,更不能保证其一定正交。

4、对称矩阵的特殊性

5、一个性质的补充

对于二维平面的一堆没有明显规律的点集:


我们需要利用一组标准正交基,将表示的点集,用另一组坐标表示成:

根据线性代数的知识,旋转坐标轴意味着矩阵的线性变换,所以根据线性变换的原理,我们可以得到:

其中,

表示点集中的任意一点.

如果已知:

那么一定有:

其中,分别是坐标的平均值,分别是坐标的平均值.


267204-106.jpg-344.6kB

二、统计基本知识

1、二维观测数据如下

其中 等代表二维坐标系下的一个点.

2、均值和方差

2.1均值向量

表示均值向量

2.2方差

表示方差

2.3协方差

表示协方差


可见

3、协方差矩阵

所以协方差矩阵是一个对称矩阵


20140115141334_A4aNE.jpeg-163.2kB

三、详细推导过程

三.一、坐标轴旋转

现在仍然以二维的数据作为理论分析的目标。对于二维平面的一堆没有明显规律的点集:


我们需要利用一组标准正交基,将表示的点集,用另一组坐标表示成:

根据线性代数的知识,旋转坐标轴意味着矩阵的线性变换,所以根据线性变换的原理,我们可以得到:

其中,

表示点集中的任意一点.

称坐标轴为第一主分量,坐标轴为第二主分量.

是一组由标准正交基组成的正交矩阵


然后可以根据新坐标下的数据方差的大小,适当省略方差较小的坐标轴表示的维度。比如:

新的坐标轴下,第二维数据的方差很小,那么就意味着这一维的数据对分类的贡献没有那么大,所以我们就把这一维数据忽略掉。

下面举一个例子:

相当于投影.

三.二、为什么这样旋转

问为什么这样旋转,其实也就是要问,怎么求出来这个正交矩阵

1、求的方法

对于这样一个点集:


我们可以求出它的协方差矩阵:

由于这个矩阵是实对称矩阵,所以它就满足以下性质:

任意一种求解特征值的算法,我们就一定可以求到矩阵的两个特征值,,让,对应的特征向量分别为:,同时还要将所有的特征向量标准正交化。

而且这两个特征向量还满足实对阵矩阵的特性:

所以矩阵一定是个正交矩阵。至此,就求出来了!

但还需要补充说明一点很重要的性质

对于实对称矩阵的正交变换,还有一个性质:

,但是不保证,而且一般是没有这样关系的:因为变换坐标的目的就是让新坐标下每个维度的坐标对应的数据的方差依次减小,即原先数据的方差分别为坐标下坐标下;而现在的新的坐标下,比如新的点集表示为


在下文中会证明的协方差矩阵:

满足,,所以,点集经过坐标变换为点集,实际上是数据方差的重新分布

2、为什么这样求

其实上面那个补充说明已经点到了很重要的一点,就是我的点集原来在坐标下表示为,即原先数据的方差分别为坐标下坐标下,现在经过的正交变换,坐标轴变成了.(注意,点集还是原来那些点,只不过是坐标轴发生了变化,表示的方式不同而已)而且a坐标下方差坐标下方差,满足,.

同时,我们还希望对于新的坐标系,坐标系的基底之间(即特征向量之间)满足相互正交:


其中.

下面证明我们求出来的确实满足了这两个性质:

由于都是实对称矩阵的特征向量,所以满足:


由于实对称矩阵的性质:

对应的特征向量为,同理对应的特征向量为.

经过推导有:


由于,所以有:

又因为为:


所以,,.可见,对于新的坐标系,坐标系的基底之间(即特征向量之间)满足相互正交.

3、总结一下前面的推导

总结一下前面的推导,对于二维平面的一堆没有明显规律的点集用坐标表示为:


求其协方差矩阵

然后由于是实对称矩阵,由于实对称矩阵有很多可爱的性质,让我们可以利用求的特征值和特征向量,进而求出一个正交矩阵,使得

a坐标下方差,和坐标下方差,满足,,且坐标相互正交.

这一切正是我们需要的,我们可以根据比较前几个坐标的方差大小,忽略方差不是那么大的坐标.就如最初的那个例子一样.

4、补充一点

我们说,求出的对角矩阵:


根据的大小,忽略方差小的那一个,那么我们会想:一定是正数吗?

查阅线性代数的知识,有下面这个定义:

对于实对称矩阵,如果其特征值全部为正数,那么这个矩阵是正定的;如果其特征值非负,那么这个矩阵是半正定的。满足以上两种的任意一种的实对称矩阵,我们称之为非负定的。

显然,我们希望是非负定的.

同时,线性代数理论中,有这样判断一个实对称矩阵是否为非负定的方法:

对于二维情况:


根据柯西不等式,有

所以有二维情况下,,,所以,满足顺序主子式都.

对于维情况?


274063-106.jpg-499kB

四、算法代码实现

1、数据集准备

集中在第一象限的点集

2、python代码

  1. #!/usr/bin/env python
  2. # coding=utf-8
  3. from numpy import *
  4. import matplotlib
  5. import matplotlib.pyplot as plt
  6. def loadDataSet(fileName, delim = "\t"):
  7. fr = open(fileName)
  8. stringArr = [line.strip().split(delim) for line in fr.readlines()]
  9. datArr = [map(float, line) for line in stringArr]#对每行数据的两个数字都变为float
  10. return mat(datArr)
  11. def pca(dataMat, topNfeat=9999999): #dataMat为1000×2的矩阵,
  12. meanVals = mean(dataMat, axis=0) #numpy中的mat类型有算均值mean的方法,并且对每列进行计算,得到2*1的矩阵
  13. meanRemoved = dataMat - meanVals #计算协方差
  14. covMat = cov(meanRemoved, rowvar = 0) #计算协方差,维度为2,得到2×2的协方差矩阵
  15. eigVals, eigVects = linalg.eig(mat(covMat)) #计算特征值及特征向量,2×1,2×2,得到两个特征值,两列特征向量,向量长度为2
  16. eigValInd = argsort(eigVals) #默认快排,从小到大进行排序
  17. eigValInd = eigValInd[:-(topNfeat+1):-1] #得到topNfeat个特征值,大的特征值排在前面,若topNfeat为1。,则取1个特征值
  18. redEigVects = eigVects[:, eigValInd] #将topNfeat个最大的特征值对应的那列向量取出来,若topNfeat为1,
  19. lowDDataMat = meanRemoved * redEigVects #1000×2 * 2×topNfeat得到1000×topNfeat的低维空间的数据
  20. reconMat = (lowDDataMat * redEigVects.T) + meanVals#1000×topNfeat * topNfeat*2 +1000×2重构数据
  21. return lowDDataMat, reconMat
  22. dataMat = loadDataSet("testSet.txt")
  23. lowDMat, reconMat = pca(dataMat, 1)
  24. print shape(dataMat)
  25. print shape(lowDMat)
  26. print shape(reconMat)
  27. fig = plt.figure()
  28. ax = fig.add_subplot(111)
  29. ax.scatter(dataMat[:,0].flatten().A[0], dataMat[:,1].flatten().A[0], marker="^", s=90)
  30. ax.scatter(reconMat[:,0].flatten().A[0], reconMat[:,1].flatten().A[0], marker="o", s=50, c="red")
  31. plt.show()

3、可视化

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注