最近我需要从列表中加权随机选择元素,无论是否有替换.虽然有未知加权选择的众所周知和良好的算法,有些用于无替换的加权选择(例如修改算法),我找不到任何好的算法用于替换加权选择.我也想避免使用resevoir方法,因为我选择了列表中的一小部分,这个小部分足够小以容纳在内存中.
有没有人对这种情况下的最佳方法有任何建议?我有自己的解决方案,但我希望找到更高效,更简单或两者兼而有之的方法.
如果我在列表中有一组项目.我想根据另一个权重列表从该列表中进行选择.
例如我的收藏是['one', 'two', 'three']和权重[0.2, 0.3, 0.5],我希望这个方法在所有抽奖的大约一半中给我'三'.
最简单的方法是什么?
import random
pos = ["A", "B", "C"]
x = random.choice["A", "B", "C"]
Run Code Online (Sandbox Code Playgroud)
这段代码给了我"A","B"或"C"的概率相等.当你想要30%的"A",40%的"B"和30%概率的"C"时,是否有一种很好的表达方式?
我有一个字典,其中每个键都有一个可变长度列表,例如:
d = {
'a': [1, 3, 2],
'b': [6],
'c': [0, 0]
}
Run Code Online (Sandbox Code Playgroud)
是否有一种干净的方法来获取随机字典键,按其值的长度加权?
random.choice(d.keys())将对键进行相同的加权,但在上面的情况下,我希望'a'大约一半的时间返回.
给出一个元组列表,其中每个元组由概率和项目组成,我想根据其概率对项目进行抽样.例如,给出列表[(.3,'a'),(.4,'b'),(.3,'c')]我想在40%的时间内对'b'进行采样.
在python中执行此操作的规范方法是什么?
我已经查看了似乎没有适当函数的随机模块和numpy.random,虽然它有一个多项函数但似乎没有以一个很好的形式返回结果来解决这个问题.我基本上在matlab中寻找像mnrnd这样的东西.
非常感谢.
非常感谢所有答案.为了澄清,我不是在寻找如何编写采样方案的解释,而是指出一种简单的方法,从给定一组对象和权重的多项分布中进行采样,或者被告知不存在这样的函数在标准库中,所以应该自己写一个.
我需要根据加权循环法返回不同的值,以便20中的1得到A,20中的1得到B,其余的转到C.
所以:
A => 5%
B => 5%
C => 90%
Run Code Online (Sandbox Code Playgroud)
这是一个似乎有用的基本版本:
import random
x = random.randint(1, 100)
if x <= 5:
return 'A'
elif x > 5 and x <= 10:
return 'B'
else:
return 'C'
Run Code Online (Sandbox Code Playgroud)
这个算法是否正确?如果是这样,可以改进吗?
所以,我有一个想法,我可以使用一系列数字作为字典中单个值的键.
我写了下面的代码,但我无法让它工作.它甚至可能吗?
stealth_roll = randint(1, 20)
# select from a dictionary of 4 responses using one of four ranges.
## not working.
stealth_check = {
range(1, 6) : 'You are about as stealthy as thunderstorm.',
range(6, 11) : 'You tip-toe through the crowd of walkers, while loudly calling them names.',
range(11, 16) : 'You are quiet, and deliberate, but still you smell.',
range(16, 20) : 'You move like a ninja, but attracting a handful of walkers was inevitable.'
}
print …Run Code Online (Sandbox Code Playgroud) 我有一个(大)解析句子列表(使用斯坦福解析器解析),例如,句子"现在你可以被娱乐"有以下树:
(ROOT
(S
(ADVP (RB Now))
(, ,)
(NP (PRP you))
(VP (MD can)
(VP (VB be)
(VP (VBN entertained))))
(. .)))
Run Code Online (Sandbox Code Playgroud)
我正在使用句子树集来使用nltk来引导语法:
import nltk
# ... for each sentence tree t, add its production to allProductions
allProductions += t.productions()
# Induce the grammar
S = nltk.Nonterminal('S')
grammar = nltk.induce_pcfg(S, allProductions)
Run Code Online (Sandbox Code Playgroud)
现在我想grammar用来生成新的随机句子.我的希望是,由于语法是从一组特定的输入示例中学习的,因此生成的句子在语义上是相似的.我可以在nltk中这样做吗?
如果我不能使用nltk这样做,是否存在任何其他可以采用(可能重新格式化)grammar并生成句子的工具?
我有一个Python字典,其中键表示一些项目,值表示所述项目的一些(标准化)加权.例如:
d = {'a': 0.0625, 'c': 0.625, 'b': 0.3125}
# Note that sum([v for k,v in d.iteritems()]) == 1 for all `d`
Run Code Online (Sandbox Code Playgroud)
鉴于项目与权重的这种相关性,我如何选择一个关键字,d结果为'a'的时间为6.25%,结果为'b'的时间为32.25%,结果的62.5%为'c' "?
我有一个包含四个项目(A、B、C、D)的列表。每个项目都有一个被选中的概率。例如,假设 A 有 74% 的机会被选中,B 15%,C 7% 和 D 4%。
我想创建一个函数,根据它的概率随机选择一个项目。
请问有什么帮助吗?
python ×9
random ×4
probability ×3
algorithm ×2
dictionary ×2
numpy ×2
c# ×1
list ×1
nlp ×1
nltk ×1
range ×1
round-robin ×1
statistics ×1