Java中的快速矩阵计算

时间:2015-01-20 15:56:01

标签: java matrix covariance pca face-recognition

我基本上是在Java中进行人脸识别和验证,使用PCA和WMPCA进行测试。我已经完全实现了PCA,但运行速度非常慢,15分钟即可训练7900个图像数据集。

我已经看过最长延迟的位置,有些是不可避免的,例如预处理数据(获取面部区域,灰度,调整大小,存储)。然而主要的延迟是矩阵计算。

第一个大延迟是在协方差矩阵的计算过程中,然后从协方差矩阵中得到特征值和特征向量。我目前正在使用Apache库来实现这一点,但它似乎是单线程的,并且在计算时只消耗~15%的CPU。它运行速度很慢,虽然我找到了特征向量和特征值分解的可能替代方案,但我找不到用于协方差矩阵计算的替代快速库。

以下是我计算上述内容时的代码段:

    Log.append("Computing covariance matrix...");
    // Compute covariance
    RealMatrix matrix = new Covariance(new BlockRealMatrix(
        dataWithAverageSubtracted).transpose()).getCovarianceMatrix();

    Log.append("Computing eigen decomposition...");
    // Get the eigenvalues and eigenvectors
    EigenDecomposition eigen = new EigenDecomposition(matrix);

    eigenValues = eigen.getRealEigenvalues();
    // Transpose because rows need to be eigenvectors not columns
    vectors = eigen.getV().transpose().getData();

在获得权重和特征脸时,我使用Apache和Jama进行其他更通用的矩阵计算。这两个库都被审查得非常慢,我猜一个替代方案可能是像JBlas这样的库,但这只会加快这一部分。

我不想遇到长时间在每个库所需的数据格式之间进行转换的问题。

有没有人知道协方差矩阵计算的任何Java解决方案然后是特征分解?这似乎是主要的瓶颈。

1 个答案:

答案 0 :(得分:0)

这可能取决于操作的类型,但是在较低级别的语言(例如C)中繁重的计算可能会更快。您应该尝试对它们进行基准测试,如果增益足够重要,您可以使用JNI来连接C来自Java的例程。

此类优化目前在一些众所周知的应用程序中使用,例如Tomcat。