[英]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中的概率應該最高, b和d的概率第二高, a和e的概率最低。 如果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
但有合理的機會選擇c
或e
,選擇a
機會要小得多weighted_choices('abcde', 2, 10)
基本一致
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.