我正在寻找函数weighted_sample
的合理定义,它不会只为给定的权重列表返回一个随机索引(可能是这样的
def weighted_choice(weights, random=random):
""" Given a list of weights [w_0, w_1, ..., w_n-1],
return an index i in range(n) with probability proportional to w_i. """
rnd = random.random() * sum(weights)
for i, w in enumerate(weights):
if w<0:
raise ValueError("Negative weight encountered.")
rnd -= w
if rnd < 0:
return i
raise ValueError("Sum of weights is not positive")
给出一个具有恒定权重的分类分布),而是其中的k
的随机样本,没有替换,就像random.sample
与random.choice
相比一样。
就像weighted_choice
可以被写成
lambda weights: random.choice([val for val, cnt in enumerate(weights)
for i in range(cnt)])
weighted_sample
可以写成
lambda weights, k: random.sample([val for val, cnt in enumerate(weights)
for i in range(cnt)], k)
但我想要一个不需要我将权重分解成一个(可能很大的)列表的解决方案。
编辑:如果有任何很好的算法可以给我返回一个直方图/频率列表(格式与参数weights
相同),而不是一系列索引,那也是非常有用的。
https://stackoverflow.com/questions/13047806
复制相似问题