12

我需要用 Java 实现 PCA。我有兴趣找到有据可查、实用且易于使用的东西。有什么建议吗?

4

5 回答 5

17

现在有许多用于 Java 的主成分分析实现。

  1. Apache Spark:https ://spark.apache.org/docs/2.1.0/mllib-dimensionality-reduction.html#principal-component-analysis-pca

    SparkConf conf = new SparkConf().setAppName("PCAExample").setMaster("local");
    try (JavaSparkContext sc = new JavaSparkContext(conf)) {
        //Create points as Spark Vectors
        List<Vector> vectors = Arrays.asList(
                Vectors.dense( -1.0, -1.0 ),
                Vectors.dense( -1.0, 1.0 ),
                Vectors.dense( 1.0, 1.0 ));
    
        //Create Spark MLLib RDD
        JavaRDD<Vector> distData = sc.parallelize(vectors);
        RDD<Vector> vectorRDD = distData.rdd();
    
        //Execute PCA Projection to 2 dimensions
        PCA pca = new PCA(2); 
        PCAModel pcaModel = pca.fit(vectorRDD);
        Matrix matrix = pcaModel.pc();
    }
    
  2. ND4J:https ://deeplearning4j.org/api/latest/org/nd4j/linalg/dimensionalityreduction/PCA.html

    //Create points as NDArray instances
    List<INDArray> ndArrays = Arrays.asList(
            new NDArray(new float [] {-1.0F, -1.0F}),
            new NDArray(new float [] {-1.0F, 1.0F}),
            new NDArray(new float [] {1.0F, 1.0F}));
    
    //Create matrix of points (rows are observations; columns are features)
    INDArray matrix = new NDArray(ndArrays, new int [] {3,2});
    
    //Execute PCA - again to 2 dimensions
    INDArray factors = PCA.pca_factor(matrix, 2, false);
    
  3. Apache Commons Math(单线程;无框架)

    //create points in a double array
    double[][] pointsArray = new double[][] { 
        new double[] { -1.0, -1.0 }, 
        new double[] { -1.0, 1.0 },
        new double[] { 1.0, 1.0 } };
    
    //create real matrix
    RealMatrix realMatrix = MatrixUtils.createRealMatrix(pointsArray);
    
    //create covariance matrix of points, then find eigenvectors
    //see https://stats.stackexchange.com/questions/2691/making-sense-of-principal-component-analysis-eigenvectors-eigenvalues
    
    Covariance covariance = new Covariance(realMatrix);
    RealMatrix covarianceMatrix = covariance.getCovarianceMatrix();
    EigenDecomposition ed = new EigenDecomposition(covarianceMatrix);
    

请注意,奇异值分解也可用于查找主成分,具有等效的实现。

于 2017-05-06T10:34:33.430 回答
7

这是一个:PCA 类

此类包含使用 varimax 旋转进行基本主成分分析所需的方法。选项可用于使用协方差或相关矩阵进行分析。使用蒙特卡罗模拟进行并行分析。基于大于一、大于蒙特卡洛特征值百分位数或大于蒙特卡洛特征值均值的特征值的提取标准是可用的。

于 2012-05-15T16:04:42.970 回答
2

检查http://weka.sourceforge.net/doc.stable/weka/attributeSelection/PrincipalComponents.html weka 实际上有许多其他算法可以与 PCA 一起使用,而且 weka 不时添加更多算法。所以我的事情,如果你正在使用java然后切换到weka api。

于 2013-07-21T02:36:17.540 回答
2

Smile是一个成熟的 Java 机器学习库。你试试它的 PCA 实现。请看:https ://haifengl.github.io/smile/api/java/smile/projection/PCA.html

还有带有微笑的PCA教程,但该教程使用了 Scala。

于 2018-01-25T20:07:56.667 回答
1

您可以在 DataMelt 项目中看到一些 PCA 的实现:

https://jwork.org/dmelt/code/index.php?keyword=PCA

(它们在 Jython 中重写)。它们包括一些用于降维的图形示例。它们展示了几个 Java 包的用法,例如 JSAT、DatumBox 等。

于 2018-06-10T04:15:05.390 回答