Principle Component Analysis
PCA数学推导
PCA的另一个角度
我们从更清楚的角度来看PCA,你就会知道PCA到底在做什么。假设我们考虑的是手写的数字,我们知道这些数字其实是一些basic component所组成的。这些basic component可能就代表笔画。举例来说:人类所手写的数字就是这些basic component所组成的,有斜的直线,横的直线,有比较长的直线,然后还有小圈,大圈等等,这些basic component加起来就可以得到一个数字。这些basic component写做u^1,u^2,...u^5,这些basic component其实就是一个一个的vector。假设我们现在考虑的是mnist,mnist一张image28*28piexl,也就是28 *28维的vector。这些component其实就是28 *28维的vector,把这些vector加起来以后,你所得到的vector就代表了一个diagit。如果把它写成formulation的话就是:x\approx c_1u^1+c_2u^2+....c_ku^k+\bar{x},x代表一张image里面的pixel,x等于c_1u^1component加上c_2u^2这个component,一直加到c_ku^kcomponent,再加上\bar{x},\bar{x}是所有image的平均。所以每一张image就是有一堆component的linear conformation再加上它平均所组成的。
举例来说:7是这三个component加起来的结果,假设7就是x的话,c_1=1,c_2=0,c_3=1,c_4=0,c_5=1,你可以用c_1,c_2,...c_k来表示一张image。假设component比pixel的数目少的话,那么这个描述是比较有效的。7是1倍的u^1,1倍u^2,1倍的u^5所组成的,所以7是一个vector,它的第一维,第三维,第5维是1.
所以现在把\bar{x}移到左边,x减掉所以image的平均等于一堆component linear conformation,这些linear comformation写作\hat{x},那现在假设我们不知道这些component 是什么,不知道u^1到u^k的vector长什么样子。那我们咋样找K vector出来呢?我们要做的事情就是:我们要去找K vector使得\hat{x}跟x-\bar{x}越接近越好,他们的差用reconstruction error来描述。接下来我们要做事情就是:找K 个vector可以minimize这个reconstruction error。
在PCA中我们想说:我们要找一个matrix W,x乘以matrix W就得到了z,把W的每一个row写出来就是[w_1,w_2,...,w_k],x乘上一个[(w_1)^T,(w_2)^T,...(w_k)^T],以此类推。那么说:是[w_1,w_2,...,w_k]是covariance matrix的eigenvector,事实上你要解这个式子L=mi_n(u^1,...u^k)\sum \left \| (x-\bar{x}) -(\sum_{k=1}^{k}c_ku^k)\right \|,找出u^1,...u^k。由PCA找出的这个解w^1,...w^k就是可以让L最小化
我们有一大堆的x,现在假设有一个x_1,这个x_1减去\bar{x}等于u^1乘以component weight,c上标1下标1(下标1代表说:它是u^1的weight,上标1代表说:x^1的u^1component weight),x^1-\bar{x} \approx c^1_1u^1+c^1_2u^2+....
x-\bar{x}是一个vector(把这个vector拿出来),u^1,u^2...是一排vector(把它排起来,排起来就是一个matrix),columns的数目是K个,把这些component weight排成一排变成一个vector,vector乘以matrix变成另一个vector。我们不只是有一笔data,x^2-\bar{x}是另外一个黄色的vector,这个vector(c_1^2,c_2^2,....)乘以matrix u^2等于另一个黄色的vector,依次类推。
那我们把所有的data用这个式子来表示的话,这样就会得到一个matrix,这个matrix的cloumns等于data的数目(你有1万笔data,cloumns=10000)。现在\left\{\begin{matrix} ... &... \\ u^1 & u^2 \\ ...& ... \end{matrix}\right.乘以这个matrix \left\{\begin{matrix} c_1^1 &c_1^2 \\ c_2^1 & c_2^2 \\ ...& ... \end{matrix}\right.跟这个matrix越接近越好,所以你要minimize左边两个matrix跟右边这个matrix之间的差距是会被minimize的,也就是说:用SVD提供给我们的matrix拆解方法,拆成这是三个matrix相乘后,跟左边的matrix是最接近的。
那要咋样来解这个问题呢?加入你有学过大一现代化,你就应该知道该咋样来解(可以参考李宏毅老师现代的课程)。每一个matrix X,你可以用SVD把它拆成一个matrix U(m *k)乘上一个matrix \sum(k *k)乘上matrix V(k *n)。这个matrix U就是matrix\left\{\begin{matrix} ... &... \\ u^1 & u^2 \\ ...& ... \end{matrix}\right.,这个\sumV就是\left\{\begin{matrix} c_1^1 &c_1^2 \\ c_2^1 & c_2^2 \\ ...& ... \end{matrix}\right.。
如果我们今天用SVD将X拆成这三个matrix相乘,那右边三个matrix相乘的结果是最接近左边这个matrix的,那解出来的结果是什么样呢?其中U这个matrix的 K columns其实就是一组orthonormal vector,这组orthonormal vector是XX^T的eigenvector,U总共有K个orthonormal vector,这K 个orthonormal vector对应到XX^T最大的k个eigenvalue的eigenvector。
你会发现,这个XX^T就是covariance matrix,PCA之前找出的W就是covariance matrix的eigenvector。而我们这边说做SVD,解出来U的每个column就是covariance matrix的eigenvector,所以这个U得出的解就是PCA得到的解。所以我们说:PCA做的事情就是:你找出来的那些W其实就是component。
主成分分析和神经网络
我们现在已经知道从PCA找出的(\hat跟x-\bar的差值越小越好,你要minimize reconstruction error。那我们现在已经根据SVD找出这个W了,那这个c_k的值是到底多少呢?这个c_k是每一个image都有自己的c_k,这个c_k就每个image各自找就好。如果现在要用c_1,...c^k对w^k做linear combination。这个c_k=(x-\bar)w^k,找一组c_k可以minimize \hat,(x-\bar)$
linear combinarion做的事情你可以想成用neural network来表示它,假设我们的x-\bar{x}就是一个vector(这边写做三维的vector),假设现在只有2个component(k=2),那我们先算出c_1,c_2,c_1=(x-\bar{x})(x-\bar{x})的每一个component乘上w^1的每一个component,接下来你就得到了c_1。(x-\bar{x}是neural network的input,c_1是一个neural(linear neural ),w^1_1,w^1_2,w^1_3是weight,)。c_1
乘以w^1(c_1乘上w_1的第一维(w_1^1)得到一个value,乘上w_1的第二维(w_2^1)得到一个value,乘上w_1的第三维(w_3^1)得到一个value)。接下来再算一下c_2,c_2乘以w^2的结果和之前的加起来就是最后的output,\hat{x_1},\hat{x_2},\hat{x_3}就是\hat{x}。
接下来就是minimize error,我们要\hat{x}跟x-\bar{x}越接近越好(也就是这个output跟x-\hat{x}越接近越好),那你可以发现说PCA可以表示成一个neural network,这个neural network只有一个hidden layer,这个hidden layer是linear activation function。那现在我们train 这个neural network,是要input一个东西得到output,这个input跟output越接近越好。这个东西就叫做Autoencode
这边就有一个问题,假设我们现在这个weight,不是用PCA的方法去找出w^1,w^2,...w^k。而是兜一个neural network,我们要minimize error,然后用Gradient Descent去train得到的weight,那就觉得你得到的结果会跟PCA得到的结果一样吗?这其实是会一样的(neural network没有办法保证是垂直的,你会得到另外一组解)。所以在linear的情况下,或许你就想要用PCA来找这个W比较快的,你用neural network是比较麻烦的。但是用neural network的好处是:可以deep。