【发布时间】:2014-11-24 18:03:25
【问题描述】:
我在 mongodb 中有一组文档,我想计算某些属性的 CDF 并将其返回或存储在数据库中。显然,为每个文档添加一个新属性并不是一个好方法,我可以使用以后可以使用的近似值。这更像是一个理论问题。
所以我开始使用 mapreduce 作业计算离散间隔上的 CDF 采样,如下所示(只是算法):
- 获取属性
someAttr的count、min和max - 假设
min = 5、max=70、count = 200。 - 在
map():for (i=this.someAttr; i < max+1; i++) { emit(i, 1) } - 在
reduce()中只返回每个键的总和。 - 在
finalize()中,将减少的输出除以记录数:return val / count。
不过,这确实会输出包含来自 CDF 的样本的集合..
如您所见,这里的间隔步骤是1,但这种方法的巨大效率低下是即使从单个文档(即使集合中只有少数文档)也会有大量的发射,因此这显然是不可扩展的,并且行不通。
输出如下:
{ _id: 5, val: 0}
{ _id: 6, val: 0.04}
{ _id: 7, val: 0.04}
...
{ _id: 71, val: 1.0}
从这里我可以很容易地得到任何值的 CDF 的近似值,如果合理的话,甚至可以在它们之间进行插值。
有人可以告诉我如何使用 MapReduce(或者可能不使用 MapReduce)计算 CDF(样本)吗?
【问题讨论】: