PCA е много полезно за редуциране на много измерения в по-малък набор от измерения, тъй като хората не могат да визуализират данни в повече от 3 измерения, обикновено е полезно да се намалят многомерните набори от данни в 2 или 3 измерения и да се изобразят в графики, за да се разбере по-добре данните.

В този блог Келвин обяснява как PCA може да се използва за намаляване на размерите на набор от данни на Титаник от 9 измерения на 3 измерения и ги начертава на интерактивна графика: https://medium.com/@kelfun5354/principal-component- анализ-и-какво-е-наистина-използването-на-python-8f04dbdb1600

Тук ще обясня как да използвам PCA, за да получа собствените вектори на набор от данни от лица от AT&T Laboratories Cambridge.

Първо наборът от данни трябва да бъде изтеглен:

!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")

Тъй като те бяха преначертани от собствените вектори с 80% от вариацията в набора от данни, получените изображения загубиха 20% от своята дефиниция.

The dataset with faces was downloaded from AT&T Laboratories Cambridge: http://www.cl.cam.ac.uk/research/dtg/attarchive/facedatabase.html