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


12

Чтобы выполнить анализ главных компонентов (PCA), вы должны вычесть средние значения каждого столбца из данных, вычислить матрицу коэффициентов корреляции и затем найти собственные векторы и собственные значения. Ну, скорее, это то, что я сделал, чтобы реализовать его в Python, за исключением того, что он работает только с небольшими матрицами, потому что метод поиска матрицы коэффициентов корреляции (corrcoef) не позволяет мне использовать массив с высокой размерностью. Поскольку я должен использовать его для изображений, моя текущая реализация мне не очень помогает.

Я читал, что можно просто взять матрицу данных и вычислить D D / n вместо D D / n , но это не работает для меня. Ну, я не совсем уверен, что понимаю, что это означает, кроме того факта, что это должна быть матрица n × n вместо p × p (в моем случае p n ). Я читал об этом в уроках eigenfaces, но ни один из них, казалось, не объяснял это таким образом, что я мог действительно получить это.DDD/NDD/NN×Nп×пп»N

Короче говоря, есть ли простое алгоритмическое описание этого метода, чтобы я мог следовать ему?


То, что вы читаете, правильно. Матрица называется матрицей Грама. Его собственные векторы являются (масштабированными) главными компонентами. Его собственные значения в точности совпадают с точностью до множителя 1 / n от собственных значений ковариационной матрицы D D / n . DD1/NDD/N
говорит амеба: восстанови Монику

Ответы:


10

Самый простой способ сделать стандартный PCA - центрировать столбцы матрицы данных (предполагая, что столбцы соответствуют различным переменным), вычитая среднее значение столбца, а затем выполнить SVD. Левые сингулярные векторы, умноженные на соответствующее сингулярное значение, соответствуют (оценочным) основным компонентам. Правые сингулярные векторы соответствуют (оценочным) направлениям главных компонент - они совпадают с собственными векторами, заданными PCA. Значения в единственном числе соответствуют стандартным отклонениям основных компонентов (умноженным на коэффициент корня n, где n - количество строк в матрице данных) - то же, что квадратный корень из собственных значений, заданных PCA.

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

Это будет наиболее эффективный подход, если вам нужен полный PCA. С помощью некоторой алгебры вы можете проверить, что это дает тот же ответ, что и спектральное разложение выборочной ковариационной матрицы.

Существуют также эффективные методы для вычисления частичного SVD, когда вам нужно всего несколько компьютеров. Некоторые из них являются вариантами степенной итерации. Алгоритм Ланцош является одним из примеров , который также связан с частичных наименьших квадратов. Если ваша матрица огромна, вам лучше использовать приблизительный метод. Существуют также статистические причины регуляризации PCA, когда это происходит.


Поправьте меня, если я ошибаюсь, но я думаю, что алгоритм Ланцоша выполняет собственное разложение, а не SVD.
говорит амеба: восстанови Монику

1
Заинтересованный читатель может найти здесь более подробную информацию о выполнении PCA через SVD: отношения между SVD и PCA. Как использовать SVD для выполнения PCA?
говорит амеба: восстанови Монику

10

То, что вы делаете сейчас, близко, но вам нужно убедиться, что вы умножили собственные векторы (data . data.T) / linesслева data.T, чтобы получить собственные векторы (data.T . data) / lines. Это иногда называют "уловкой транспонирования".

Вот еще несколько деталей. Предположим, у вас есть матрица которой вы хотите выполнить PCA; для простоты предположим , что столбцы А уже нормализованы иметь нулевое среднее значение, так что нам просто нужно вычислить собственные векторы ковариационной матрицы A T A .AAATA

Теперь , если является м × п матрица с п > > т , то Т является очень большим п × п матрица. Таким образом, вместо вычисления собственных векторов A T A , мы могли бы вычислить собственные векторы гораздо меньшей матрицы m × m A A T - предполагая, что мы можем выяснить взаимосвязь между ними. Так как же собственные векторы A T A связаны с собственными векторами A A T ?Aм×NN>>мATAN×NATAм×мAATATAAAT

Пусть собственный вектор A A T с собственным значением λ . потомvAATλ

  • AATvзнак равноλv
  • AT(AATv)знак равноAT(λv)
  • (ATA)(ATv)знак равноλ(ATv)

Другими словами, если является собственным вектором A A T , то A T v является собственным вектором A T A с тем же собственным значением. Таким образом, при выполнении PCA на A вместо непосредственного нахождения собственных векторов A T A (что может быть очень дорого), легче найти собственные векторы v в A A T и затем умножить их слева на A T, чтобы получить собственные векторы Т v из A T A .vAATATvATAAATAvAATATATvATA


1
Это похоже на «трюк с ядром», применяемый к PCA. en.wikipedia.org/wiki/Kernel_PCA Это очень хороший способ обработки определенных больших матриц.
Галаад

+1. Возможно, следует добавить, что называется матрицей Грама. AA
говорит амеба: восстанови Монику

8

Похоже, что вы хотите, это алгоритм NIPALS для выполнения PCA. Это очень популярный алгоритм среди статистиков. У этого есть много преимуществ:

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

Описание
http://en.wikipedia.org/wiki/Non-linear_iterative_partial_least_squares

Алгоритм
Вот простое и отличное описание алгоритма (в разделе 1.2)
http://stats4.eng.mcmaster.ca/w/mediafiles/mediawiki/f/f7/Section-Extra-Class-1.pdf

Прежде чем делать PCA, не забудьте сначала указать среднюю шкалу, так как она чувствительна к шкале.


4

Чтобы добавить ответ Gilead, они вычислительно менее дорогие алгоритмы для усеченных PCA. NIPALS действительно очень популярен, но у меня был большой успех с приблизительными методами, которые выполняют последовательность подгонок к частичным данным (что часто называют PCA по случайной проекции). Это обсуждалось в метаоптимизирующей ветке.

Как вы упомянули Python, позвольте мне отметить, что алгоритм реализован в scikit-learn : класс PCA . В частности, это используется в примере, демонстрирующем собственные лица .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.