把W矩阵中的每一行看作一个方向,第一行代表最重要的方向,第二行代表次重要的方向,依次类推
也可以说:
将W矩阵中的每一行看作一个样本,第一行所代表的样本是最重要的样本,最能反应原X矩阵样本特征的样本。第二行所代表的样本是次重要的样本,依次类推。

X中的每一行都是一张人脸,W中的每一行也可以认为是一张脸,称为特征脸。每一个特征脸都是一个主成分,相当于表达了原样本数据的特征。(特征这个词与矩阵中的特征值这个词相对应)

取数据

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_lfw_people

faces = fetch_lfw_people()
random_indexes = np.random.permutation(len(faces.data))
X = faces.data[random_indexes]

查看图像:

def plot_faces(faces):
    #fig, axes = plt.subplots(6, 6, figsize=(10, 10), subplot_kw={'xticks':[], 'yticks':[]},girdspec_kw=dict(hspace=0.1, wspace=0.1))
    fig, axes = plt.subplots(10, 10, figsize=(10, 10), subplot_kw={'xticks':[], 'yticks':[]})
    for i,ax in enumerate(axes.flat):
        ax.imshow(data[i].reshape(62, 47), cmap='bone')
    plt.show()

plot_faces(example_faces)

特征脸

from sklearn.decomposition import PCA
pca = PCA(svd_solver="randomized")  #因为数据样本比较大,用随机的方式会快一些

%timeit pca.fit(X)

plot_faces(pca.components_[:36, :])

其它关于样本库

faces2 = fetch_lfw_people(min_faces_per_person=60) # 取一个人至少有60张照片的样本