Подтвердить что ты не робот

Применение PCA на очень большой разреженной матрице

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

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

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

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

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

4b9b3361

Ответ 1

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

Отказ от ответственности: я участвую в команде разработчиков scikit-learn.

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

Ответ 2

Вместо того, чтобы запускать 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 будут сходиться к представлению минимальной длины описания данных, учитывая количество указанных тем.