问题描述
我是 Python 的初学者,尝试的东西对我来说有点太复杂了。
我想输出一个列表 (q),k-items 长,其中每个项目是五个选项之一(包含在列表 w).
w = [a,b,c,d,e]
我正在使用 random.choices 创建列表 q。
我希望每个项目的权重由偏斜的钟形曲线(甚至是一个的粗略近似值)控制,其中曲线峰值的水平位置等于 p。 p 的范围可以从 0.1 到 1。
因此,如果 p = 0.55,则 c 项应该最有可能出现在列表 q 中,其中 b 和 d 的概率第二高,a 和 e 的概率最低。如果 p = 0.1,a 应该最有可能出现,e 最不可能出现,依此类推。
我找到了 scipy.stats.skewnorm,它似乎可以工作。然而,我真的很难将它改编成我需要的形式。
我在追求一个 0 ≤ y ≤ 1 且 0 ≤ x ≤ 1.2 的函数。然后我希望这个函数为 random.choices 创建五个权重,就像这样:
p = 0.7
prob_a = f(0.2,p)
prob_b = f(0.4,p)
prob_c = f(0.6,p)
etc...
q = random.choices(w,weights=[prob_a,prob_b,prob_c,etc...],k=10)
对于任何和所有建议、方向或建议,我将不胜感激!我不喜欢 random.choices 或 skewnorm——如果有更简单的方法来实现类似的结果,那就太棒了!
解决方法
根据您目前所写的内容,我认为您想要执行以下操作:
from scipy import stats
from random import choices
def weighted_choices(w,mu,sd,*,k=1):
weights = stats.norm(mu,sd).pdf(range(len(w)))
return choices(w,weights=weights,k=k)
其中 mu
是您希望成为最有可能的 w
的索引,而 sd
是您希望该选择的紧密程度。例如:
-
weighted_choices('abcde',1,0.1)
几乎总是选择b
-
weighted_choices('abcde',3,0.5)
会倾向于选择d
,但有合理的机会选择c
或e
,而选择a
的机会要小得多 -
weighted_choices('abcde',2,10)
基本上是统一的