Этот вопрос касается эффективного способа вычисления основных компонентов.
Многие тексты по линейному PCA рекомендуют использовать разложение по регистру данных по сингулярным значениям . То есть, если у нас есть данные и мы хотим заменить переменные (их столбцы ) на главные компоненты, мы делаем SVD: , особые значения (квадратные корни из собственных значений), занимающие основную диагональ , правые собственные векторы - это ортогональная матрица вращения осей-переменных в оси-компоненты, левые собственные векторы подобны , только для случаев. Затем мы можем вычислить значения компонентов как .X = U S V ′ S V U V C = X V = U S
Другим способом сделать PCA переменных является разложение квадратной матрицы (т. может быть корреляциями или ковариациями и т. Д. Между переменными). Разложение может быть собственным разложением или разложением по сингулярному значению: с квадратно-симметричной положительной полуопределенной матрицей они дадут тот же результат с собственными значениями, что и диагональ , и как описано ранее. Значения компонентов будут .R R = V L V ′ L V C = X V
Теперь мой вопрос: если data - большая матрица, а число случаев (что часто бывает) намного больше, чем число переменных, то путь (1), как ожидается, будет намного медленнее, чем путь (2) ), поскольку способ (1) применяет довольно дорогой алгоритм (такой как SVD) к большой матрице; он вычисляет и хранит огромную матрицу которая нам действительно не нужна в нашем случае (PCA переменных). Если так, то почему так много учебников, кажется, отстаивают или просто упоминают только один путь (1)? Может быть , это является эффективным и я что - то не хватает?U
источник
R
svd
Joliffe, Principal component analysis, 2nd ed.
На самом деле, Джолифф описывает оба пути, но, насколько я помню, в основной главе по PCA он говорит только о способе 1.Ответы:
Вот мой 2ct по теме
На лекции по хемометрике, где я впервые узнал, что PCA использовал решение (2), но он не был ориентирован на нумерацию, а моя числовая лекция была только вводной и, насколько я помню, не обсуждала SVD.
Если я правильно понимаю Holmes: Fast SVD для крупномасштабных матриц , ваша идея использовалась для получения вычислительно быстрого SVD длинных матриц.
Это означало бы, что хорошая реализация SVD может внутренне следовать (2), если она встречает подходящие матрицы (я не знаю, есть ли еще лучшие возможности). Это будет означать, что для реализации высокого уровня лучше использовать SVD (1) и предоставить BLAS возможность решать, какой алгоритм использовать для внутреннего использования.
Быстрая практическая проверка: svd в OpenBLAS, похоже, не делает этого различия на матрице 5e4 x 100,
svd (X, nu = 0)
занимает в среднем 3,5 с иsvd (crossprod (X), nu = 0)
занимает 54 мс ( вызывается из R с помощьюmicrobenchmark
).Конечно, возведение в квадрат собственных значений быстрое, и до этого результаты обоих вызовов эквивалентны.
обновление: взгляните на Wu, W .; Massart, D. & de Jong, S .: Алгоритмы PCA ядра для широких данных. Часть I: Теория и алгоритмы, Хемометрика и интеллектуальные лабораторные системы, 36, 165 - 172 (1997). DOI: http://dx.doi.org/10.1016/S0169-7439(97)00010-5
В этой статье обсуждаются численные и вычислительные свойства 4 различных алгоритмов для PCA: SVD, собственное разложение (EVD), NIPALS и POWER.
Они связаны следующим образом:
Контекст статьи широкий , и они работают на X X ′ (ядро PCA) - это ситуация, прямо противоположная той, о которой вы спрашиваете. Поэтому, чтобы ответить на ваш вопрос о поведении длинных матриц, вам нужно поменять значения «ядро» и «классическое».X(30×500) XX′
Неудивительно, что EVD и SVD меняются местами в зависимости от того, используются ли классические алгоритмы или алгоритмы ядра. В контексте этого вопроса это означает, что один или другой может быть лучше в зависимости от формы матрицы.
Но из их обсуждения «классических» SVD и EVD становится ясно, что разложение является очень обычным способом вычисления PCA. Однако они не указывают, какой алгоритм SVD используется, кроме того, что они используют функцию Matlab .X′X
svd ()
источник
svd (X'X)
на длинные матрицы.)microbenchmark(X <- matrix(rnorm(5e6), ncol=100), Y <- t(X), svd(X), svd(Y), control=list(order="inorder"), times = 5)
тоже может быть что-то подобное .SVD медленнее, но часто считается предпочтительным методом из-за его более высокой числовой точности.
Вот что написано в справке
pca()
функции MATLAB :Последнее предложение подчеркивает ключевой компромисс между скоростью и точностью, который здесь присутствует.
получение идентичных результатов:
Я должен добавить, что часто рады игнорировать эту потенциальную [крошечную] потерю точности и скорее использовать более быстрый метод.
источник
eig()
подхода? (Читатели выиграют: между скоростью и стабильностью есть компромисс. Как можно определиться в конкретной практической ситуации?)3 0 -3.3307e-16
eigen в spss меня вернули3 0 0
. Похоже, что функция имеет некоторое встроенное и фиксированное значение допуска, выше которого она обнуляется. В этом примере функция выглядела так, как будто она взломала узел числовой нестабильности, обнуляя как крошечные собственные значения, «0» и «-16».