我正在尝试使用scikit库(尤其是sklearn.decomposition和sklearn.preprocessing)学习Python中PCA分析的基础。目标是将图像中的数据导入矩阵X(每行是一个样本,每列是一个要素),然后标准化X,使用PCA提取主要成分(2个最重要,6个最重要.... 6少重要),将X投影在这些主成分上,逆转先前的转换并绘制结果以查看相对于原始图像的差异。
现在让我们说我不想考虑2,3,4 ...最重要的主成分,但我想考虑N个不那么相关的成分,比如说N = 6。
应如何进行分析? 我的意思是我不能简单地进行标准化,然后调用PCA()。fit_transform,然后使用inverse_transform()还原以绘制结果。
此刻我正在做这样的事情:
X_std = StandardScaler().fit_transform(X) # standardize original data
pca = PCA()
model = pca.fit(X_std) # create model with all components
Xprime = model.components_[range(dim-6, dim, 1),:] # get last 6 PC
然后我停了下来,因为我知道我应该调用transform(),但是我不知道该怎么做...我尝试了几次却没有成功。
是否有人可以告诉我以前的步骤是否正确并指出要遵循的方向?
非常感谢您
编辑:目前,我已根据问题的第一个答案建议采用了该解决方案:
model = PCA().fit(X_std)
model2pc = model
model2pc.components_[range(2, img_count, 1), :] = 0
Xp_2pc = model2pc.transform(X_std)
Xr_2pc = model2pc.inverse_transform(Xp_2pc)
然后我对6个,60个,最后6个进行相同的操作。我注意到的是,这非常耗时。我想得到一个直接提取我需要的主要成分的模型(而不将其他成分归零),然后对该模型执行那个transform()和inverse_transform()。
答案 0 :(得分:0)
如果您想忽略除最后6个主要成分以外的所有成分,可以将不需要保留的成分归零。
N = 6
X_std = StandardScaler().fit_transform(X)
pca = PCA()
model = pca.fit(X_std) # create model with all components
model.components_[:-N] = 0
然后,要从数据中删除除最后N
个组件之外的所有组件,只需对数据进行正向和逆向变换即可:
Xprime = model.inverse_transform(model.transform(X_std))
这里是一个例子:
>>> X = np.random.rand(18).reshape(6, 3)
>>> model = PCA().fit(X)
往返转换应返回原始数据:
>>> X
array([[0.16594796, 0.02366958, 0.8403745 ],
[0.25219425, 0.22879029, 0.07950927],
[0.69636084, 0.4410933 , 0.97431828],
[0.50121079, 0.44835563, 0.95236146],
[0.6793044 , 0.53847562, 0.27882302],
[0.32886931, 0.0643043 , 0.10597973]])
>>> model.inverse_transform(model.transform(X))
array([[0.16594796, 0.02366958, 0.8403745 ],
[0.25219425, 0.22879029, 0.07950927],
[0.69636084, 0.4410933 , 0.97431828],
[0.50121079, 0.44835563, 0.95236146],
[0.6793044 , 0.53847562, 0.27882302],
[0.32886931, 0.0643043 , 0.10597973]])
现在将第一个主要成分归零:
>>> model.components_
array([[ 0.22969899, 0.21209762, 0.94986998],
[-0.67830467, -0.66500728, 0.31251894],
[ 0.69795497, -0.71608653, -0.0088847 ]])
>>> model.components_[:-2] = 0
>>> model.components_
array([[ 0. , 0. , 0. ],
[-0.67830467, -0.66500728, 0.31251894],
[ 0.69795497, -0.71608653, -0.0088847 ]])
自从我们删除了第一个主成分(其中包含最大的方差)以来,往返变换现在给出了不同的结果:
>>> model.inverse_transform(model.transform(X))
array([[ 0.12742811, -0.01189858, 0.68108405],
[ 0.36513945, 0.33308073, 0.54656949],
[ 0.58029482, 0.33392119, 0.49435263],
[ 0.39987803, 0.35478779, 0.53332196],
[ 0.71114004, 0.56787176, 0.41047233],
[ 0.44000711, 0.16692583, 0.56556581]])