使用python的sklearn和matlab的pca的PCA结果不同

时间:2018-08-15 08:08:57

标签: python matlab pca

我在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的结果被归一化了,但是结果仍然存在。

有人可以告诉我为什么他们与众不同吗?

1 个答案:

答案 0 :(得分:4)

相同与否无关紧要,它们为“零”。它们的特征值是零。由于有了矩阵,您可以用单个主成分来准确描述100%的全部数据,因此以下主成分仅仅是噪声。

通过查看矩阵可以看出这一点(它的所有行都是线性相关的,没有一行是独立的),但是更容易使用MATLAB的内置功能。

[cofe, S, latent,~,explained,~] = pca(X)

explained =

  100.0000
    0.0000
    0.0000
    0.0000

第一个PCA是数据的100%,随后的PCA是数据的0%。如果它们是数据的0%,则它们的值无关紧要。