Чтобы выполнить анализ главных компонентов (PCA), вы должны вычесть средние значения каждого столбца из данных, вычислить матрицу коэффициентов корреляции и затем найти собственные векторы и собственные значения. Ну, скорее, это то, что я сделал, чтобы реализовать его в Python, за исключением того, что он работает только с небольшими матрицами, потому что метод поиска матрицы коэффициентов корреляции (corrcoef) не позволяет мне использовать массив с высокой размерностью. Поскольку я должен использовать его для изображений, моя текущая реализация мне не очень помогает.
Я читал, что можно просто взять матрицу данных и вычислить D D ⊤ / n вместо D ⊤ D / n , но это не работает для меня. Ну, я не совсем уверен, что понимаю, что это означает, кроме того факта, что это должна быть матрица n × n вместо p × p (в моем случае p ≫ n ). Я читал об этом в уроках eigenfaces, но ни один из них, казалось, не объяснял это таким образом, что я мог действительно получить это.
Короче говоря, есть ли простое алгоритмическое описание этого метода, чтобы я мог следовать ему?
Ответы:
Самый простой способ сделать стандартный PCA - центрировать столбцы матрицы данных (предполагая, что столбцы соответствуют различным переменным), вычитая среднее значение столбца, а затем выполнить SVD. Левые сингулярные векторы, умноженные на соответствующее сингулярное значение, соответствуют (оценочным) основным компонентам. Правые сингулярные векторы соответствуют (оценочным) направлениям главных компонент - они совпадают с собственными векторами, заданными PCA. Значения в единственном числе соответствуют стандартным отклонениям основных компонентов (умноженным на коэффициент корня n, где n - количество строк в матрице данных) - то же, что квадратный корень из собственных значений, заданных PCA.
Если вы хотите провести PCA на матрице корреляции, вам нужно будет стандартизировать столбцы матрицы данных перед применением SVD. Это равносильно вычитанию среднего (центрирование), а затем делению на стандартные отклонения (масштабирование).
Это будет наиболее эффективный подход, если вам нужен полный PCA. С помощью некоторой алгебры вы можете проверить, что это дает тот же ответ, что и спектральное разложение выборочной ковариационной матрицы.
Существуют также эффективные методы для вычисления частичного SVD, когда вам нужно всего несколько компьютеров. Некоторые из них являются вариантами степенной итерации. Алгоритм Ланцош является одним из примеров , который также связан с частичных наименьших квадратов. Если ваша матрица огромна, вам лучше использовать приблизительный метод. Существуют также статистические причины регуляризации PCA, когда это происходит.
источник
То, что вы делаете сейчас, близко, но вам нужно убедиться, что вы умножили собственные векторы
(data . data.T) / lines
слеваdata.T
, чтобы получить собственные векторы(data.T . data) / lines
. Это иногда называют "уловкой транспонирования".Вот еще несколько деталей. Предположим, у вас есть матрица которой вы хотите выполнить PCA; для простоты предположим , что столбцы А уже нормализованы иметь нулевое среднее значение, так что нам просто нужно вычислить собственные векторы ковариационной матрицы A T A .A A ATA
Теперь , если является м × п матрица с п > > т , то Т является очень большим п × п матрица. Таким образом, вместо вычисления собственных векторов A T A , мы могли бы вычислить собственные векторы гораздо меньшей матрицы m × m A A T - предполагая, что мы можем выяснить взаимосвязь между ними. Так как же собственные векторы A T A связаны с собственными векторами A A T ?A м × н п > > т ATA n × n ATA м × м A AT ATA A AT
Пусть собственный вектор A A T с собственным значением λ . потомv A AT λ
Другими словами, если является собственным вектором A A T , то A T v является собственным вектором A T A с тем же собственным значением. Таким образом, при выполнении PCA на A вместо непосредственного нахождения собственных векторов A T A (что может быть очень дорого), легче найти собственные векторы v в A A T и затем умножить их слева на A T, чтобы получить собственные векторы Т v из A T A .v A AT ATv ATA A ATA v A AT AT ATv ATA
источник
Похоже, что вы хотите, это алгоритм NIPALS для выполнения PCA. Это очень популярный алгоритм среди статистиков. У этого есть много преимуществ:
Описание
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, не забудьте сначала указать среднюю шкалу, так как она чувствительна к шкале.
источник
Чтобы добавить ответ Gilead, они вычислительно менее дорогие алгоритмы для усеченных PCA. NIPALS действительно очень популярен, но у меня был большой успех с приблизительными методами, которые выполняют последовательность подгонок к частичным данным (что часто называют PCA по случайной проекции). Это обсуждалось в метаоптимизирующей ветке.
Как вы упомянули Python, позвольте мне отметить, что алгоритм реализован в scikit-learn : класс PCA . В частности, это используется в примере, демонстрирующем собственные лица .
источник