У меня есть серия, и я пытаюсь вычислить ее коэффициенты автокорреляции. К сожалению, 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 ...