PCA обчислює власні вектори матриці коваріації ("головні осі") та сортує їх за власними значеннями (кількість поясненої дисперсії). Далі по центру дані можуть бути спроектовані на ці головні осі, щоб отримати основні компоненти ("бали"). Для зменшення розмірності можна зберегти лише підмножину основних компонентів, а решту відкинути. (Дивіться тут для ознайомлення з мирян у PCA .)
Xrawn×pnpμXVp×kkkn×kZ=XV
Це проілюстровано на малюнку нижче: перший субплот показує деякі центрировані дані (ті самі дані, які я використовую в своїх анімаціях у пов'язаній нитці) та його проекції на першу головну вісь. Другий субплот показує лише значення цієї проекції; розмірність знижена з двох до одного:
Для того, щоб можна було реконструювати вихідні дві змінні з цього одного головного компонента, ми можемо повернути його до розмірів з . Дійсно, значення кожного ПК повинні бути розміщені на тому ж векторі, який було використано для проекції; порівняйте підплоти 1 і 3. Результат дається . Я показую це на третьому субплоті вище. Щоб отримати остаточну реконструкцію , нам потрібно додати середній вектор до цього:pV⊤X^=ZV⊤=XVV⊤X^rawμ
PCA reconstruction=PC scores⋅Eigenvectors⊤+Mean
Зауважте, що можна перейти безпосередньо від першої субплоти до третьої, множивши на матрицю ; її називають матрицею проекції . Якщо використовуються всі власні вектори, то є матрицею ідентичності (зменшення розмірності не проводиться, отже, "реконструкція" є ідеальною). Якщо використовується лише підмножина власних векторів, це не тотожність.XVV⊤pVV⊤
Це працює для довільної точки в просторі ПК; його можна відобразити у вихідний простір через .zx^=zV⊤
Відмова (видалення) провідних ПК
Іноді хочеться відкинути (видалити) один або кілька провідних ПК та зберегти решту, замість того, щоб зберігати провідні ПК та відкидати решту (як вище). У цьому випадку всі формули залишаються абсолютно однаковими , але повинен складатися з усіх основних осей, крім тих, які хоче відкинути. Іншими словами, завжди повинен включати всі ПК, які потрібно зберегти.VV
Застереження про PCA на кореляцію
Коли PCA робиться на кореляційній матриці (а не на матриці коваріації), необроблені дані не лише центрируються шляхом віднімання але й масштабуються шляхом ділення кожного стовпця на його стандартне відхилення . У цьому випадку для реконструкції вихідних даних потрібно змінити масштаб стовпців допомогою і лише потім додати назад середній вектор .XrawμσiX^σiμ
Приклад обробки зображень
Ця тема часто виникає в контексті обробки зображень. Розгляньте Ленну - одне із стандартних зображень у літературі з обробки зображень (перейдіть за посиланнями, щоб знайти, звідки вона походить). Нижче зліва я показую варіант сірого масштабу цього зображення (файл доступний тут ).512×512
Ми можемо трактувати це зображення масштабу сірого як матриця даних . Я виконую на ньому PCA і обчислюю використовуючи перші 50 основних компонентів. Результат відображається праворуч.512×512X сировинуXrawX^raw
Повернення SVD
PCA дуже тісно пов'язаний з розкладанням сингулярного значення (SVD), див.
Зв'язок між SVD та PCA. Як використовувати SVD для виконання PCA? для отримання детальної інформації. Якщо матриця є SVD-ed як і вибирається -вимірний вектор який являє собою точку в "зменшеному" просторі з розмірів, потім, щоб повернути його до розмірів, потрібно помножити його на .X X = U S V ⊤ K г U до р S ⊤ 1 : K , 1 : K V ⊤ : , 1 : Kn×pXX=USV⊤kzUkpS⊤1:k,1:kV⊤:,1:k
Приклади в R, Matlab, Python та Stata
Я проведу PCA на даних Fisher Iris, а потім реконструюю його за допомогою перших двох основних компонентів. Я роблю PCA на коваріаційній матриці, а не на кореляційній матриці, тобто я не масштабую змінні тут. Але я все одно повинен додати середнє значення назад. Деякі пакети, як Stata, переймаються цим стандартним синтаксисом. Дякуємо @StasK та @Kodiologist за допомогу з кодом.
Ми перевіримо реконструкцію першої точки даних, а саме:
5.1 3.5 1.4 0.2
Матлаб
load fisheriris
X = meas;
mu = mean(X);
[eigenvectors, scores] = pca(X);
nComp = 2;
Xhat = scores(:,1:nComp) * eigenvectors(:,1:nComp)';
Xhat = bsxfun(@plus, Xhat, mu);
Xhat(1,:)
Вихід:
5.083 3.5174 1.4032 0.21353
R
X = iris[,1:4]
mu = colMeans(X)
Xpca = prcomp(X)
nComp = 2
Xhat = Xpca$x[,1:nComp] %*% t(Xpca$rotation[,1:nComp])
Xhat = scale(Xhat, center = -mu, scale = FALSE)
Xhat[1,]
Вихід:
Sepal.Length Sepal.Width Petal.Length Petal.Width
5.0830390 3.5174139 1.4032137 0.2135317
Для відпрацьованого прикладу реконструкції зображень PCA див. Також цю відповідь .
Пітон
import numpy as np
import sklearn.datasets, sklearn.decomposition
X = sklearn.datasets.load_iris().data
mu = np.mean(X, axis=0)
pca = sklearn.decomposition.PCA()
pca.fit(X)
nComp = 2
Xhat = np.dot(pca.transform(X)[:,:nComp], pca.components_[:nComp,:])
Xhat += mu
print(Xhat[0,])
Вихід:
[ 5.08718247 3.51315614 1.4020428 0.21105556]
Зауважимо, що це дещо відрізняється від результатів інших мов. Це тому, що версія набору даних Iris у Python містить помилки .
Stata
webuse iris, clear
pca sep* pet*, components(2) covariance
predict _seplen _sepwid _petlen _petwid, fit
list in 1
iris seplen sepwid petlen petwid _seplen _sepwid _petlen _petwid
setosa 5.1 3.5 1.4 0.2 5.083039 3.517414 1.403214 .2135317