2012-05-15 20 views
8

Necesito la implementación de PCA en Java. Estoy interesado en encontrar algo que esté bien documentado, práctico y fácil de usar. ¿Alguna recomendación?Implementación de PCA en Java

Respuesta

8

Aquí hay uno: PCA Class.

Esta clase contiene los métodos necesarios para un análisis básico de componentes principales con una rotación varimax. Las opciones están disponibles para un análisis utilizando la covarianza o la correlación martix. Se realiza un análisis paralelo, usando simulaciones de Monte Carlo. Se encuentran disponibles criterios de extracción basados ​​en valores propios mayores que la unidad, mayores que un percentil de autovalores de Monte Carlo o mayores que los valores propios de Monte Carlo.

8

Ahora hay una serie de implementaciones de análisis de componentes principales para 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: http://nd4j.org/doc/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 (single roscado; sin marco)

    //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 eigen vectors 
    //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); 
    

Nota: La Descomposición de valores singulares, que también se puede usar para encontrar componentes principales, tiene implementaciones equivalentes.