2012-05-23 70 views
13

我正在用R進行文本分類任務,並且我獲得了大小爲22490乘以120,000(僅400萬個非零條目,小於1%條目)的文檔項矩陣。現在我想通過使用PCA(主成分分析)來降低維度。不幸的是,R無法處理這個巨大的矩陣,所以我把這個稀疏矩陣存儲在一個文件中的「矩陣市場格式」,希望使用一些其他技術來做PCA。因此,任何人都可以給我一些有用的庫的提示(無論編程語言如何),它可以輕鬆地用這個大型矩陣做PCA,或者自己做一個longhand PCA,換句話說,計算首先計算協方差矩陣,然後計算協方差矩陣的特徵向量和特徵向量,即在非常大的稀疏矩陣上應用PCA

我想是計算所有的PC(120,000),並且只選擇前N個電腦,誰佔了90%的變異。顯然,在這種情況下,我必須先給出一個閾值,以便將一些非常小的方差值設置爲0(在協方差矩陣中),否則協方差矩陣將不會稀疏並且其大小將爲120,000乘以120,000,即單臺機器無法處理。另外,加載(特徵向量)將會非常大,並且應該以稀疏格式存儲。

非常感謝您的幫助!

注意:我使用的機器有24GB RAM和8個cpu核心。

+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應該能夠解析Matrix Market格式(但我從來沒有嘗試過)。

聲明:我在scikit-learn開發團隊。

編輯:在scikit-learn 0.14中已棄用來自RandomizedPCA的稀疏矩陣支持。應該使用TruncatedSVD代替。詳情請參閱文檔。

+0

非常感謝@larmans,在某種程度上,你提出的方法可以用稀疏矩陣做PCA,但由於大內存消耗,它只能計算一些少量的PC: - ( –

+0

請注意'RandomizedPCA'已被棄用,支持使用關鍵字參數'svd_solver ='randomized''的'PCA' – BallpointBen

6

您可以嘗試Latent Dirichlet Allocation(LDA),它可以將文檔詞矩陣分解爲文檔主題和主題詞矩陣,而不用運行PCA。這是一個R實現的鏈接:http://cran.r-project.org/web/packages/lda/ - 這裏有不少實現,儘管如果你是谷歌。

對於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算法將收斂到給定指定主題數量的數據的最小描述長度表示。