n、pの両方が大きい場合、PCAが遅すぎる:代替案?


9

問題の設定

高次元(4096)のデータポイント(画像)があり、それを2Dで視覚化しようとしています。この目的のために、私はKarpathyによる次のコード例のような方法でt- sneを使用しています。

scikit-学ぶドキュメントは、最初のデータの次元を下げるためにPCAを使用することをお勧めします:

特徴の数が非常に多い場合は、別の次元削減方法(たとえば、密なデータの場合はPCA、疎なデータの場合はTruncatedSVD)を使用して、次元数を妥当な量(たとえば50)に減らすことを強くお勧めします。

私はこのコードをDarks.LiuによってJavaでPCAを実行するために使用しています:

//C=X*X^t / m
DoubleMatrix covMatrix = source.mmul(source.transpose()).div(source.columns);
ComplexDoubleMatrix eigVal = Eigen.eigenvalues(covMatrix);
ComplexDoubleMatrix[] eigVectorsVal = Eigen.eigenvectors(covMatrix);
ComplexDoubleMatrix eigVectors = eigVectorsVal[0];
//Sort sigen vector from big to small by eigen values 
List<PCABean> beans = new ArrayList<PCA.PCABean>();
for (int i = 0; i < eigVectors.columns; i++) {
    beans.add(new PCABean(eigVal.get(i).real(), eigVectors.getColumn(i)));
}
Collections.sort(beans);
DoubleMatrix newVec = new DoubleMatrix(dimension, beans.get(0).vector.rows);
for (int i = 0; i < dimension; i++) {
    ComplexDoubleMatrix dm = beans.get(i).vector;
    DoubleMatrix real = dm.getReal();
    newVec.putRow(i, real);
}
return newVec.mmul(source);

これは線形代数演算にjblasを使用します。これは、私が読んだものから、最も高速なオプションであるはずです。ただし、固有ベクトルと固有値(3、4行目)を計算することは、非常に大きなボトルネックになることがわかります(〜10分、これは、この段階で許容できるよりもはるかに長い時間です)。

O(n3)

私が見ているように、私の選択肢は、PCAを「最適化」するか、本質的に高速な別の次元削減方法を選択することです。

私の質問

  1. PCAを「オフライン」で使用できるという希望はありますか?つまり、画像の大規模なデータセットを使用し、それらに対してPCAを実行してから、それらに対して計算された主成分を使用して、他の(新しい!)データポイントの次元を削減しますか?
  2. 上位100の主成分のみにのみ関心があることを事前に知っていると仮定して、固有ベクトルの計算を高速化できますか?
  3. PCAよりも高速になる、私の場合(つまり、t-sneを適用する前)に適切な代替の次元削減方法はありますか?Javaで簡単に実装できるものを探しています。

回答:


8

XRn×pXTX=QΛQTZRm×pZQZ、および一般的な行列摂動理論(コピーを入手できる場合は、Stewart and Sunの1990年のテキストが標準的なリファレンスです)。

krARPACK

質問3:Java実装については何も知りませんが、このスレッドでは、この CVスレッドと同様にPCAの高速化について説明します。この種のことについてはたくさんの研究があり、低ランクの近似やランダム化のようなものを使う方法はたくさんあります。


3

使用しているコードは、マトリックス全体を反転させます。これはおそらくすでにO(p ^ 3)です。O(p ^ 2)で結果を概算できますが、それでも遅くなります(ただし、おそらく100倍速くなります)。基本的に、任意のベクトルを使用して、べき乗を繰り返します。高い確率で、最初の固有ベクトルの適切な近似が得られます。次に、この係数をマトリックスから削除し、繰り返して2番目を取得します。等。

しかし、ELKIの高速なBarnes Hut tSNE実装が、カバーツリーなどのインデックスを使用してデータを処理するだけでよいかどうかを試しましたか?他の人が失敗したとき、私はその実装をうまく機能させました。


3
「whp」とは何ですか。立つ?
コディオロジスト2017年

高い確率で。統計資料を参照してください。
QUITあり-Anony-Mousse 2017年

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