使用sklearn提取PCA组件

Miq*_*uel 2 python pca scikit-learn

我正在使用sklearn的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
Run Code Online (Sandbox Code Playgroud)

换句话说,我在PCA空间中创建了一个图像,该图像除了1设置为0之外,还具有所有功能。通过逆变换它们,我应该在原始空间中获得图像,一旦转换,就可以用该PCA组件单独表达该图像。 。

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

我的方法有概念上的问题吗?显然,这些组件pca.components_[i]比我得到的组件正确(或至少更正确)。谢谢!

左:计算出的分量,右:实数分量

Phi*_*oso 6

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

#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
Run Code Online (Sandbox Code Playgroud)

因此,您要对原始数据而非组件进行逆变换,因此它们是完全不同的。您几乎永远不会对原始数据进行inverse_transform转换。pca.components_是代表用于将数据投影到pca空间的基础轴的实际矢量。


Fre*_*Foo 5

components_抓取单位矩阵和对单位矩阵进行操作之间的区别inverse_transform在于后者添加了每个特征的经验平均值。IE:

def inverse_transform(self, X):
    return np.dot(X, self.components_) + self.mean_
Run Code Online (Sandbox Code Playgroud)

其中self.mean_是根据训练集估计的。