当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. 在我的情况下(是否在应用t-sne之前),是否存在一种比PCA更快的替代降维方法?我正在寻找可以在Java中轻松实现的东西。

Answers:


8

XRn×pXTX=QΛQTZRm×pZQZ,以及一般的矩阵摄动理论(如果可以掌握副本,请参考Stewart和Sun的1990年教科书)。

krARPACK

问题3:我不知道Java实现任何事情,但这个主题讨论加快PCA一样这个 CV线程。关于此类事物有大量研究,并且存在使用低秩近似或随机化之类的大量方法。


3

您正在使用的代码将反转整个矩阵。这可能已经是O(p ^ 3)了。您可以将结果近似为O(p ^ 2),但仍然会很慢(但可能快100倍)。本质上,取任意向量并进行幂迭代。您很有可能会很好地近似第一个特征向量。然后从矩阵中删除该因子,重复以获得第二个因子。等等。

但是,您是否尝试过ELKI中快速的Barnes Hut tSNE实现是否可能仅对带有索引的数据(例如覆盖树)起作用?当其他人失败时,我的实施效果很好。


3
什么是“ whp”。代表?
Kodiologist's

可能性很高。参见统计资料。
已退出-Anony-Mousse

2

mlibn×KK×pK×p

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.