Как обратить вспять PCA и восстановить исходные переменные из нескольких основных компонентов?


113

Анализ основных компонентов (PCA) может использоваться для уменьшения размерности. После такого уменьшения размерности, как можно приблизительно восстановить исходные переменные / характеристики из небольшого числа главных компонентов?

В качестве альтернативы, как можно удалить или удалить несколько основных компонентов из данных?

Другими словами, как обратить вспять PCA?


Учитывая, что PCA тесно связан с разложением по сингулярным числам (SVD), тот же вопрос можно задать следующим образом: как обратить вспять SVD?


10
Я публикую эту ветку вопросов и ответов, потому что устала видеть десятки вопросов, задающих эту самую вещь, и не в состоянии закрыть их как дубликаты, потому что у нас нет канонической ветки на эту тему. Есть несколько похожих тем с достойными ответами, но у всех, похоже, есть серьезные ограничения, например, например, фокусировка исключительно на R.
amoeba

4
Я ценю усилия - я думаю, что существует острая необходимость собрать информацию о PCA, что он делает, что он не делает, в одну или несколько высококачественных тем. Я рад, что вы взяли на себя это!
Sycorax

1
Я не уверен, что этот канонический ответ «зачистка» служит своей цели. Здесь у нас есть отличный общий вопрос и ответ, но у каждого из вопросов были свои тонкости относительно PCA на практике, которые здесь потеряны. По сути, вы взяли все вопросы, сделали PCA на них и отбросили нижние основные компоненты, где иногда скрываются богатые и важные детали. Более того, вы вернулись к обозначению линейной алгебры из учебника, которое делает PCA непрозрачным для многих людей, вместо того, чтобы использовать lingua franca случайных статистиков, то есть R.
Томас Браун

1
@ Томас Спасибо. Я думаю, что у нас есть разногласия, рады обсудить это в чате или в Мете. Очень кратко: (1) Возможно, действительно лучше ответить на каждый вопрос индивидуально, но суровая реальность такова, что этого не происходит. Многие вопросы просто остаются без ответа, как, вероятно, и ваш. (2) сообщество здесь сильно предпочитает общие ответы, полезные для многих людей; Вы можете посмотреть, какие ответы получают наибольшее количество голосов. (3) Согласитесь с математикой, но именно поэтому я дал здесь код R! (4) Не согласен с языком общения; лично я не знаю Р.
амеба

@amoeba Боюсь, я не знаю, как найти этот чат, потому что я никогда раньше не участвовал в мета-дискуссиях.
Томас Браун

Ответы:


147

PCA вычисляет собственные векторы ковариационной матрицы («главные оси») и сортирует их по собственным значениям (величина объясненной дисперсии). Центрированные данные затем можно спроецировать на эти главные оси, чтобы получить главные компоненты («баллы»). В целях уменьшения размерности можно оставить только подмножество главных компонентов и отбросить остальные. (Смотрите здесь для ознакомления непрофессионала с PCA .)

Пусть будет матрицей данных с строками (точками данных) и столбцами (переменными или объектами). После вычитания среднего вектора из каждой строки, мы получим центрированную матрицу данных . Пусть - матрица некоторых собственных векторов, которые мы хотим использовать; чаще всего это будут собственных векторов с наибольшим собственным значением. Тогда матрица проекций PCA («баллов») будет просто задана как .Xrawn×pnpμXVp×kkkn×kZ=XV

Это показано на рисунке ниже: на первом вспомогательном участке показаны некоторые центрированные данные (те же данные, которые я использую в своих анимациях в связанном потоке) и их проекции на первую главную ось. Второй подпункт показывает только значения этой проекции; размерность была уменьшена с двух до одного:

введите описание изображения здесь

Чтобы иметь возможность восстановить исходные две переменные из этого одного основного компонента, мы можем отобразить его обратно в измерений с помощью . Действительно, значения каждого ПК должны быть размещены в том же векторе, который использовался для проецирования; сравните подзаговоры 1 и 3. Затем результат определяется как . Я показываю это на третьем участке выше. Чтобы получить окончательную реконструкцию , нам нужно добавить к этому вектор среднего значения :pVX^=ZV=XVVX^rawμ

PCA reconstruction=PC scoresEigenvectors+Mean

Обратите внимание, что можно перейти непосредственно от первого подзаговора к третьему, умножив на матрицу ; это называется проекционная матрица. Если все используются собственные векторы, то единичная матрица (без уменьшения размерности не выполняется, следовательно , «реконструкция» идеально подходит). Если используется только подмножество собственных векторов, это не тождество.XVVpVV

Это работает для произвольной точки в пространстве ПК; он может быть сопоставлен с исходным пространством через .zx^=zV

Отбрасывание (удаление) ведущих ПК

Иногда кто-то хочет отбросить (удалить) один или несколько ведущих ПК и оставить остальные, вместо того, чтобы оставить ведущие ПК и отбросить остальные (как указано выше). В этом случае все формулы остаются одинаковыми , но должен состоять из всех главных осей, кроме тех, которые нужно отбросить. Другими словами, всегда должен включать все ПК, которые вы хотите сохранить.VV

Будьте о СПС на взаимосвязи

Когда PCA выполняется на корреляционной матрице (а не на ковариационной матрице), необработанные данные не только центрируются путем вычитания но также масштабируются путем деления каждого столбца на его стандартное отклонение . В этом случае, чтобы восстановить исходные данные, нужно отодвинуть столбцы с помощью и только затем добавить обратно средний вектор .XrawμσiX^σiμ


Пример обработки изображения

Эта тема часто возникает в контексте обработки изображений. Рассмотрим Lenna - одно из стандартных изображений в литературе по обработке изображений (перейдите по ссылкам, чтобы узнать, откуда оно). Ниже слева я отображаю вариант в оттенках серого для этого изображения (файл доступен здесь ).512×512

Две полутоновые версии изображения Ленны.  Тот, что справа, зернистый, но определенно узнаваемый.

Мы можем рассматривать это изображение в градациях серого как матрицу данных . Я выполняю PCA на нем и вычисляю используя первые 50 основных компонентов. Результат отображается справа.512×512XrawX^raw


Возврат СВД

PCA очень тесно связан с разложением сингулярных значений (SVD), см. Связь между SVD и PCA. Как использовать SVD для выполнения PCA? Больше подробностей. Если матрица обозначена SVD как и выбирается мерный вектор , представляющий точку в "уменьшенном" пространстве из измерений, то, чтобы отобразить его обратно в измерений, нужно умножить его на .n×pXX=USVkzUkpS1: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  

1
В MATLAB вы можете извлечь mu из стандартных выходов PCA, а также указать количество компонентов на входах.
Аксакал

2
@Aksakal Я попытался сделать все три фрагмента кода максимально похожими (и максимально понятными); в частности, я хотел вычислить вручную перед вызовом pca (), а также запустить PCA со всеми компонентами и использовать только компоненты при выполнении точечного произведения между оценками и собственными векторами. Теперь я изменил код Python, чтобы следовать той же схеме. μnComp
амеба

3
Я бы исключил из ответа все, что не связано с прямым ответом на вопрос, например, изображение этой симпатичной девочки и его обработку. Если кто-то не интересуется изображениями, это затрудняет потребление. Помните, что тот, кто задает вопрос, уже глубоко смущен.
Аксакал

5
Ленна примерно такой же набор данных, как ирис.
StasK

2
@amoeba Я говорил о размере, битовой глубине и даже черных пикселях на границе. У меня нет окончательной версии http://www.ece.rice.edu/~wakin/images/ : «Похоже, существует много версий тестового изображения Lena (он же« Lenna »). Эта проблема была отмечена Шапиро в его статье о нулевом дереве 1993 года, и сегодня она остается на удивление верной »
Лоран Дюваль
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.