非常に大きなスパース行列にPCAを適用します


16

Rを使用してテキスト分類タスクを実行しており、サイズが22490 x 120,000のドキュメント用語マトリックスを取得しています(400万の非ゼロエントリのみ、1%未満のエントリ)。ここで、PCA(主成分分析)を利用して次元を減らしたいと思います。残念ながら、Rはこの巨大な行列を処理できないため、この行列を「行列市場形式」のファイルに保存し、PCAを行うために他の手法を使用したいと考えています。

だから誰も私に便利なライブラリ(プログラミング言語が何であれ)のヒントを教えてくれますか?この大規模なマトリックスでPCAを簡単に実行したり、自分で長文のPCAを実行したり、つまり最初に共分散行列を計算したり、次に、共分散行列の固有値と固有ベクトルを計算します。

私が望むのは、すべてのPC(120,000)を計算し、90%の差異を占める上位N個のPCのみを選択することです。明らかに、この場合、いくつかの非常に小さな分散値を0(共分散行列内)に設定するために、事前にしきい値を指定する必要があります。 1台のマシンでは処理できません。また、負荷(固有ベクトル)は非常に大きくなるため、スパース形式で保存する必要があります。

助けてくれてありがとう!

注:24GB RAMと8 CPUコアのマシンを使用しています。


行列はどのくらい疎ですか?結果のSVDをどのように使用しますか?その一部だけが必要な場合は、おそらくはるかに安く見積もることができます。
アーノルドノイマイアー

@ArnoldNeumaierすみません、スパース情報を追加するのを忘れました。完全なアイデアとともに、投稿を更新しました。
エンソムホダー

SLEPc、mahout、およびirlbaのそれぞれは、これまでの回答で提案されたように、あなたの問題に適していると思われます。
アーノルドノイマイアー

1
なぜすべての 120k を計算たいのですか?分散の90%を占めるようにしたいだけのように聞こえますが、これは計算がはるかに安くなるはずです。
ジェドブラウン

@JedBrownちょっとジェッド、あなたは完全に正しいです!私は、90%の分散を説明する人と、対応する固有ベクトル(後でテストデータセットを変換するため)にのみ興味があります。もっと安い方法を教えてください。
エンソムホダー

回答:


4

irlbaパッケージをお勧めします-svdとほぼ同じ結果を生成しますが、解決する特異値の数をより少なく定義できます。Netflix賞を解決するためにスパース行列を使用する例は、http//bigcomputing.blogspot.de/2011/05/bryan-lewiss-vignette-on-irlba-for-svd.htmlにあります。


コメントしてくれてありがとう。実際、私はそのビデオを見て、昨日irlbaパッケージも試しましたが、それは少数の特異値を計算するためだけに使用できるように思われました。ただし、投稿で述べたように、すべての特異値(120,000)を計算して、それらが占める分散に応じて適切な数のPCを選択したいと思います。この場合、irlbaはもはや適切ではないと思います。
エンソムホダー

SVAの結果をPCAと同様の方法で使用できますか?PCAを実行するために、SVDを実行する前にデータをセンタリングする必要はありませんか?
ザック

@Zach - SVDは( - prcomp参照PCAの背後にある主なアルゴリズムですstat.ethz.ch/R-manual/R-patched/library/stats/html/prcomp.htmlを)。データのセンタリングも、PCAを受ける前の標準的な手順ですが、質問に応じてさまざまなオプションがあります(たとえば、異なる種類のスケーリングも適用される場合があります)。
ボックス内のマーク

SVDの前にデータをセンタリングしない場合、どれくらいの取引になりますか?私はメモリに収まるスパース行列を持っていますが、センタリングするとメモリが収まらないほど大きくなります。
ザック

@Zach-サンプルを相互に関連付ける方法によって異なります。メモリの制限のために集中データを扱うことができない場合は、決定があなたのためになされていると思います。一般に、データのセンタリングとスケーリングは相関行列に作用するのに対し、データのセンタリングにはPCAがサンプルの共分散行列に作用します。これらの決定の詳細については、stats.stackexchange.comで質問するか、PCAに関する既存の回答を検索することを検討してください。
ボックス内のマーク

8

SLEPcを使用して部分的なSVDを計算することを勧めします。詳細については、ユーザーズマニュアルの第4章およびSVD のマニュアルページを参照してください。


1
彼はPCAを望んでいるため、SVDを計算する前にデータをセンタリングする必要があります。これにより、スパース性が破壊されます。SLEPcがこれに対応する方法はありますか?
dranxo

3
それはまばらで低ランクです。SLEPcは、マトリックスエントリを必要とせず、スパースマトリックスと修正として適用できる線形演算子のみを必要とします。
ジェドブラウン

2

私はmahoutに投票します。これは他のNLP / TAタスクにも役立ち、map / reduceを実装します。


はい、あなたは正しいです、mahoutはまさに私のロードマップにあります。しかし、私は事前にいくつかの「単純な」(と思われる)テクニックを使ってプロトタイプを作成することを好みます。
エンソムホダー

1

増分特異値分解を使用することをお勧めしますが、その多くは文献にあります。例えば:

  • マシューブランド1および2の技術レポートは、簡単にフォローできます。
  • クリス・ベイカーの修士論文、彼のソフトウェアIncPACK、およびインクリメンタルSVD方法に関する彼の後の論文
  • バンチとニールセンは、最も早い既知の論文を発表しました
  • ホールによる固有値問題1および2の更新に関する論文
  • LevyらによるKarhunen-Loeveの連続解析、これは基本的に同じことです

これらのアプローチはすべて次のようになります。

  • 小さなデータセットから始めます
  • 何らかの方法でSVDを計算します(この手順は、単一の列行列では簡単です)
  • 終了するまで繰り返します:
    • 新しいデータセットを追加する
    • 既存のSVDと更新ルールを使用して、新しいデータセットのSVDを計算する

N


0

Rを引き続き使用できます。

Revolution RRAMより大きいデータセットを処理するRのビルドです。関数を使用しますprincomp

また、RAMに適合しないビッグデータスタイルの問題(線形回帰、ロジスティック回帰、変位値など)向けに特別に設計された幅広い統計関数も備えています。

「私はアカデミック」ボックスにチェックを入れると、フル機能のアカデミックバージョンを無料でダウンロードできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.