【问题标题】:how to show an image after pca?如何在 pca 之后显示图像?
【发布时间】:2020-11-03 14:16:00
【问题描述】:

我有一个 RGB 图像。我想应用 PCA 进行图像压缩,并在应用后查看输出。

这是我尝试做的:

from PIL import Image
import numpy as np
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt

------

def load_image(infilename):
   img = Image.open(infilename)
   img.load()   
   img.show()
   data = np.asarray(img, dtype="int32")
   return data
---------

data = load_image("Image_for_pca.jpg")
r = data[:,:,0]
print("r", r.shape)
g = data[:,:,1]
print("g", g.shape)
b = data[:,:,2]
print("b", b.shape)
concat_matrix_image = np.hstack((np.hstack((r,g)),b))
print("concatMatrixImage", concat_matrix_image.shape)

output of the prints:
r (161, 212)
g (161, 212)
b (161, 212)
concatMatrixImage (161, 636)

# list of dimension
pca_number_of_wanted_dimension = [3 ,5 ,10 ,15 ,20 ,30]
-------
def create_pca_model(number_of_components):
   pca = PCA(n_components=number_of_components)
   return pca
-------
def plot_varience_on_pca(pca):
   plt.plot(np.cumsum(pca.explained_variance_ratio_))
   plt.title("The number of wanted dimension is {}".format(pca.n_components))
   plt.xlabel('number of components')
   plt.ylabel('cumulative explained variance')
   plt.show()
   ------
   def recover_pic(pca, principal_components):
   #Project lower dimension data onto original features
   approximation = pca.inverse_transform(principal_components)    
   approximation = approximation.reshape(-1,161,212)

   # approximation = approximation.astype(np.uint8)
   # print(approximation.shape)
   # img = Image.fromarray(approximation, 'RGB')
   approximation.show()
   -------
   
   for i in pca_number_of_wanted_dimension:
      pca =  create_pca_model(i)
      principal_components = pca.fit_transform(concat_matrix_image)
      print(principal_components.shape)
      recover_pic(pca, principal_components)
      plot_varience_on_pca(pca)

pca.inverse_transform之后如何恢复图片?

【问题讨论】:

    标签: python scikit-learn pca


    【解决方案1】:

    由于我没有你的数据,我必须向你展示如何使用我的数据。

    • 加载数据和显示数据
    from sklearn.datasets import fetch_olivetti_faces
    from sklearn.model_selection import train_test_split
    from matplotlib.pyplot import subplots
    from matplotlib.pyplot import suptitle
    from matplotlib.pyplot import savefig
    from sklearn.decomposition import PCA
    
    
    def display_set(n_row, n_col, x, y_, t, title="Id:{}",
                    fig_size=(6, 3), dpi_=300, f_name="default.png"):
        fig, ax = subplots(n_row, n_col, figsize=fig_size, dpi=dpi_)
        ax = ax.flatten()
    
        for i in range(n_row * n_col):
            ax[i].imshow(X=x[i], cmap='gray')
            ax[i].set_xticks([])
            ax[i].set_yticks([])
            ax[i].set_title(title.format(y_[i]))
        suptitle(t=t)
        savefig(f_name)
    
    
    olivetti = fetch_olivetti_faces()
    
    X = olivetti.images  # Train
    y = olivetti.target  # Labels
    
    x_train, x_test, y_train, y_test = train_test_split(X, y,
                                                        test_size=0.3,
                                                        random_state=42)
    
    train_name = "train_samples.png"
    test_name = "test_samples.png"
    display_set(n_row=2, n_col=10, x=x_train, y_=y_train,
                t="Train-set samples", title="Id:{}", f_name=train_name)
    display_set(n_row=2, n_col=10, x=x_test, y_=y_test,
                t="Test-set samples", title="Id:{}", f_name=test_name)
    

    训练样本的输出:

    测试样本的输出:

    现在让我们创建一个pca 对象

    x_train = x_train.reshape((x_train.shape[0], X.shape[1] * X.shape[2]))
    x_test = x_test.reshape((x_test.shape[0], X.shape[1] * X.shape[2]))
    pca_train = PCA(n_components=100).fit(X=x_train)
    pca_test = PCA(n_components=100).fit(X=x_test)
    eig_num_tr = len(pca_train.components_)
    eig_num_te = len(pca_test.components_)
    # eigen training faces
    eig_tr_faces = pca_train.components_.reshape((eig_num_tr, X.shape[1], X.shape[2]))  
    # eigen test faces
    eig_te_faces = pca_test.components_.reshape((eig_num_te, X.shape[1], X.shape[2]))  
    title_tr = "PCA Applied Train-set samples"
    title_te = "PCA Applied Test-set samples"
    t_ = "Eig. Id:{}"
    
    display_set(n_row=2, n_col=5, x=eig_tr_faces, y_=range(0, eig_num_tr-1), 
                t=title_tr, title=t_, fig_size=(6, 3.2))
    display_set(n_row=2, n_col=5, x=eig_te_faces, y_=range(0, eig_num_te-1), 
                t=title_te, title=t_, fig_size=(6, 3.2))
    

    训练集的输出:

    测试集的输出:

    【讨论】:

    • 这看起来很奇怪 - 你没有使用训练 PCA 而不是测试 PCA ..
    • 但我想分别展示每组的主要成分。那么,你什么时候会使用 train pca 而不是 test pca?答案是当你给脸贴标签的时候。您的分类器从训练图像中学习,然后应用到测试图像以查看分类器的准确性。较高的准确度均值,选择最具辨别力的特征
    猜你喜欢
    • 2016-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-08
    • 1970-01-01
    • 2019-10-07
    • 1970-01-01
    相关资源
    最近更新 更多