Как заставить Apache Spark Correlation вычислять автокорреляции? - PullRequest
0 голосов
/ 05 июня 2019

У меня есть серия, и я пытаюсь вычислить ее коэффициенты автокорреляции. К сожалению, Apache Spark предоставляет только Correlation API, и я не могу понять, как заставить его вычислять автокорры.

Например, из (1, 2, 3, 4, 5, 6) я хочу получить коэффициенты переменного тока прибл. (1, 0,5, 0,057, -0,27, -0,42, -0,357). Если я создаю матрицу, содержащую этот вектор и 5 его лагов, я получаю матрицу корреляций между этими 6 столбцами. Есть ли способ спроектировать набор данных для метода Corr Correlation, чтобы сделать то, что мне нужно? Вот некоторый код на Java:

import java.util.Arrays;
import java.util.List;

import org.apache.spark.ml.linalg.VectorUDT;
import org.apache.spark.ml.linalg.Vectors;
import org.apache.spark.ml.stat.Correlation;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.RowFactory;
import org.apache.spark.sql.SparkSession;
import org.apache.spark.sql.types.Metadata;
import org.apache.spark.sql.types.StructField;
import org.apache.spark.sql.types.StructType;

public class TestCorr {

public static void main(String[] args) {

    SparkSession spark = SparkSession.builder().appName("Test Corr").master("local").getOrCreate();
    spark.sparkContext().setLogLevel("OFF");

    List<Row> data = Arrays.asList(RowFactory.create(Vectors.dense(1, 2, 3, 4, 5, 6)),
            RowFactory.create(Vectors.dense(2, 3, 4, 5, 6, 0)), RowFactory.create(Vectors.dense(3, 4, 5, 6, 0, 0)),
            RowFactory.create(Vectors.dense(4, 5, 6, 0, 0, 0)), RowFactory.create(Vectors.dense(5, 6, 0, 0, 0, 0)),
            RowFactory.create(Vectors.dense(6, 0, 0, 0, 0, 0)));

    StructType schema = new StructType(new StructField[] { new StructField("features", new VectorUDT(), false, Metadata.empty()), });

    Dataset<Row> df = spark.createDataFrame(data, schema);
    Row r1 = Correlation.corr(df, "features").head();

    System.out.println("Pearson correlation matrix:\n" + r1.get(0));
}
}

Ожидаемый:

(1, 0.5, 0.057, -0.27, -0.42, -0.357)

Фактический:

1.0                     -4.395343283162434E-16  ... (6 total)
-4.395343283162434E-16  1.0                     ...
-0.5493502655735362     0.2927700218845599      ...
-0.7797157176571881     -0.09881760281284964    ...
-0.8042887954412292     -0.28077360852114025    ...
-0.6546536707079774     -0.3023715784073818     ...
...