理解PCA

前言

主成分分析 也就是PCA(Principal Component Analysis),是一种常见的无监督的数据降维算法。它通过分析样本维度之间的相关性,来达到特征选取的目的。本文从理论分析,实际应用,以及代码实现三个角度来理解PCA。
注:本文内容属于个人理解,如有不对的地方,还请交流指正。

理论分析

我们的样本数据好好的,为什么要去做降维?

首先要明白我们为什么做降维。我们常见的机器学习问题中获得的真实的训练数据总是存在各种各样的问题:

  • 数据冗余。
    比如一个大学生的成绩样本,他的“线性代数”的成绩,和他的“矩阵分析”的成绩这两个相关性就很高,分类器只需要其中的一个来判断这个学生是工科生还是文科生。
  • 噪声数据
    在股票金融等实际的机器学习问题中,我们会遇到大量的数据,这些样本数据的维度非常高,同时有大量的干扰性数据。

降维就是通过矩阵变换把高维度的特征映射到低纬度的空间中,去掉其中冗余和噪声的部分,从而得到精简而鲁棒的特征的过程。另外,我们有时候做降维还有一些其他的好处。

  • 降低存储开销
    有些时候,对于一些检索系统,我们需要存储大量的样本特征,因此我们要尽量降低特征的维度。
  • 提高速度
    降低特征维度可以提高我们算法的速度和效率。

总之有很多原因导致我们要去做降维,PCA就是其中一种方法。

PCA如何降维?

我们说了,降维的数学过程是去学习一个变换矩阵,把特征从高维空间映射到低维空间。那么这个矩阵如何学习得到呢?PCA中有以下两点假设:

数据中越是有区分度的维度,他的方差越大,例如我们的信号本身。越是没有区分度的维度,方差越小能量越小,例如噪声;
另外,如果两个维度相关性很高,那么其中一个维度就是冗余的,对于学习分类器没有很大的帮助。

综合以上两点,我们降维之后的数据一定要每个维度的方差大,同时维度之间的相关性小。
如何描述方差和相关性,有一个东西可以同时描述他们两——协方差矩阵!
协方差矩阵是一个方阵,i,j列表示样本的第 i 维和第 j 维之间的相关性 ( i = j 时描述的是第 i 维的方差)。
因此,理想的协方差矩阵的对角线应该是很大的值,而非对角线的位置都接近于0,这样才能保证方差大,相关性小呀!
如果当前样本的协方差矩阵已经是对角矩阵了,那我们就不用做PCA降维了,因为他们的特性已经很好了!很不幸,我们的数据通常都不是那么好,协方差矩阵不是理想的样子,很可能相关性很大。那么很明确,我们要做的就是使得降维之后的数据协方差矩阵是对角矩阵。
那么就要做矩阵对角化呗,什么方法可以得到对角矩阵,这个就是特征值分解,

A = P B P(T) (1)

B就是对角化的矩阵,A是原协方差矩阵,而我们知道B对角线上都是特征值,P里面都是对应的特征向量。如果我们降维之后的协方差矩阵张成B这个样就好了!

说到这里,协方差矩阵的公式还没提呢。

C = S(T) * S / (m - 1); (2)

C是协方差矩阵, S是m * d的样本数据矩阵,代表我们有m个样本,每个样本的维度是d。

那么当前有

A = S(T) * S / (m - 1);(3)

我们想要的是

B = S’(T) * S’ / (m - 1);(4)

S’就是我们降维之后的样本数据。 我们把公式(1) A = P B P(T),变一个样子就是 P(T) A P = B; 结合式子(3),于是乎

B = P(T) A P = P(T) S(T) S P / (m - 1) = (SP)(T) (SP) / (m - 1);再结合式子(4)

SP不就是我们想要的降维之后的数据S’吗?这里,如果把P中的特征向量去掉几个特征值低的,那么不仅选出了方差大的数据,还去除了冗余。因此,PCA就达到了目的了。

总结

所以降维的公式也出来了, S’ = S * P,P是特征值大的维度对应的特征向量。

这是今天看完PCA之后的一点小总结,关于如何做特征值分解,今天也看了许久,感觉要补充的矩阵只是还是很有一些的。

贴一下http://mathfaculty.fullerton.edu/mathews/n2003/QRMethodMod.html 提到的用QR method来做特征值分解的伪代码。

QR Algorithm. The pseudocode for the QR method is:

1.  i = 0  
2.  [Graphics:Images/QRmethodMod_gr_110.gif]    
3.  repeat  
4.       Factor  [Graphics:Images/QRmethodMod_gr_111.gif]  
5.            [Graphics:Images/QRmethodMod_gr_112.gif]
6.            i = i+1  
7.  until convergence 

迭代的方式用QR分解来求特征值。这都是题外话了!

总之,我们需要理解PCA为什么能用协方差矩阵做特征值分解来求解,为什么这样做降维的结果就是好的结果,认真理解了才能更有效地使用它 。