【发布时间】:2014-08-07 18:18:31
【问题描述】:
问题:我需要从由某些权重构成的离散分布中进行采样,例如{w1,w2,w3,..},因此概率分布 {p1,p2,p3,...},其中 pi=wi/(w1+w2+...)。
一些 wi 的变化非常频繁,但在所有 wi 中只占非常低的比例。但是分布本身因此每次发生时都必须重新规范化,因此我认为 Alias 方法不能有效地工作,因为每次都需要从头开始构建整个分布。
我目前正在考虑的方法是二叉树(堆方法),其中所有wi都保存在最低级别,然后将每两个之和保存在更高级别,依此类推。它们的总和将处于最高水平,这也是一个归一化常数。因此,为了在 wi 变化后更新树,需要进行 log(n) 变化,以及相同数量的变化才能从分布中获取样本。
问题:
第一季度。您对如何更快地实现它有更好的想法吗? Q2。最重要的部分:我正在寻找一个已经这样做的库。
说明:几年前我自己就这样做了,通过在向量中构建堆结构,但从那时起我学到了很多东西,包括发现库(:))和容器,如地图......现在我需要用更高的功能重写代码,这次我想把它改正:
所以 Q2.1 有一个很好的方法可以让 c++ 映射不是按索引排序和搜索,而是按其元素的累积总和(这就是我们的采样方式,对吧?...)。 (这是我目前的理论我想怎么做,但不一定要这样......)
Q2.2 也许有更好的方法来做同样的事情?我相信这个问题是如此频繁,以至于我很惊讶我找不到某种可以为我解决问题的库......
非常感谢,如果有人以其他形式提出这个问题,我很抱歉,请指导我,但我花了很长时间寻找......
-z
编辑:我可能还需要删除或添加元素,但我认为我可以避免它,如果这会产生巨大的差异,因此只需要更改值权重。
Edit2:权重通常是实数,我不得不考虑是否可以将它们设为整数...
【问题讨论】:
标签: c++ statistics distribution probability sampling