scikit中的特征脸与训练图像不对应

时间:2018-08-22 23:36:36

标签: python

我已经基于一些在线代码编写了一个使用PCA进行特征缩减的小程序,我的源代码如下:

import matplotlib.pyplot as plt
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.datasets import fetch_lfw_people
from sklearn.decomposition import PCA

def main():
    lfw_dataset = fetch_lfw_people(min_faces_per_person=100)
    n_samples, h, w = lfw_dataset.images.shape
    X = lfw_dataset.data
    y = lfw_dataset.target
    target_names = lfw_dataset.target_names
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
    n_components = 100
    pca = PCA(n_components=n_components, whiten=True).fit(X_train)
    X_train_pca = pca.transform(X_train)
    plot(X_train,h,w)
    eigenfaces = pca.components_
    X_train_recover = pca.inverse_transform(X_train_pca)
    plot(eigenfaces,h,w)
    plot(X_train_recover,h,w)

def plot(images,h,w):
    n_row=2
    n_col=5
    plt.figure(figsize=(1.5 * n_col, 2.2 * n_row))
    plt.subplots_adjust(0.6, 0.5, 1.5, 1.5)
    for i in range(n_row * n_col):
        plt.subplot(n_row, n_col, i + 1)
        plt.imshow(images[i].reshape((h, w)), cmap=plt.cm.gray)
    plt.tight_layout()
    plt.show()

if __name__=="__main__":
    main()

我的问题是,当我执行以下代码行时:

eigenfaces = pca.components_
X_train_recover = pca.inverse_transform(X_train_pca)
plot(eigenfaces,h,w)

为什么绘制的图像(特征脸)与训练的图像集或我在inverse_transform之后绘制的图像不对应?如果我们认为应用了PCA,我可以看到原始训练图像和逆变换图像是“相同的”。

据我所知,pca.components_将为我提供n_components x n_features的数组,但看不到与原始图像或转换后图像的关系。

有帮助吗?

0 个答案:

没有答案