PCA вычисляет собственные векторы ковариационной матрицы («главные оси») и сортирует их по собственным значениям (величина объясненной дисперсии). Центрированные данные затем можно спроецировать на эти главные оси, чтобы получить главные компоненты («баллы»). В целях уменьшения размерности можно оставить только подмножество главных компонентов и отбросить остальные. (Смотрите здесь для ознакомления непрофессионала с 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 выполняется на корреляционной матрице (а не на ковариационной матрице), необработанные данные не только центрируются путем вычитания но также масштабируются путем деления каждого столбца на его стандартное отклонение . В этом случае, чтобы восстановить исходные данные, нужно отодвинуть столбцы с помощью и только затем добавить обратно средний вектор .XrawμσiX^σiμ
Пример обработки изображения
Эта тема часто возникает в контексте обработки изображений. Рассмотрим Lenna - одно из стандартных изображений в литературе по обработке изображений (перейдите по ссылкам, чтобы узнать, откуда оно). Ниже слева я отображаю вариант в оттенках серого для этого изображения (файл доступен здесь ).512×512
Мы можем рассматривать это изображение в градациях серого как матрицу данных . Я выполняю PCA на нем и вычисляю используя первые 50 основных компонентов. Результат отображается справа.512×512XrawX^raw
Возврат СВД
PCA очень тесно связан с разложением сингулярных значений (SVD), см.
Связь между SVD и PCA. Как использовать SVD для выполнения PCA? Больше подробностей. Если матрица обозначена SVD как и выбирается мерный вектор , представляющий точку в "уменьшенном" пространстве из измерений, то, чтобы отобразить его обратно в измерений, нужно умножить его на .n×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
Matlab
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
р
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