Нанести 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 процессорных ядер.

 

 Я решил [почти такая же проблема](https://github.com/niitsuma/wordca) с помощью [техника для PCA разреженной матрицы](https://stackoverflow.com/a/53274972/2223158). Этот метод может обрабатывать очень большие разреженные матрицы.[Результа](https://github.com/niitsuma/wordca/blob/master/demo.sh) показывает такие простые PCA превосходит Word2vec. Предполагается, что простой PCA превосходит LDA.



  [Scikit учиться](http://scikit-learn.org/) имеет несколько вариантов PCA, из которых[`RandomizedPCA`](http://scikit-learn.org/stable/modules/generated/sklearn.decomposition.RandomizedPCA.html#sklearn.decomposition.RandomizedPCA) может обрабатывать разреженные матрицы в любом из форматов, поддерживаемых[`scipy.sparse`](http://docs.scipy.org/doc/scipy/reference/sparse.html). [`scipy.io.mmread`](http://docs.scipy.org/doc/scipy/reference/generated/scipy.io.mmread.html#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](http://cran.r-project.org/web/packages/lda/) - есть довольно много реализаций, хотя, если вы гуглите.

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

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

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



 `big.PCA` of`bigpca` пакет[http: //cran.r-project.org/web/packages/bigpca/bigpca.pd](http://cran.r-project.org/web/packages/bigpca/bigpca.pdf) делает работу.