我试图在非常具体的上下文中应用 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 不同吗?
最佳答案
我检查了您的测试数据,发现以下内容:
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 结果应该会更加准确。
关于scikit-learn - PCA 与 sklearn 差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64425522/