【问题标题】:numpy and sklearn PCA return different covariance vectornumpy 和 sklearn PCA 返回不同的协方差向量
【发布时间】:2016-01-10 08:21:20
【问题描述】:

尝试彻底学习 PCA,但有趣的是,当我使用 numpy 和 sklearn 时,我得到了不同的协方差矩阵结果。

numpy 结果与此解释性文本here 匹配,但 sklearn 结果与两者不同。

有什么理由会这样吗?

d = pd.read_csv("example.txt", header=None, sep = " ")
print(d)
      0     1
0  0.69  0.49
1 -1.31 -1.21
2  0.39  0.99
3  0.09  0.29
4  1.29  1.09
5  0.49  0.79
6  0.19 -0.31
7 -0.81 -0.81
8 -0.31 -0.31
9 -0.71 -1.01

Numpy 结果

print(np.cov(d, rowvar = 0))
[[ 0.61655556  0.61544444]
 [ 0.61544444  0.71655556]]

sklearn 结果

from sklearn.decomposition import PCA
clf = PCA()
clf.fit(d.values)
print(clf.get_covariance())

[[ 0.5549  0.5539]
 [ 0.5539  0.6449]]

【问题讨论】:

  • 这不应该影响协方差。同样在此示例中,数据已经居中。

标签: python numpy scikit-learn


【解决方案1】:

因为对于np.cov

默认归一化是 (N - 1),其中 N 是给定的观察数(无偏估计)。如果bias为1,则归一化为N。

设置bias=1,结果和PCA一样:

In [9]: np.cov(df, rowvar=0, bias=1)
Out[9]:
array([[ 0.5549,  0.5539],
       [ 0.5539,  0.6449]])

【讨论】:

    【解决方案2】:

    所以我遇到了同样的问题,我认为它返回不同的值,因为协方差的计算方式不同。根据sklearn documentationget_covariance()方法利用噪声方差得到协方差矩阵。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-28
      • 2014-01-08
      • 2019-12-09
      • 2017-03-16
      • 1970-01-01
      • 1970-01-01
      • 2019-03-05
      • 1970-01-01
      相关资源
      最近更新 更多