PCA和SVD(转)
最近突然看到一个问题,PCA和SVD有什么关系?隐约记得自己照猫画虎实现的时候PCA的时候明明用到了SVD啊,但SVD(奇异值分解)和PCA的(特征值分解)貌似差得相当远,由此钻下去搜集了一些资料,把我的一些收获总结一下,以免以后再忘记。
PCA的简单推导
PCA有两种通俗易懂的解释,
1)是最大化投影后数据的方差(让数据更分散);地址:http://www.cnblogs.com/shixisheng/p/7107363.html
2)是最小化投影造成的损失。(下边讲的就是这个方法)
这两个思路最后都能推导出同样的结果。
下图应该是对PCA第二种解释展示得最好的一张图片了(ref:svd,pca,relation)
def pca_01(X):
covMat = np.cov(X,rowvar = 0)
eigVal,eigVec = sp.linalg.eig(covMat)
#do reduction with eigVal,eigVec
但因为最后用于变换的矩阵需要是去中心化后的,所以有些地方的实现是:
def pca_02(X):
mean_ = np.mean(X, axis=0)
X = X - mean_
covMat = np.cov(X,rowvar = 0)#实际上是否去中心化对求到的协方差矩阵并无影响,只是方便后面进行降维
eigVal,eigVec = sp.linalg.eig(covMat)
#do reduction with eigVal,eigVec
使用矩阵乘法的方式:
def pca_03(X):
mean_ = np.mean(X, axis=0)
X = X - mean_
M,N=X.shape
Sigma=np.dot(X.transpose(),X)/(M-1)
eigVal,eigVec = sp.linalg.eig(Sigma)
#do reduction with eigVal,eigVec
酉矩阵:n阶复方阵U的n个列向量是U空间的一个标准正交基,则U是酉矩阵(Unitary Matrix)。显然酉矩阵是正交矩阵往复数域上的推广。
def pca_04(X):
mean_ = np.mean(X, axis=0)
X = X - mean_
M,N=X.shape
Sigma=np.dot(X.transpose(),X) #这里直接去掉/(M-1)方便和pca_05比较,对求得特征向量无影响
U,S,V = sp.linalg.svd(Sigma);
eigVal,eigVec = S,U
#do reduction with eigVal,eigVec
可以看到在pca_03的基础上我们把sp.linalg.eig改用了sp.linalg.svd,这涉及到:
结论1:协方差矩阵(或XTX)的奇异值分解结果和特征值分解结果一致。
def pca_05(X):
mean_ = np.mean(X, axis=0)
X = X - mean_
U, S, V = sp.linalg.svd(X)
eigVal,eigVec = S,V
#do reduction with eigVal,eigVec
PCA_04:
eigVal:[ 21.60311815 8.77188185]
eigVec: [[-0.88734696 -0.46110235]
[-0.46110235 0.88734696]] PCA_05:
eigVal:[ 4.64791546 2.96173629]
eigVec: [[ 0.88734696 0.46110235]
[-0.46110235 0.88734696]]
#注意PCA_05结果中特征向量维度的符号,和上面不太一样,但这不影响降维的功能,每一列是一组基
转自:http://blog.csdn.net/dark_scope/article/details/53150883
PCA和SVD(转)的更多相关文章
- 降维方法PCA与SVD的联系与区别
在遇到维度灾难的时候,作为数据处理者们最先想到的降维方法一定是SVD(奇异值分解)和PCA(主成分分析). 两者的原理在各种算法和机器学习的书籍中都有介绍,两者之间也有着某种千丝万缕的联系.本文在简单 ...
- What is an intuitive explanation of the relation between PCA and SVD?
What is an intuitive explanation of the relation between PCA and SVD? 36 FOLLOWERS Last asked: 30 Se ...
- 数据预处理:PCA,SVD,whitening,normalization
数据预处理是为了让算法有更好的表现,whitening.PCA.SVD都是预处理的方式: whitening的目标是让特征向量中的特征之间不相关,PCA的目标是降低特征向量的维度,SVD的目标是提高稀 ...
- 浅谈 PCA与SVD
前言 在用数据对模型进行训练时,通常会遇到维度过高,也就是数据的特征太多的问题,有时特征之间还存在一定的相关性,这时如果还使用原数据训练模型,模型的精度会大大下降,因此要降低数据的维度,同时新数据的特 ...
- 机器学习实战基础(二十三):sklearn中的降维算法PCA和SVD(四) PCA与SVD 之 PCA中的SVD
PCA中的SVD 1 PCA中的SVD哪里来? 细心的小伙伴可能注意到了,svd_solver是奇异值分解器的意思,为什么PCA算法下面会有有关奇异值分解的参数?不是两种算法么?我们之前曾经提到过,P ...
- 机器学习实战基础(二十一):sklearn中的降维算法PCA和SVD(二) PCA与SVD 之 降维究竟是怎样实现
简述 在降维过程中,我们会减少特征的数量,这意味着删除数据,数据量变少则表示模型可以获取的信息会变少,模型的表现可能会因此受影响.同时,在高维数据中,必然有一些特征是不带有有效的信息的(比如噪音),或 ...
- Machine Learning in Action – PCA和SVD
降维技术, 首先举的例子觉得很好,因为不知不觉中天天都在做着降维的工作 对于显示器显示一个图片是通过像素点0,1,比如对于分辨率1024×768的显示器,就需要1024×768个像素点的0,1来表示, ...
- PCA和SVD最佳理解
奇异值分解(SVD)原理与在降维中的应用 https://www.cnblogs.com/pinard/p/6251584.html 最通俗易懂的PCA主成分分析推导 https://blog.csd ...
- 特征向量、特征值以及降维方法(PCA、SVD、LDA)
一.特征向量/特征值 Av = λv 如果把矩阵看作是一个运动,运动的方向叫做特征向量,运动的速度叫做特征值.对于上式,v为A矩阵的特征向量,λ为A矩阵的特征值. 假设:v不是A的速度(方向) 结果如 ...
随机推荐
- 零基础学习hadoop开发所必须具体的三个基础知识
大数据hadoop无疑是当前互联网领域受关注热度最高的词之一,大数据技术的应用正在潜移默化中对我们的生活和工作产生巨大的改变.这种改变给我们的感觉是“水到渠成”,更为让人惊叹的是大数据已经仅仅是互联网 ...
- IntelliJ IDEA常用设置
IntelliJ IDEA进入设置界面. “File”->“Settings”,进入如下界面: 界面主题设置 CTR+鼠标滚动键改变编辑区字体大小.设置鼠标在系统类上指定时间显示注释. 设 ...
- java工具类-excel jxl
jxl-2.6.9.14.jarimport net.sf.jxls.transformer.XLSTransformer;//jxls-core-1.0.2.jarimport java.io.Fi ...
- 转载-java基础学习汇总
共2页: 1 2 下一页 Java制作证书的工具keytool用法总结 孤傲苍狼 2014-06-24 11:03 阅读:25751 评论:3 Java基础学习总结——Java对象的序列化和 ...
- 阿里云启用IPV6
ping过别人的IPv6网址之后,可以确定,局域网是不支持IPv6的.所以要使用隧道技术建立两台机器之间的IPv6连接 1.发现测试用服务器上没有IPv6地址.所以测试服务器的内核应该是没有IPv6模 ...
- pandas的to_csv函数
分隔符 sep : Field delimiter for the output file (default ”,”) dt.to_csv('C:/Users/think/Desktop/Result ...
- 爬虫框架之Scrapy——爬取某招聘信息网站
案例1:爬取内容存储为一个文件 1.建立项目 C:\pythonStudy\ScrapyProject>scrapy startproject tenCent New Scrapy projec ...
- 6.26-EL表达式,JSTL标签
一.EL表达式 功能: 替代jsp中数据访问时的复杂java代码 语法: ${表达式} ${(5+9)*2} 访问顺序: page--->request--->session---> ...
- java的super和this关键字用法总结
------super关键字------ super用途:在子类中访问超类“被隐藏的成员变量(无论是否静态)和静态方法”以及“被重写的实例方法”.这里的超类必须是“直接 ...
- 小朋友学C++(2)
多态 (一) 先编写函数: #include <iostream> using namespace std; class Shape { protected: int width, hei ...