Нанести PCA на очень большую разреженную матрицу

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

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

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

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

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

Ответы на вопрос(4)

Я решил почти такая же проблема с помощью техника для PCA разреженной матрицы. Этот метод может обрабатывать очень большие разреженные матрицы.Результа показывает такие простые PCA превосходит Word2vec. Предполагается, что простой PCA превосходит LDA.

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

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

РЕДАКТИРОВАТ: поддержка разреженной матрицы отRandomizedPCA устарела в scikit-learn 0.14.TruncatedSVDместо него следует использовать @. Подробности смотрите в документации.

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

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

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

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

big.PCA ofbigpca пакетhttp: //cran.r-project.org/web/packages/bigpca/bigpca.pd делает работу.

ВАШ ОТВЕТ НА ВОПРОС