PCA用SVD来实现

来源:互联网 发布:综合素质答题技巧知乎 编辑:程序博客网 时间:2024/05/06 14:33

SVD(奇异值分解)是线性代数中一个常见的decomposition;PCA也是dimension reduction领域中的经典之作。初学者在学习PCA的时候可能会对PCA的算法步骤有那么一些“繁琐”的感觉。结合svd分解,会让你在编写PCA算法的时候达到一种什么样的得心应手的程度呢?且听说慢慢道来    先简单描述一下PCA的算法步骤(当然,你要对PCA有所理解啦,不甚理解也行,仅从程序员的角度一步一步地编代码也能实现)。步骤如下: Image:Pca.jpg

在compute eigvector这一步后,选择eigvectors中的前k个作为主成分。如果用SVD来做,又怎么样呢?
step1: X = [X1; X2; ..... Xi], each Xj is a row data point;
step2: Substract the mean from X
step3: Solve SVD decomposition: X = U*S*V'(V'是V的转置)
step4: 选择要降的维数k, 取V的前k个column作为主成分。

看到没有,一个SVD分解就把主成分取出来了,很方便吧。现在在回过头来想想,为什么可以这么做呢?
记忆一下线性代数中的特征值和特征向量的定义: 

Ax = bx, b是特征值,x是特征向量..........(1)

若在A中每一个data point是一个row的话,那么要求A的主要成分,根据PCA算法,就是要求出A'A这个矩阵的特征向量的前 k个column(注意这些特征向量是按对应的特征值的从大到小排列的)。又根据svd分解有: 

A = U*S*V';    而 (A'*A)*V = (U*S*V')' * (U*S*V') * V            = V*S'*U' * (U*S*V')*V            = V*S'*(U'*U)*S* (V'*V)            = V*(S'*S)*E*E (E是单位矩阵)            = (S的平方)*V (S在对角线上才有值,其余全为0)....(2)

对照(1)(2)式我们可以看到,A的SVD分解出来的V就是(A'*A)这个矩阵的特征向量!所以PCA算法中我们不需要计算扩散矩阵(A'*A),对A进行SVD分解,得到V,取V的前k个columns即可。

原创粉丝点击