【问题标题】:Different result of PCA using python's sklearn and matlab's pca使用 python 的 sklearn 和 matlab 的 pca 的 PCA 的不同结果
【发布时间】:2018-08-15 08:08:56
【问题描述】:

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

谁能告诉我他们为什么不一样?

【问题讨论】:

    标签: python matlab pca


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-09
      • 2014-01-08
      • 2017-07-19
      • 1970-01-01
      • 2018-09-24
      • 2019-04-03
      • 2021-05-08
      • 1970-01-01
      相关资源
      最近更新 更多