简体   繁体   English

如何在 PCA 之后从 Python 中的第一个分量重建图像?

[英]How to reconstruct image from first component in Python after PCA?

How to reconstruct image from first component in Python after PCA?如何在 PCA 之后从 Python 中的第一个分量重建图像?

My attempt:我的尝试:

from sklearn.datasets import load_sample_image
from sklearn.feature_extraction import image
from sklearn.decomposition import PCA
# Create patches of size 25 by 25 and create a matrix from all patches
patches = image.extract_patches_2d(grayscale_image, (25, 25), random_state = 42)
#reshape patches
patches_reshaped = patches.reshape(patches.shape[0],-1)
# PCA
pca = PCA(n_components = 3,random_state = 42)
pca.fit(patches_reshaped)
first_component = pca.components_[0] #first component
# attempt to reconstruct image from first component
plt.imshow(pca.components_[0].reshape(25, 25),"gray")

You have passed n_components = 3 to PCA , meaning you will have three principal components.您已将n_components = 3传递给PCA ,这意味着您将拥有三个主要组件。 So when you do,所以当你这样做时,

projected = pca.fit_transform(patches_reshaped.data)

You will get your data projected in three 3 principal axes, meaning your output will be of shape (patches.shape[0], 3) .您将在三个 3 主轴上投影数据,这意味着您的 output 将具有形状(patches.shape[0], 3)

Now to reconstruct using the first principal component, what you have to do is get the projection of your data on this princpical axis and do an inverse transform to your original domain.现在要使用第一个主成分进行重构,您需要做的是在该主轴上投影数据并对原始域进行逆变换。 To do this, first get the first principal component:为此,首先获取第一个主成分:

# First get your first component
first_component = pca.components_[0]
# Make sure your first component is a row vector
first_component = first_component.reshape(1,-1) 

Then, The inverse transform is nothing but projected_data * principal_components .然后,逆变换只不过是projected_data * principal_components For more details you can look into the documentation here and the source code here .有关更多详细信息,您可以查看此处的文档和此处的源代码。

# get the first projection 
first_proj = projected[:,0]
# Make sure your first component is a column vector
first_proj = first_proj.reshape(-1,1)
# do inverse transform (No you have to add the mean as thse algorithm 
# works on zero mean data) 
recon_using_first_comp = np.dot(proj, first_component) + pca.mean_

Then reconstruct the patches to get your final image然后重建补丁以获得最终图像

final_img = image.reconstruct_from_patches_2d(recon_using_first_comp.reshape(-1,25,25), grayscale_image.shape)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM