Principal component analysis

原理介绍:

       PCA (Principal Component Analysis),可以算无监督学习的一种。我觉得理解了还算是简单的。PCA主要做的事抽取重要的特征,放弃细节。这样做的目的是为下一步的机器学习做准备。比如一张脸原来是32*32 = 1024的,通过PCA转换成10*10 = 100的向量,这对大量数据来说,是非常可观的。 可以提高计算效率。

        那么PCA是以什么标准衡量哪些特征是重要的呢?可以看看这个资料,但我觉得这个有点不直观,不过步骤很清晰。直观的解释还是从Coursera上得到的。这个解释,我觉得很可以接受。

       比如,现在有m组数据,维度为n,X_{m,n}。然后要找另一组基U_{n,p},将m组数据投影到U_{n,p}空间,Xreduce_{m,p} = X_{m,n}*U_{n,p},使下式值最小。就是Frobenius_norm最小。

    \[\sum\limits_i\sum\limits_j (X_{i,j}-(Xreduce_{m,p} * U_{n,p}^T) _{i,j})^2\]

        这就是要满足的条件,看看这个条件好像似曾相识啊,本来我还在想怎么证明后面的结论,后来发现这原来就是Eckart-Young Theorem。所以结论就有了,取最大的p个特征值对应的向量。而且这个最小值,就是余下的特征值之和。

    \begin{align*} &X^T*X = U\LambdaU^T \\ &U_{n,p} = U(:,1:p) \end{align*}

        然后就可以计算Xreduce_{m,p} = X_{m,n}*U_{n,p},而Xrecover_{m,n} = Xreduce_{m,p}*U_{n,p}^T。为什么这样就是恢复出来的数据呢,可不是下标对上就ok的。回想一下,线性变换变换矩阵。可以这样想,U_{n,p}代表的是一个子空间,然后Xreduce_{m,p} = X_{m,n}*U_{n,p}就是在U_{n,p}中的投影,然后Xreduce_{m,p} = X_{m,n}*U_{n,p},则把对应X空间的相应坐标还原。。坑爹我讲不清。可以用先用一维的X做做实验,就明白这个过程了。

小试牛刀:

        所以至此,原理已经解决。可以看看PCA的运用情况。首先是玩玩。下面左图是原始数据,绿线就是求出的特征向量方向。一共有两根,长的那根就是主向量。应用PCA处理后得到有图,可以看到这些数据的协方差很小,基本不相关。这也是PCA的另一个解释。

origin cov

人脸特征:

        人脸的数据也是从Coursera上的Ng的课程中获得的。一共5000个数据,每个32*32。根据Ng的说法,应用PCA之前,要先对数据预处理,即中心化和”归一化”,大概可能会影响特征值的大小,我没有深入了解为什么这么做。反正我照做了。下图即为PCA处理之后的结果。几乎看不出特征损失,但确实很多细节没有了。具体代码和数据github

recoverface
Recovered Face
originface
Origin Face

人脸向量:

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

principalface
First 36 Vectors

注意事项:

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

Kernel_pca_input
Input points before kernel PCA From:Wikipedia
734px-Kernel_pca_output_gaussian
After Gaussian kernel PCA From:Wikipedia