11

次元 50000 の約 1000 個のベクトル x_i がありますが、それらは非常にまばらです。それぞれに約 50 ~ 100 個の非ゼロ要素しかありません。このデータセット (MATLAB) で PCA を実行して、データの不要な極端な次元を削減したいと考えています。

残念ながら、すべての例から平均を差し引く必要があるため、中間の完全な行列なしでこれを行う方法はわかりません。そしてもちろん、1000x50000 のマトリックスは大きすぎてメモリに収まりません (試してみると、何らかの理由でコンピューター全体が実際にクラッシュします)。Matlab のビルトインprincompも、使用しようとするとコンピューターがクラッシュします。

私の質問は次のとおりです。中間ステップとして大規模な非疎行列を必要とせずに、このデータに対して PCA を実行する方法はありますか?

4

6 に答える 6

6

平均を減算するため、または共分散行列を計算するために、完全なデータ行列を作成する必要はありません。1000x1000の共分散行列を繰り返し計算するだけです(データベクトルをループします)。共分散行列を作成したら、共分散行列を中央に配置することで、平均暗黙的に減算できます。カーネル行列を中央に配置する方法を説明しているカーネルPCAに関するこのペーパーの最後のセクションを参照してください。基本的に共分散行列と同じカーネル行列を考えてみてください。

于 2012-11-19T18:12:58.860 に答える
1

上記のデータセットの PCA を計算するには、アルゴリズムで 1000x1000 の共分散行列を操作するだけで済みます。これは、ほとんどの PCA 実装にとって大したことではないと思います。Windows 7 コンピューターを使用している場合は、PCA の 64 ビット実装を試すことができます。Matlab が 64 ビット PCA をサポートしているかどうかはわかりませんが、VisuMap のようなアプリケーションはそれらのケースを簡単に処理できます。

于 2012-11-20T04:31:07.403 に答える
1

次の戦略が機能します。

[~,~,PC] = svds(X,k);
mu = mean(X);
S = sparse(size(X,1),k);
for i=1:size(X,1)
    S(i,:) = (X(i,:)-mu)*PC;
end

の右特異ベクトルXは の固有ベクトルでありcov(X,1)、したがって の主成分ですX。主成分スコアを一度に計算するのではなくインスタンスごとに計算することで、スパースからフルへの移行に伴うメモリ オーバーフローを回避できます。必ず作るだけで大​​丈夫k<<pです。

于 2014-11-21T02:32:45.333 に答える
0

まず、平均を差し引くために共分散行列は必要ありません。

次に、PCを計算するには、この質問への回答を参照してください。

于 2012-11-17T03:13:51.717 に答える
0

を使用する必要はありませんprincompこの回答は、 でそれを行う方法を説明しますeig。に置き換えeigますeigs

于 2012-11-16T23:44:54.477 に答える
0

トップ PC については、反復 PCAを参照してください。これは 50k 密度の合計を累積します。50k スパース、動作するはずです。
2 番目のものについては、最初のものをオンザフライで減算します。つまり、インスタンス化せずに (X - U1 d1 Vt1) を使用します。
(ランダム化された PCAは、Python scikit-learn でそれを行います。Matlab はわかりません。)

于 2012-11-19T11:12:35.713 に答える