PCA用SVD来实现
来源:互联网 发布:综合素质答题技巧知乎 编辑:程序博客网 时间:2024/05/06 14:33
SVD(奇异值分解)是线性代数中一个常见的decomposition;PCA也是dimension reduction领域中的经典之作。初学者在学习PCA的时候可能会对PCA的算法步骤有那么一些“繁琐”的感觉。结合svd分解,会让你在编写PCA算法的时候达到一种什么样的得心应手的程度呢?且听说慢慢道来 先简单描述一下PCA的算法步骤(当然,你要对PCA有所理解啦,不甚理解也行,仅从程序员的角度一步一步地编代码也能实现)。步骤如下:
在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即可。
- PCA用SVD来实现
- PCA用SVD来实现
- SVD & PCA
- PCA,SVD
- matlab PCA-SVD简单地实现特征脸方法(Eigenface)
- PCA与SVD
- SVD和PCA
- SVD分解与PCA
- SVD与PCA
- PCA SVD LDA
- SVD and PCA
- PCA and SVD
- SVD、PCA小结
- SVD分解和PCA
- PCA 和 SVD
- PCA使用SVD解决
- pca-svd-vriance-covirance
- 理解PCA和SVD
- 并发学习之:多线程编程中条件变量和虚假唤醒的讨论
- 提升Android应用视觉效果的10个UI设计技巧
- Windows下编译Qt的Mysql驱动(详细测试可用)
- JAVA程序员面试32问
- How to dig more bugs
- PCA用SVD来实现
- 在自定义ViewGroup时学习MeasureSpec的使用
- ios6 状态栏高度为0的问题记录
- C#中属性 get和set访问器
- 'VB 中将信息写入到XML中,并从后台用ajax+jquery 取出信息
- 为什么软件程序员的价值总是被严重的低估
- Web security testing
- tesseract-ocr3.02字符识别过程操作步骤
- MYSQL 获取当前日期及日期格式