h******a 发帖数: 198 | 1 R里PCA的命令是princomp(data, cor=TRUE)。cor=TRUE是用correlation matrix来做
PCA。问题是,我用princomp(data, cor=TRUE)$score得到的principal component和自
己算的差的有点远。不知道哪里错了?附件是data
我自己是这样算的:
data是1256 x 8的matrix,一行是一个observation。用eigen()函数算data的
correlation matrix的单位化正交特征向量,每一列是一个特征向量,按特征值大小排
好序。最后用data * eigen,理论上也应该是component。
code:
score<-princomp(data,cor=TRUE)$scores
cor_pca<-cor(data)
score1<-data%*%eigen(cor_pca)$vectors |
s*****n 发帖数: 2174 | 2 PCA在做之前, 要把矩阵normalize.
princomp里面自动包含了这个过程
你自己用特征值计算之前要自己做.
用 scale() 函数就可以.
【在 h******a 的大作中提到】 : R里PCA的命令是princomp(data, cor=TRUE)。cor=TRUE是用correlation matrix来做 : PCA。问题是,我用princomp(data, cor=TRUE)$score得到的principal component和自 : 己算的差的有点远。不知道哪里错了?附件是data : 我自己是这样算的: : data是1256 x 8的matrix,一行是一个observation。用eigen()函数算data的 : correlation matrix的单位化正交特征向量,每一列是一个特征向量,按特征值大小排 : 好序。最后用data * eigen,理论上也应该是component。 : code: : score<-princomp(data,cor=TRUE)$scores : cor_pca<-cor(data)
|
h******a 发帖数: 198 | 3 但我用的是data的correlation matrix来算特征向量,应该和normalized的结果是一样
的吧? |
s*****n 发帖数: 2174 | 4 对啊, princomp() 就自动为你做了.
可是你自己分解特征值那样算的时候, 也要相应的normalize啊.
【在 h******a 的大作中提到】 : 但我用的是data的correlation matrix来算特征向量,应该和normalized的结果是一样 : 的吧?
|
h******a 发帖数: 198 | 5 我用eigen()的时候 用的是data的correlation matrix来分解 不是covariance矩阵。
不需要normailzed了吧 |
l********s 发帖数: 430 | 6 我记得r里面还有一个prcomp的,和princomp有些不一样。 |
s*****n 发帖数: 2174 | 7 你的eigen()是没问题啊, 可是最后一步和data 相乘的时候, data是没有经过normaliz
ed的.
【在 h******a 的大作中提到】 : 我用eigen()的时候 用的是data的correlation matrix来分解 不是covariance矩阵。 : 不需要normailzed了吧
|
s*****n 发帖数: 2174 | 8 本质是一回事, 一个使用的是eigen value decomposition, 另一个是singular value
decomposition. 两个都可以.
两个对variance的估计, 稍微有点差别.
【在 l********s 的大作中提到】 : 我记得r里面还有一个prcomp的,和princomp有些不一样。
|
h******a 发帖数: 198 | 9 哦 果然如此。。。多谢~~~
不过,实际上我们想要的不应该是原始的data和特征向量相乘的结果吗?
normaliz
【在 s*****n 的大作中提到】 : 你的eigen()是没问题啊, 可是最后一步和data 相乘的时候, data是没有经过normaliz : ed的.
|
s*****n 发帖数: 2174 | 10 PCA本质上就是高维变量空间的一个旋转, 这里包含不同维度之间的加权问题. 根据情况
不同, 你可以选择normalize或者不normalize, 但是要一致. 你把correlation matrix
进行 eigen value decomposition, 表示你认为各个维度是等权重的(normalized), 也
就是说的计算是在一个adjusted scaled空间里面. 但是你乘的data没有经过normalize
还是在原始空间里面. 这两个不能乘在一起.
如果你是直接eigen(cov(data)), 就可以和data乘在一起了, 因为两个都是在原始变量
空间里面. 这等价于princomp(..., cor = F)
不过做PCA, 推荐用prcomp(). 这个是基于SVD的, 要比基于EVD的princomp()精度高. 而
且我觉得prcomp()的输出也要比princomp更clear.
【在 h******a 的大作中提到】 : 哦 果然如此。。。多谢~~~ : 不过,实际上我们想要的不应该是原始的data和特征向量相乘的结果吗? : : normaliz
|
h******a 发帖数: 198 | 11 哦 是这样 我原来以为用correlation matrix是为了结果更robust |
d******e 发帖数: 7844 | 12 Robust是因为数据被Normalized了
【在 h******a 的大作中提到】 : 哦 是这样 我原来以为用correlation matrix是为了结果更robust
|
h******a 发帖数: 198 | |