我正在寻找一个函数的合理定义,该函数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
)而不是一系列索引,那也将非常有用。