假设我在Scala Spark中有以下DataFrame,其中year year
值是一个字符串分类表示,但是数据中有一个顺序。
+-----+
|years|
+-----+
| 0-1|
| 1-2|
| 2-5|
| 5-10|
+-----+
我想创建一个结果成对矩阵,表示每对值的“距离”。相同的值被赋予了1
的分数,在最末端的值被赋予了例如的0
。"0-1“和"5-10”其余的值由线性模型填充:
我想要以下预期的结果(在DataFrame或类似的结构中查询对)
x/y, 0-1, 1-2, 2-5, 5-10,
0-1, 1 , 0.33, 0.67, 0,
1-2, 0.33, 1 , 0.33, 0.67,
2-5, 0.67, 0.33, 1 , 0.33,
5-10, 0 , 0.67, 0.33, 1
最后,对于给定的一对years
,我希望检索distance
值。我想避免硬编码这个解决方案,有没有更好的方法呢?
发布于 2019-02-15 12:41:01
只需将标签映射到点0 = 0/g, 1/g, 2/g, ... , g/g = 1
,其中g
是两个相邻标签之间的间距数,即标签数减1:
def similarityMatrix[A](xs: List[A]): Map[A, Map[A, Double]] = {
val numGaps = xs.size - 1
val positions = xs.zip((0 to numGaps).map(i => i.toDouble / numGaps)).toMap
def similarity(x: A, y: A) = 1.0 - math.abs(positions(x) - positions(y))
xs.map(x => (x, xs.map(y => (y, similarity(x, y))).toMap)).toMap
}
您的示例:
val ranges = List("0-1", "1-2", "2-5", "5-10")
val matrix = similarityMatrix(ranges)
for (x <- ranges) {
for (y <- ranges) {
printf("%4.2f ", matrix(x)(y))
}
println()
}
提供以下嵌套映射:
1.00 0.67 0.33 0.00
0.67 1.00 0.67 0.33
0.33 0.67 1.00 0.67
0.00 0.33 0.67 1.00
当然,适用于任何维度:
1.00 0.94 0.88 0.81 0.75 0.69 0.63 0.56 0.50 0.44 0.38 0.31 0.25 0.19 0.13 0.06 0.00
0.94 1.00 0.94 0.88 0.81 0.75 0.69 0.63 0.56 0.50 0.44 0.38 0.31 0.25 0.19 0.13 0.06
0.88 0.94 1.00 0.94 0.88 0.81 0.75 0.69 0.63 0.56 0.50 0.44 0.38 0.31 0.25 0.19 0.13
0.81 0.88 0.94 1.00 0.94 0.88 0.81 0.75 0.69 0.63 0.56 0.50 0.44 0.38 0.31 0.25 0.19
0.75 0.81 0.88 0.94 1.00 0.94 0.88 0.81 0.75 0.69 0.63 0.56 0.50 0.44 0.38 0.31 0.25
0.69 0.75 0.81 0.88 0.94 1.00 0.94 0.88 0.81 0.75 0.69 0.63 0.56 0.50 0.44 0.38 0.31
0.63 0.69 0.75 0.81 0.88 0.94 1.00 0.94 0.88 0.81 0.75 0.69 0.63 0.56 0.50 0.44 0.38
0.56 0.63 0.69 0.75 0.81 0.88 0.94 1.00 0.94 0.88 0.81 0.75 0.69 0.63 0.56 0.50 0.44
0.50 0.56 0.63 0.69 0.75 0.81 0.88 0.94 1.00 0.94 0.88 0.81 0.75 0.69 0.63 0.56 0.50
0.44 0.50 0.56 0.63 0.69 0.75 0.81 0.88 0.94 1.00 0.94 0.88 0.81 0.75 0.69 0.63 0.56
0.38 0.44 0.50 0.56 0.63 0.69 0.75 0.81 0.88 0.94 1.00 0.94 0.88 0.81 0.75 0.69 0.63
0.31 0.38 0.44 0.50 0.56 0.63 0.69 0.75 0.81 0.88 0.94 1.00 0.94 0.88 0.81 0.75 0.69
0.25 0.31 0.38 0.44 0.50 0.56 0.63 0.69 0.75 0.81 0.88 0.94 1.00 0.94 0.88 0.81 0.75
0.19 0.25 0.31 0.38 0.44 0.50 0.56 0.63 0.69 0.75 0.81 0.88 0.94 1.00 0.94 0.88 0.81
0.13 0.19 0.25 0.31 0.38 0.44 0.50 0.56 0.63 0.69 0.75 0.81 0.88 0.94 1.00 0.94 0.88
0.06 0.13 0.19 0.25 0.31 0.38 0.44 0.50 0.56 0.63 0.69 0.75 0.81 0.88 0.94 1.00 0.94
0.00 0.06 0.13 0.19 0.25 0.31 0.38 0.44 0.50 0.56 0.63 0.69 0.75 0.81 0.88 0.94 1.00
https://stackoverflow.com/questions/54702405
复制相似问题