如何解决指定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 举报,一经查实,本站将立刻删除。