【问题标题】:Using a shifted bell curve to create random.choices weights使用移动的钟形曲线创建 random.choices 权重
【发布时间】:2021-07-13 20:09:13
【问题描述】:

我是 Python 的初学者,正在尝试一些对我来说太复杂的东西。

我想输出一个列表(q),k-items long,其中每一项都是五个选项之一(包含在列表w em>)。

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 - 如果有更简单的方法来实现类似的结果,那就太棒了!

【问题讨论】:

  • 你为什么在这里使用“倾斜的钟形曲线”? xy 是什么?
  • @SamMason 我只是使用xy 来显示我所追求的函数的域和范围。在我的代码中,x 将是我找到函数输出的五个点之一(0.2、0.4 等...)。 y:我总是希望输出小于 1。至于倾斜的钟形曲线:我想我希望 y 适合正态分布的曲线,但根据该分布偏离中心到p。最后,如果p = ~0.5,我希望列表q 大部分时间包含 c,但有时包含 b d,偶尔以ae为特色。
  • 很确定你不想要一个偏斜的分布,你只想移动平均值。而且您对点的重新标记似乎使问题感到困惑,使用索引同样强大,这意味着您无需在任何地方指定它们

标签: python random statistics probability


【解决方案1】:

根据您到目前为止所写的内容,我认为您想要执行以下操作:

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)基本统一

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-30
    • 2016-04-29
    • 1970-01-01
    相关资源
    最近更新 更多