Ожидаемый результат анализа основных компонентов 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 объектов. Моя проблема в том, что этот результат выглядит хорошо, чтобы быть правдой. Я ищу некоторые примеры, чтобы иметь руководство, но я все еще не уверен, правильно ли то, что я сделал. Так это правдоподобные результаты?

0 ответов

Другие вопросы по тегам