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