原理介绍:
PCA (Principal Component Analysis),可以算无监督学习的一种。我觉得理解了还算是简单的。PCA主要做的事抽取重要的特征,放弃细节。这样做的目的是为下一步的机器学习做准备。比如一张脸原来是32*32 = 1024的,通过PCA转换成10*10 = 100的向量,这对大量数据来说,是非常可观的。 可以提高计算效率。
那么PCA是以什么标准衡量哪些特征是重要的呢?可以看看这个资料,但我觉得这个有点不直观,不过步骤很清晰。直观的解释还是从Coursera上得到的。这个解释,我觉得很可以接受。
比如,现在有m组数据,维度为n,。然后要找另一组基
,将m组数据投影到
空间,
,使下式值最小。就是Frobenius_norm最小。
这就是要满足的条件,看看这个条件好像似曾相识啊,本来我还在想怎么证明后面的结论,后来发现这原来就是Eckart-Young Theorem。所以结论就有了,取最大的p个特征值对应的向量。而且这个最小值,就是余下的特征值之和。
然后就可以计算,而
。为什么这样就是恢复出来的数据呢,可不是下标对上就ok的。回想一下,线性变换和变换矩阵。可以这样想,
代表的是一个子空间,然后
就是在
中的投影,然后
,则把对应X空间的相应坐标还原。。坑爹我讲不清。可以用先用一维的X做做实验,就明白这个过程了。
小试牛刀:
所以至此,原理已经解决。可以看看PCA的运用情况。首先是玩玩。下面左图是原始数据,绿线就是求出的特征向量方向。一共有两根,长的那根就是主向量。应用PCA处理后得到有图,可以看到这些数据的协方差很小,基本不相关。这也是PCA的另一个解释。
人脸特征:
人脸的数据也是从Coursera上的Ng的课程中获得的。一共5000个数据,每个32*32。根据Ng的说法,应用PCA之前,要先对数据预处理,即中心化和”归一化”,大概可能会影响特征值的大小,我没有深入了解为什么这么做。反正我照做了。下图即为PCA处理之后的结果。几乎看不出特征损失,但确实很多细节没有了。具体代码和数据github。


人脸向量:
PCA不是有向量吗?上面也是取了前一百个向量来表示投影人脸数据。想象一下,这一百个向量,都是1024维的,代表的也是原空间的一组向量,可以说,这些向量可能就是一张脸。然后每张脸可以投影过去,再投影回来。所以就画画看这一百个向量长什么样。如下,果然就是人脸的特征。神奇!

注意事项:
PCA有个前提,就是数据能在线性空间中表示。像以下的数据是不能直接使用PCA的,要用Kernel PCA。Kernel还是有点难理解的,下次搞明白了单独谈。PCA还有probability pca,蛋碎。

