【发布时间】:2016-07-29 06:40:51
【问题描述】:
我想计算我在 Spark 数据框中的两个变量 x 和 y 之间的 mutual information (MI),如下所示:
scala> df.show()
+---+---+
| x| y|
+---+---+
| 0| DO|
| 1| FR|
| 0| MK|
| 0| FR|
| 0| RU|
| 0| TN|
| 0| TN|
| 0| KW|
| 1| RU|
| 0| JP|
| 0| US|
| 0| CL|
| 0| ES|
| 0| KR|
| 0| US|
| 0| IT|
| 0| SE|
| 0| MX|
| 0| CN|
| 1| EE|
+---+---+
在我的例子中,x 恰好是事件是否正在发生 (x = 1) 或不发生 (x = 0),y 是国家代码,但这些变量可以代表任何东西。要计算 x 和 y 之间的 MI,我希望将上述数据框按 x, y 对分组,并添加以下三列:
-
x的出现次数 -
y的出现次数 -
x, y的出现次数
在上面的简短示例中,它看起来像
x, y, count_x, count_y, count_xy
0, FR, 17, 2, 1
1, FR, 3, 2, 1
...
然后我只需要计算每个 x, y 对的互信息项并将它们求和。
到目前为止,我已经能够按 x, y 对分组并聚合 count(*) 列,但我找不到添加 x 和 y 计数的有效方法。我目前的解决方案是将 DF 转换为数组并手动计算出现次数和同时出现次数。当y 是一个国家时,它运行良好,但当y 的基数变大时,它需要很长时间。关于如何以更 Sparkish 的方式做到这一点的任何建议?
提前致谢!
【问题讨论】:
标签: scala apache-spark