Ожидаемый результат анализа основных компонентов Spark (PCA)
Я работаю над проектом, в котором мне нужно выполнить кластеризацию K-средних с MLlib от Spark. Проблема в том, что мои данные имеют 744 особенности. Я провел небольшое исследование и обнаружил, что мне нужен PCA. Самое приятное, что Spark PCA реализован, поэтому я решил сделать это.
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);
О данных, которые я хочу применить PCA У меня есть 744 функции, которые представляют значения (общее количество секунд активного времени), собираемые датчиками в доме каждый час, так что это что-то вроде (31 датчик * 24 ч) в формате (с). (номер датчика)(час): s10, s11.....s123, s20, s21....223,.....s3123.
Из того, что я понимаю, одним из критериев сокращения, чтобы не потерять большую часть информации, является сумма объясненной дисперсии, которая должна быть больше 0,9 (90%). После некоторых испытаний я получил следующие результаты:
*pram* sum
100 0.91
150 0.97
200 0.98
250 0.99
350 1
Итак, насколько я понимаю, будет безопасно уменьшить мой вектор 744 объектов до вектора 100 объектов. Моя проблема в том, что этот результат выглядит хорошо, чтобы быть правдой. Я ищу некоторые примеры, чтобы иметь руководство, но я все еще не уверен, правильно ли то, что я сделал. Так это правдоподобные результаты?