指定n_components时scikit学习PCA的差异

问题描述

我有一些运行PCA的数据X。我想返回所有主要组件,然后在检查后选择前几个组件,而不是先验选择。我只是用scikit-learn的PCA转换X,然后在转换后仅用X[:,:n_components]来实现选择。但是,我发现我的数据有些奇怪。我尝试在一个伪造的示例中重现该问题,但它运行得很好:

import numpy as np
from sklearn.decomposition import PCA

n_components = 4

X1 = np.random.normal(0,1,(500,30))
X2 = X1.copy()

assert np.allclose( X1,X2 )

pca1,pca2 = PCA(),PCA(n_components=n_components)

X1 = pca1.fit_transform(X1)
X2 = pca2.fit_transform(X2)

assert np.allclose(X1[:,:n_components],X2)

使用相同的过程,仅使用我自己的数据,我得到以下信息:

X1 = X.copy()
X2 = X.copy()

assert np.allclose(X1,X2)

np.set_printoptions(suppress=True)

if configs['pca']['run']:
    pca1 = PCA(**configs['pca']['parameters'])
    pca2 = PCA(random_state=0)
    X1 = pca1.fit_transform(X1)
    X2 = pca2.fit_transform(X2)

print("X1:\n",X1[:3])
print("X2:\n",X2[:3,:configs['pca']['parameters']['n_components']])
    
assert np.allclose(X1,X2[:,:configs['pca']['parameters']['n_components']])

输出为:

X1:
 [[ 0.37486351 -0.19900685  0.1427147  -0.26709366 -0.15067396  0.01981867]
 [ 0.37461979  0.47905469  0.04657452 -0.08894677  0.27989207 -0.03185509]
 [-0.34283884  0.40882146 -0.05911666 -0.04694395 -0.02077442 -0.14203045]]
X2:
 [[ 0.37486351 -0.19900684  0.14271459 -0.26709352 -0.15067327  0.01981888]
 [ 0.37461979  0.47905469  0.04657449 -0.08894674  0.27989226 -0.03185508]
 [-0.34283884  0.40882146 -0.05911665 -0.04694396 -0.02077448 -0.14203045]]
Traceback (most recent call last):

  File "C:\Users\L\Documents\Projects\Accelogress\clustering\run\clustering.py",line 141,in <module>
    assert np.allclose(X1,:configs['pca']['parameters']['n_components']])

AssertionError

在我看来,这只是四舍五入的错误,但我想知道为什么在练习数据上不会出现这种情况?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)