首页 > 解决方案 > 如何计算与 Spark 的 Spearman 相关系数?我无法从统计书中复制样本

问题描述

为了训练自己进行Spark经典统计分析,我正在尝试执行一些书籍中的样本(中性统计书籍:不专门用于计算或 Spark)。

书中的样本提供了计算两位评委给十名运动员做笔记的斯皮尔曼相关系数:

| 法官 1 | 8.3 | 7.6 | 9.1 | 9.5 | 8.4 | 6.9 | 9.2 | 7.8 | 8.6 | 8.2
| 法官 2 | 7.9 | 7.4 | 9.1 | 9.3 | 8.4 | 7.5 | 9.0 | 7.2 | 8.2 | 8.1

创建等级的中间矩阵,
    | 法官 1 | 5 | 2 | 8 | 10 | 6 | 1 | 9 | 3 | 7 | 4
    | 法官 2 | 4 | 2 | 9 | 10 | 7 | 3 | 8 | 1 | 6 | 5

书中的示例最终以以下结果结束:

r = 0.915

根据 Correlation 的 API 文档,我尝试用Spark这种方式实现它:

List<Row> data = Arrays.asList(
   RowFactory.create(Vectors.dense(8.3, 7.6, 9.1, 9.5, 8.4, 6.9, 9.2, 7.8, 8.6, 8.2)),
   RowFactory.create(Vectors.dense(7.9, 7.4, 9.1, 9.3, 8.4, 7.5, 9.0, 7.2, 8.2, 8.1))
);

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

Dataset<Row> df = this.session.createDataFrame(data, schema);

Row r2 = Correlation.corr(df, "features", "spearman").head();
System.out.println("Spearman correlation matrix:\n" + r2.get(0).toString());

但它不会给我一个系数。相反,另一个对我来说似乎很奇怪的矩阵:

Spearman correlation matrix:
1.0                  0.9999999999999998   NaN  ... (10 total)
0.9999999999999998   1.0                  NaN  ...
NaN                  NaN                  1.0  ...
0.9999999999999998   0.9999999999999998   NaN  ...
NaN                  NaN                  NaN  ...
-0.9999999999999998  -0.9999999999999998  NaN  ...
0.9999999999999998   0.9999999999999998   NaN  ...
0.9999999999999998   0.9999999999999998   NaN  ...
0.9999999999999998   0.9999999999999998   NaN  ...
0.9999999999999998   0.9999999999999998   NaN  ...

我是新来的MLib,在统计方面并不那么强。很明显,我做错了事。

我在这里看到了什么,而不是我的预期,
我该如何实现我想要的结果?

标签: javaapache-sparkstatisticsapache-spark-mllib

解决方案


这个问题的解决方案的一部分是令人羞耻的......
我只是把向量放在错误的一边。而这一点,更正:

List<Row> data = Arrays.asList(
   RowFactory.create(Vectors.dense(8.3, 7.9)),
   RowFactory.create(Vectors.dense(7.6, 7.4)),
   RowFactory.create(Vectors.dense(9.1, 9.1)),
   RowFactory.create(Vectors.dense(9.5, 9.3)),
   RowFactory.create(Vectors.dense(8.4, 8.4)),
   RowFactory.create(Vectors.dense(6.9, 7.5)),
   RowFactory.create(Vectors.dense(9.2, 9.0)),
   RowFactory.create(Vectors.dense(7.8, 7.2)),
   RowFactory.create(Vectors.dense(8.6, 8.2)),
   RowFactory.create(Vectors.dense(8.2, 8.1))
);

相关性 entre les notes des deux juges pour les sportifs :
1.0 0.9151515151515153
0.9151515151515153 1.0


推荐阅读