Я хотел бы использовать анализ главных компонентов (PCA) для уменьшения размерности. У numpy или scipy он уже есть, или мне нужно использовать собственный numpy.linalg.eigh
?
Я не просто хочу использовать разложение по сингулярным значениям (SVD), потому что мои входные данные довольно многомерны (~ 460 измерений), поэтому я думаю, что SVD будет медленнее, чем вычисление собственных векторов ковариационной матрицы.
Я надеялся найти готовую отлаженную реализацию, которая уже принимает правильные решения о том, когда использовать какой метод, и которая, возможно, выполняет другие оптимизации, о которых я не знаю.
Note that from this release MDP is in maintenance mode. 13 years after its first public release, MDP has reached full maturity and no new features are planned in the future.
Несколько месяцев спустя вот PCA небольшого класса и изображение:
источник
Использовать PCA
numpy.linalg.svd
очень просто. Вот простая демонстрация:источник
svd
уже возвращаетсяs
как отсортированный в порядке убывания, насколько это указано в документации. (Возможно, в 2012 году этого не было, но сегодня это так)Вы можете использовать sklearn:
источник
matplotlib.mlab имеет реализацию PCA .
источник
СВД должен нормально работать с 460 габаритами. На моем нетбуке Atom это занимает около 7 секунд. Метод eig () занимает больше времени (как и следовало бы, он использует больше операций с плавающей запятой) и почти всегда будет менее точным.
Если у вас меньше 460 примеров, то вам нужно диагонализовать матрицу разброса (x - datamean) ^ T (x - mean), предполагая, что ваши точки данных являются столбцами, а затем умножить слева на (x - datamean). Это может быть быстрее, если у вас больше измерений, чем данных.
источник
Вы можете довольно легко "свернуть" свой собственный, используя
scipy.linalg
(при условии, что набор данных предварительно центрированdata
):Тогда
evs
ваши собственные значения иevmat
ваша матрица проекции.Если вы хотите сохранить
d
размеры, используйте первыеd
собственные значения и первыеd
собственные векторы.Учитывая, что у
scipy.linalg
него есть разложение и numpy умножения матриц, что еще вам нужно?источник
eig()
ковариационной матрицы.Я только что дочитал книгу « Машинное обучение: алгоритмическая перспектива» . Все примеры кода в книге были написаны Python (и почти с Numpy). Фрагмент кода анализа основных компонентов chatper10.2, возможно, стоит прочитать. Он использует numpy.linalg.eig.
Кстати, я считаю, что СВД очень хорошо справляется с габаритами 460 * 460. Я рассчитал SVD 6500 * 6500 с numpy / scipy.linalg.svd на очень старом ПК: Pentium III 733 МГц. Если честно, скрипту нужно много памяти (около 1.xG) и много времени (около 30 минут), чтобы получить результат SVD. Но я думаю, что 460 * 460 на современном ПК не будет большой проблемой, если вам не нужно делать СВД огромное количество раз.
источник
Вам не нужно полное разложение по сингулярным значениям (SVD), поскольку он вычисляет все собственные значения и собственные векторы и может быть недопустимым для больших матриц. scipy и его sparse-модуль предоставляют общие функции линейной алгебры, работающие как с разреженными, так и с плотными матрицами, среди которых есть семейство функций eig *:
http://docs.scipy.org/doc/scipy/reference/sparse.linalg.html#matrix-factorizations
Scikit-learn предоставляет реализацию Python PCA, которая пока поддерживает только плотные матрицы.
Сроки:
источник
eigsh
на самом деле это примерно в 4 раза медленнее, чемeigh
для не разреженных матриц. То же верно и дляscipy.sparse.linalg.svds
versusnumpy.linalg.svd
. Я всегда предпочитаю SVD разложению по собственным значениям по причинам, упомянутым @dwf, и, возможно, использую разреженную версию SVD, если матрицы становятся действительно огромными.eigsh
иsvds
они быстрееeigh
иsvd
в ~ 3 раза, но если A меньше, скажем, 100 * 100, тогдаeigh
иsvd
быстрее в ~ 4 и ~ 1,5 раза соответственно . Тем не менее, T по-прежнему будет использовать разреженное SVD вместо разреженного разложения на собственные значения.Вот еще одна реализация модуля PCA для python с использованием numpy, scipy и C-расширений. Модуль выполняет PCA, используя алгоритм SVD или NIPALS (нелинейный итерационный алгоритм частичных наименьших квадратов), который реализован на C.
источник
Если вы работаете с 3D-векторами, вы можете кратко применить SVD с помощью toolbelt vg . Это легкий слой поверх numpy.
Также есть удобный псевдоним, если вам нужен только первый основной компонент:
Я создал библиотеку при моем последнем запуске, где она была мотивирована следующим использованием: простые идеи, которые в NumPy многословны или непонятны.
источник