根据反向权重

时间:2018-06-08 15:31:28

标签: algorithm

我有一个加权元素列表,我想选择一个概率与其权重成比例的元素。

例如,在分别具有权重[a, b, c]的列表[4, 3, 2]中,我可以使用加权概率消除元素,直到我有一个1元素的列表,这是所选元素。在该算法中,在第一次迭代中,元素a将以概率4/9被消除。如果在第一轮中消除了a,我们就会有一个权重为[b, c]的数组[3, 2]。从那里,元素b将被概率3/5消除。如果b被删除,我们选择了元素c

在包含3个元素的情况下,选择c的概率是消除ab的概率。这与a然后b被消除的概率加上b然后a被消除的概率相同或

(
    // a eliminated first
    w(a) / (w(a) + w(b) + w(c)) *
    // b eliminated second
    w(b) / (w(b) + w(c))
) +
(
    // b eliminated first
    w(b) / (w(a) + w(b) + w(c)) *
    // a eliminated second
    w(a) / (w(a) + w(c))
)

有没有办法快速计算每个单独元素的概率,无论列表中的元素数量是多少,并确认概率总和为1?或者是否有单独的算法可用于选择与其权重成反比的元素?

1 个答案:

答案 0 :(得分:2)

要以与某些权重成反比的概率进行采样,您可以等效地采样与这些权重的倒数成比例的概率。因此,我们首先反转所有权重,对权重进行归一化,使它们总和为1(形成概率分布),然后通常从该分布中进行采样。

这里有一些Python式的伪代码:

weights = [1.0 / w for w in weights]           # Invert all weights
sum_weights = sum(weights)
weights = [w / sum_weights for w in weights]   # Normalize weights
return numpy.random.choice(options, p=weights) # Sample

或者在numpy:

weights = numpy.reciprocal(weights)            # Invert all weights
weights = weights / numpy.sum(weights)         # Normalize
return numpy.random.choice(options, p=weights) # Sample