使用sklearn提取PCA组件

时间:2014-03-02 11:00:17

标签: python scikit-learn pca

我正在使用sklearn's PCA来减少对大量图像的降维。一旦安装了PCA,我想看看组件的外观。

可以通过查看components_属性来实现。没有意识到这一点,我做了别的事情:

each_component = np.eye(total_components)
component_im_array = pca.inverse_transform(each_component)

for i in range(num_components):
   component_im = component_im_array[i, :].reshape(height, width)
   # do something with component_im

换句话说,我在PCA空间中创建了一个具有所有特征但是设置为0的图像。通过逆变换它们,我应该在原始空间中获取图像,一旦转换,就可以用PCA组件。

下图显示了结果。左边是使用我的方法计算的组件。右边是pca.components_[i]直接。此外,使用我的方法,大多数图像非常相似(但它们 不同),而通过访问components_图像与我预期的非常不同

我的方法中存在概念问题吗?很明显,pca.components_[i]中的组件是正确的(或至少更正确),而不是我得到的组件。谢谢!

left: calculated component, right: real component

2 个答案:

答案 0 :(得分:5)

组件和逆变换是两回事。逆变换将组件映射回原始图像空间

#Create a PCA model with two principal components
pca = PCA(2)
pca.fit(data)
#Get the components from transforming the original data.
scores = pca.transform(data)
# Reconstruct from the 2 dimensional scores 
reconstruct = pca.inverse_transform(scores )
#The residual is the amount not explained by the first two components
residual=data-reconstruct

因此,您是对原始数据而不是组件进行逆变换,因此它们完全不同。你几乎从不反向转换原始数据。 pca.components_是表示用于将数据投影到pca空间的基础轴的实际向量。

答案 1 :(得分:3)

在单位矩阵上抓取components_和执行inverse_transform之间的区别在于后者增加了每个要素的经验均值。即:

def inverse_transform(self, X):
    return np.dot(X, self.components_) + self.mean_

从培训集中估算self.mean_