我有一个加权元素列表,我想选择一个概率反与其权重成比例的元素。
例如,在分别具有权重[a, b, c]
的列表[4, 3, 2]
中,我可以使用加权概率消除元素,直到我有一个1元素的列表,这是所选元素。在该算法中,在第一次迭代中,元素a
将以概率4/9
被消除。如果在第一轮中消除了a
,我们就会有一个权重为[b, c]
的数组[3, 2]
。从那里,元素b
将被概率3/5
消除。如果b
被删除,我们选择了元素c
。
在包含3个元素的情况下,选择c
的概率是消除a
和b
的概率。这与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?或者是否有单独的算法可用于选择与其权重成反比的元素?
答案 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