问题设定
我有高维度(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个主要成分感兴趣,是否可以加快特征向量的计算?
- 在我的情况下(是否在应用t-sne之前),是否存在一种比PCA更快的替代降维方法?我正在寻找可以在Java中轻松实现的东西。