2012-05-23 2 views
13

Я выполняю задачу классификации текста с помощью R, и я получаю матрицу документов с размером 22490 на 120 000 (всего 4 миллиона ненулевых записей, менее 1% записей). Теперь я хочу уменьшить размерность, используя PCA (анализ основных компонентов). К сожалению, R не может справиться с этой огромной матрицей, поэтому я храню эту разреженную матрицу в файле в «Матричном рыночном формате», надеясь использовать некоторые другие методы для PCA.Применить PCA на очень большой разреженной матрице

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

То, что я хочу, чтобы стоимость всех ПК (120000), и выбрать только лучшие N ПК, которые приходится 90% дисперсии. Очевидно, что в этом случае я должен дать порог априори установить некоторые очень маленькие значения дисперсии до 0 (в ковариационной матрице), в противном случае ковариационная матрица не будет разреженной, а ее размер будет 120 000 на 120 000, что невозможно обработать одной машиной. Кроме того, нагрузки (собственные векторы) будут чрезвычайно большими и должны храниться в разреженном формате.

Большое спасибо за любую помощь!

Примечание: Я использую машину с 24 ГБ оперативной памяти и 8 ядер процессора.

+0

Я не уверен, что он на 100% прав, но я думаю, что MatLab может выполнить эту работу. – Anton

+0

Если вы не получаете радости здесь, то, возможно, стоит попросить http://stats.stackexchange.com/ – NPE

+0

@aix Спасибо за ваши советы, я перевел его на бета-версию вычислительной науки и получил полезную информацию намеки. Вы также можете следить за ним по этому [URL] (http://scicomp.stackexchange.com/questions/2313/apply-pca-on-very-large-sparse-matrix) –

ответ

11

Набор инструментов Python scikit-learn имеет несколько вариантов PCA, из которых RandomizedPCA может обрабатывать разреженные матрицы в любых форматах, поддерживаемых scipy.sparse. scipy.io.mmread должен иметь возможность анализировать формат матричного рынка (я его никогда не пробовал).

Отказ от ответственности: Я нахожусь в команде разработчиков scikit-learn.

EDIT: разреженная матричная поддержка от RandomizedPCA устарела в scikit-learn 0.14. TruncatedSVD следует использовать вместо него. Подробнее см. В документации.

+0

Большое спасибо @larmans, в какой-то мере ваш предложенный метод может сделать PCA с разреженной матрицей, но он может вычислять только небольшое количество ПК из-за большого потребления памяти: ( –

+0

Обратите внимание, что 'RandomizedPCA' устарел в пользу' PCA' с аргументом ключевого слова 'svd_solver = 'randomized'' – BallpointBen

6

Вместо того, чтобы запускать PCA, вы можете попробовать Latent Dirichlet Allocation (LDA), которая разлагает матрицу документа-слова в матрицу документа и тему-слова. Вот ссылка на реализацию R: http://cran.r-project.org/web/packages/lda/ - там довольно много реализаций, но если вы google.

С LDA вам необходимо заранее указать фиксированное количество тем (аналогично основным компонентам). Потенциально лучшей альтернативой является HDP-LDA (http://www.gatsby.ucl.ac.uk/~ywteh/research/npbayes/npbayes-r21.tgz), в котором изучается количество тем, которые образуют хорошее представление вашего корпуса.

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

Как отметили многие люди на форуме scicomp, не должно быть необходимости вычислять все основные компоненты 120k. Алгоритмы, такие как http://en.wikipedia.org/wiki/Power_iteration, вычисляют наибольшие собственные значения матрицы, а алгоритмы LDA будут сходиться к представлению данных с минимальным описанием длины, учитывая количество указанных тем.

Смежные вопросы