問題の設定
高次元(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分、これは、この段階で許容できるよりもはるかに長い時間です)。
私が見ているように、私の選択肢は、PCAを「最適化」するか、本質的に高速な別の次元削減方法を選択することです。
私の質問
- PCAを「オフライン」で使用できるという希望はありますか?つまり、画像の大規模なデータセットを使用し、それらに対してPCAを実行してから、それらに対して計算された主成分を使用して、他の(新しい!)データポイントの次元を削減しますか?
- 上位100の主成分のみにのみ関心があることを事前に知っていると仮定して、固有ベクトルの計算を高速化できますか?
- PCAよりも高速になる、私の場合(つまり、t-sneを適用する前)に適切な代替の次元削減方法はありますか?Javaで簡単に実装できるものを探しています。