2017-05-29 5 views
2

Ich arbeite an einem Projekt, wo ich einige K-Means-Clustering mit MLlib von Spark tun muss. Das Problem ist, dass meine Daten 744 Funktionen haben. Ich habe etwas recherchiert und herausgefunden, dass PCA genau das ist, was ich brauche. Der beste Teil ist, dass Spark PCA implementiert wurde, also entschied ich mich dafür.Spark Hauptkomponentenanalyse (PCA) erwartete Ergebnisse

double[][] array=new double[381][744]; 
     int contor=0; 
     for (Vector vectorData : parsedTrainingData.collect()) { 
      contor++; 
      array[contor]=vectorData.toArray(); 
     } 

     LinkedList<Vector> rowsList = new LinkedList<>(); 
     for (int i = 0; i < array.length; i++) { 
      Vector currentRow = Vectors.dense(array[i]); 
      rowsList.add(currentRow); 
     } 
     JavaRDD<Vector> rows = jsc.parallelize(rowsList); 

     // Create a RowMatrix from JavaRDD<Vector>. 
     RowMatrix mat = new RowMatrix(rows.rdd()); 

     // Compute the top 3 principal components. 
     Tuple2<Matrix, Vector> pc = mat.computePrincipalComponentsAndExplainedVariance(*param*); 

     RowMatrix projected = mat.multiply(pc._1); 
     // $example off$ 
     Vector[] collectPartitions = (Vector[]) projected.rows().collect(); 
     System.out.println("Projected vector of principal component:"); 
     for (Vector vector : collectPartitions) { 
      System.out.println("\t" + vector); 
     } 
     System.out.println("\n Explanend Variance:"); 
     System.out.println(pc._2); 
     double sum = 0; 

     for (Double val : pc._2.toArray()) { 
      sum += val; 

     } 
     System.out.println("\n the sum is: " + (double) sum); 

Über die Daten, die ich will PCA anwenden Ich habe 744 Funktionen, die von Sensoren in einem Haus auf jede Stunde gesammelt Werte (Gesamt Sekunden der aktiven Zeit) darstellt, so ist es so etwas wie (31 Sensoren 24 * h), im Format (s (sensorNumber) (Stunde): s10, s11 ..... s123, s20, s21 .... 223, ..... s3123.

Von dem, was ich darunter verstehe . die Kriterien für eine Reduktion auf einen Großteil der Informationen nicht zu verlieren ist die Summe der erklärten Varianz größer 0,9 (90%) zu sein nach einigen Tests habe ich diese Ergebnisse:

*pram* sum 
    100 0.91 
    150 0.97 
    200 0.98 
    250 0.99 
    350 1 

Also von dem, was ich verstehe, wird es sicher sein, meinen 744-Merkmalsvektor auf einen Vektor mit 100 Merkmalen zu reduzieren. Mein Problem ist, dass dieses Ergebnis gut aussieht, um wahr zu sein. Ich suche nach einigen Beispielen, um Anleitung zu bekommen, aber ich bin mir immer noch nicht sicher, ob das, was ich getan habe, richtig ist. Ist das Ergebnis plausibel?

Antwort

0

Da PCA ein Dimensionsreduzierungsalgorithmus ist, ist es plausibel, dass dies der Fall ist. Es hängt sehr davon ab, was Sie vorherzusagen versuchen und mit welchen Daten Sie trainieren müssen.

PCA wird häufig in der Gesichtserkennung verwendet, da Sie nur einige Feature-Werte benötigen, um zwischen neuen Seiten zu unterscheiden. In einem Gesichtserkennungsprogramm verwendete ich 4 Merkmalsvektoren aus einer Auswahl von 50, um den Besitzer immer noch genau zu klassifizieren.

Einige Leute verwenden 10%, andere wählen alle Werte mit einem bestimmten Wert, es gibt eine sehr gute Diskussion über die Auswahl von Features in einem anderen Thread here.