PCA对于将许多维度减少为一组较小的维度非常有用,因为人类无法在三维以上对数据进行可视化,所以将多维数据集缩减为二维或三维并绘制图形以便更好地理解数据。
在这里我将解释如何使用PCA从剑桥AT&T实验室获取人脸数据集的特征向量。
首先必须下载数据集:
!wget http://www.cl.cam.ac.uk/Research/DTG/attarchive/pub/data/att_faces.zip -O att_faces.zip
!unzip att_faces.zip
阅读其中一个图像以确保数据已下载:
import numpy as np
from scipy.misc import imread
import matplotlib.pyplot as plt
img = imread(‘s1/1.pgm’)
img = img.astype(np.uint8)
img = img / 255
plt.imshow(img,cmap=’gray’)
阅读所有面并打印10行作为示例,了解如何从Pandas DataFrame中读取它们:
from glob import iglob
faces = pd.DataFrame([])
for path in iglob(‘*/*.pgm’):
img=imread(path)
face = pd.Series(img.flatten(),name=path)
faces = faces.append(face)
fig, axes = plt.subplots(10,10,figsize=(9,9),
subplot_kw={‘xticks’:[], ‘yticks’:[]},
gridspec_kw=dict(hspace=0.01, wspace=0.01))
for i, ax in enumerate(axes.flat):
ax.imshow(faces.iloc[i].values.reshape(112,92),cmap=”gray”)
这就是在图像上做PCA的魔力:
from sklearn.decomposition import PCA
#n_components=0.80 means it will return the Eigenvectors that have the 80% of the variation in the dataset
faces_pca = PCA(n_components=0.8)
faces_pca.fit(faces)
fig, axes = plt.subplots(2,10,figsize=(9,3),
subplot_kw={‘xticks’:[], ‘yticks’:[]},
gridspec_kw=dict(hspace=0.01, wspace=0.01))
for i, ax in enumerate(axes.flat):
ax.imshow(faces_pca.components_[i].reshape(112,92),cmap=”gray”)
使用这些特征向量,可以通过执行PCA对象的变换来获取特征向量,然后对特征向量进行inverse_transform来获取所有原始图像,从而重新绘制数据集中的任意面:
components = faces_pca.transform(faces)
projected = faces_pca.inverse_transform(components)
fig, axes = plt.subplots(10,10,figsize=(9,9), subplot_kw={'xticks':[], 'yticks':[]},
gridspec_kw=dict(hspace=0.01, wspace=0.01))
for i, ax in enumerate(axes.flat):
ax.imshow(projected[i].reshape(112,92),cmap="gray")
本文暂时没有评论,来添加一个吧(●'◡'●)