【发布时间】:2015-04-14 06:11:27
【问题描述】:
我正在尝试计算 pointwise mutual information (PMI)。
我在这里定义了两个 RDD,分别用于 p(x, y) 和 p(x):
pii: RDD[((String, String), Double)]
pi: RDD[(String, Double)]
我为从 RDD pii 和 pi 计算 PMI 而编写的任何代码都不漂亮。我的方法是首先将 RDD pii 展平,然后在按摩元组元素的同时加入 pi 两次。
val pmi = pii.map(x => (x._1._1, (x._1._2, x._1, x._2)))
.join(pi).values
.map(x => (x._1._1, (x._1._2, x._1._3, x._2)))
.join(pi).values
.map(x => (x._1._1, computePMI(x._1._2, x._1._3, x._2)))
// pmi: org.apache.spark.rdd.RDD[((String, String), Double)]
...
def computePMI(pab: Double, pa: Double, pb: Double) = {
// handle boundary conditions, etc
log(pab) - log(pa) - log(pb)
}
显然,这很糟糕。有没有更好的(惯用的)方法来做到这一点?
注意:我可以通过将 log-probs 存储在 pi 和 pii 中来优化日志,但选择这种方式来保持问题清晰。
【问题讨论】:
标签: apache-spark apache-spark-mllib