【问题标题】:PCA with sklearn discrepancies具有 sklearn 差异的 PCA
【发布时间】:2021-02-02 02:56:10
【问题描述】:

我试图在非常特定的上下文中应用 PCA,但遇到了我无法解释的行为。 作为测试,我正在运行以下代码,其中包含您可以在此处检索的文件数据:https://www.dropbox.com/s/vdnvxhmvbnssr34/test.npy?dl=0(numpy 数组格式)。

from sklearn.decomposition import PCA
import numpy as np
test    = np.load('test.npy')
pca     = PCA() 
X_proj  = pca.fit_transform(test)       ### Project in the basis of eigenvectors
proj    = pca.inverse_transform(X_proj) ### Reconstruct vector

我的问题如下:因为我没有指定任何数量的组件,所以我应该在这里使用所有计算的组件进行重构。因此,我希望我的输出 proj 与我的输入 test 相同。但一个快速的情节证明情况并非如此:

plt.figure()
plt.plot(test[0]-proj[0])
plt.show()

此处的图将显示投影和输入矩阵之间的一些较大差异。

有没有人有想法或解释来帮助我理解为什么 proj 在我的情况下与 test 不同?

【问题讨论】:

    标签: scikit-learn pca


    【解决方案1】:

    我检查了你的测试数据,发现如下:

    mean = test.mean() # 1.9545972004854737e+24
    std = test.std() # 9.610595443778275e+26
    

    我将标准偏差解释为在某种意义上表示所报告值的最少计数或不确定性。我的意思是,如果数值算法报告的答案是a,那么真正的答案应该在区间[a - std, a + std] 中。这是因为数值算法本质上是不精确的。它们依赖于浮点运算,显然不能代表实数

    所以如果我绘制:

    plt.plot((test[0]-proj[0])/std)
    plt.show()
    

    我得到了以下看起来更合理的情节。

    您可能也对绘制相对误差感兴趣。或者,您可以将数据标准化为具有 0 均值和 单位 方差,然后 PCA 结果应该更准确。

    【讨论】:

    • 感谢您如此清晰的解释,它实际上帮助我进一步理解了处理有限精度值的复杂性!
    猜你喜欢
    • 2019-03-05
    • 2018-12-20
    • 2019-12-09
    • 2020-07-31
    • 2021-03-24
    • 2017-07-19
    • 1970-01-01
    • 2019-04-03
    • 2016-01-10
    相关资源
    最近更新 更多