svd=singular value decomposition
pca=principal component analysis
在做潜在语义分析(lsa)的时候,我用的svd,感觉svd和pca非常像,但是又有区别。所以查了一些资料,在这里翻译一下,并在最后,贴上python代码比较了这两种方法。
PCA
假设\( \mathbf X \)
是一个\( n \times p \)
的矩阵,n
是样本量, 而p
是变量个数。那么,我们就可以计算得到协方差矩阵\( \Singma \)
:
\[ \Sigma=X^TX/(n-1) \]
由于\( \Sigma \)
是对称矩阵,那么它可以对角化:
\[ \Sigma = \mathbf V \mathbf L \mathbf V^\top \]
\( \mathbf V \)
就是\( \mathbf X \)
的特征向量构成的矩阵,而\( \mathbf L \)
是一个对角矩阵,对角元素就是特征向量对应的特征值。
用\( \mathbf Y \)
表示主成分矩阵,\( y_i \)
表示第i个主成分向量。用\( v_i \)
表示第i个特征向量。那么有关系式:
\[ y_i= \mathbf X v_i\]
即:
\[ Y= \mathbf X \mathbf V \]
SVD
接下来我们看看SVD的性质。对\( \mathbf X \)
进行SVD分解:
\[ \mathbf X = \mathbf U \mathbf S \mathbf V^\top \]
\( \mathbf V \)
和上面提到的\( \mathbf V \)
是一样的,但是在SVD中叫做singular vector(奇异向量),而\( \mathbf S \)
叫做奇异值构成的对角矩阵, 它与特征向量是不同的,但是他们之间是成比例的。如此,我们很容易得到:
\[ \mathbf X = \mathbf V \mathbf S \mathbf U^\top \mathbf U \mathbf S \mathbf V^\top /(n-1) = \mathbf V \frac{\mathbf S^2}{n-1}\mathbf V^\top \]
所以,特征值与奇异值之间的关系就是:
\[ \lambda_i = s_i^2/(n-1) \]
主成分也可以得到:
\[ \mathbf X \mathbf V = \mathbf U \mathbf S \mathbf V^\top \mathbf V = \mathbf U \mathbf S \]
下面我们通过python代码来探索svd和pca之间的关系
1 | import numpy as np |