我在matlab和python中生成相同的矩阵:
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
然后我分别应用pca来获取主成分系数。
Matlab代码:
X = reshape([1:25], 5, 5);
X = X'
[cofe, S, latent] = pca(X)
结果:
cofe =
0.4472 0.8944 0 0
0.4472 -0.2236 0.8660 -0.0000
0.4472 -0.2236 -0.2887 0.8165
0.4472 -0.2236 -0.2887 -0.4082
0.4472 -0.2236 -0.2887 -0.4082
Python代码:
from sklearn.decomposition import PCA
import numpy as np
pca = PCA()
A = np.array(range(1, 26), dtype=float).reshape([5, 5])
print(A)
pca.fit(A)
print(np.transpose(pca.components_))
结果:
[[-0.4472136 0. 0. 0. 0.89442719]
[-0.4472136 -0.5 -0.5 -0.5 -0.2236068 ]
[-0.4472136 0.83333333 -0.16666667 -0.16666667 -0.2236068 ]
[-0.4472136 -0.16666667 0.83333333 -0.16666667 -0.2236068 ]
[-0.4472136 -0.16666667 -0.16666667 0.83333333 -0.2236068 ]]
两列的结果相同,但其他列则完全不同。然后我尝试对python代码的结果进行归一化,因为我看到matlab的结果被归一化了,但是结果仍然存在。
有人可以告诉我为什么他们与众不同吗?
答案 0 :(得分:4)
相同与否无关紧要,它们为“零”。它们的特征值是零。由于有了矩阵,您可以用单个主成分来准确描述100%的全部数据,因此以下主成分仅仅是噪声。
通过查看矩阵可以看出这一点(它的所有行都是线性相关的,没有一行是独立的),但是更容易使用MATLAB的内置功能。
[cofe, S, latent,~,explained,~] = pca(X)
explained =
100.0000
0.0000
0.0000
0.0000
第一个PCA是数据的100%,随后的PCA是数据的0%。如果它们是数据的0%,则它们的值无关紧要。