【问题标题】:Computing Pointwise Mutual Information in Spark在 Spark 中计算逐点互信息
【发布时间】: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 piipi 计算 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 存储在 pipii 中来优化日志,但选择这种方式来保持问题清晰。

【问题讨论】:

    标签: apache-spark apache-spark-mllib


    【解决方案1】:

    使用broadcast 将是一个解决方案。

    val bcPi = pi.context.broadcast(pi.collectAsMap())
    val pmi = pii.map {
      case ((x, y), pxy) =>
        (x, y) -> computePMI(pxy, bcPi.value.get(x).get, bcPi.value.get(y).get)
    }
    

    假设:pipii 中包含所有xy

    【讨论】:

      猜你喜欢
      • 2016-06-21
      • 2012-11-09
      • 1970-01-01
      • 2018-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-14
      • 2016-05-28
      相关资源
      最近更新 更多