如何在Python中进行加权随机抽样类别
给定一个包含多个元组的列表,每个元组里有一个概率和一个物品,我想根据这个概率来随机选择一个物品。例如,给定列表 [ (.3, 'a'), (.4, 'b'), (.3, 'c')],我希望能有 40% 的机会选择到 'b'。
在 Python 中,有什么标准的方法可以做到这一点呢?
我查过随机模块,但似乎没有合适的函数;还有 numpy.random,虽然它有一个多项式函数,但结果看起来不太适合这个问题。我基本上是在寻找类似于 Matlab 中的 mnrnd 的东西。
非常感谢。
谢谢大家这么快就给出了答案。为了澄清一下,我并不是在寻找如何编写采样方案的解释,而是希望能找到一个简单的方法,从给定的物品和权重中进行多项分布的采样,或者被告知在标准库中没有这样的函数,所以需要自己编写一个。
9 个回答
14
因为没有人使用过 numpy.random.choice 这个函数,所以这里有一个可以在一行代码里生成你需要的东西的函数:
numpy.random.choice(['a','b','c'], size = 20, p = [0.3,0.4,0.3])
19
这可能就是你想要的效果:
numpy.array([.3,.4,.3]).cumsum().searchsorted(numpy.random.sample(5))
11
import numpy
n = 1000
pairs = [(.3, 'a'), (.3, 'b'), (.4, 'c')]
probabilities = numpy.random.multinomial(n, zip(*pairs)[0])
result = zip(probabilities, zip(*pairs)[1])
# [(299, 'a'), (299, 'b'), (402, 'c')]
[x[0] * x[1] for x in result]
# ['aaaaaaaaaa', 'bbbbbbbbbbbbbbbbbbb', 'cccccccccccccccccccc']
你希望以什么方式收到结果呢?