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?