簡體   English   中英

使用移動的鍾形曲線創建 random.choices 權重

[英]Using a shifted bell curve to create random.choices weights

我是 Python 的初學者,嘗試一些對我來說太復雜的東西。

我想 output 一個列表( q ), k -items long,其中每個項目是五個選項之一(包含在列表w中)。

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

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

我希望每個項目的權重由傾斜的鍾形曲線(甚至是一個粗略的近似值)控制,其中曲線峰值的水平 position 等於p p的范圍可以從 0.1 到 1。

因此,如果p = 0.55,項目c出現在列表q中的概率應該最高, bd的概率第二高, ae的概率最低。 如果p = 0.1, a應該是最有可能出現的,而e應該是最不可能出現的,以此類推。

我找到了 scipy.stats.skewnorm,它似乎可以工作。 但是,我真的很難將其調整為我需要的形式。

我在 function 之后,其中 0 ≤ y ≤ 1 和 0 ≤ x ≤ 1.2。 然后我希望這個 function 為 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)

我將非常感謝任何和所有的建議、方向或建議。 我不拘泥於隨機、選擇或偏態——如果有更簡單的方法來實現類似的結果,那就太棒了!

根據您到目前為止所寫的內容,我認為您想要執行以下操作:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM