微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用移动的钟形曲线创建 random.choices 权重

如何解决使用移动的钟形曲线创建 random.choices 权重

我是 Python 的初学者,尝试的东西对我来说有点太复杂了。

我想输出一个列表 (q),k-items 长,其中每个项目是五个选项之一(包含在列表 w).

w = [a,b,c,d,e]

我正在使用 random.choices 创建列表 q

我希望每个项目的权重由偏斜的钟形曲线(甚至是一个的粗略近似值)控制,其中曲线峰值的水平位置等于 pp 的范围可以从 0.1 到 1。

因此,如果 p = 0.55,则 c 项应该最有可能出现在列表 q 中,其中 b 和 d 的概率第二高,ae 的概率最低。如果 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,但有合理的机会选择 ce,而选择 a 的机会要小得多
  • weighted_choices('abcde',2,10) 基本上是统一的

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。