我想在 1-100 之间随机选择一个数字,这样获得数字 60-100 的概率高于 1-59。
我希望数字 1-100 呈左偏分布的概率。也就是说,它有一个长尾和一个峰。
大致的内容:
pers = np.arange(1,101,1)
prob = <left-skewed distribution>
number = np.random.choice(pers, 1, p=prob)
我不知道如何生成左偏离散概率函数。有任何想法吗?谢谢!
这是您使用 SciPy 函数“skewnorm”寻找的答案。它可以使任何正整数集向左或向右倾斜。
from scipy.stats import skewnorm
import matplotlib.pyplot as plt
numValues = 10000
maxValue = 100
skewness = -5 #Negative values are left skewed, positive values are right skewed.
random = skewnorm.rvs(a = skewness,loc=maxValue, size=numValues) #Skewnorm function
random = random - min(random) #Shift the set so the minimum value is equal to zero.
random = random / max(random) #Standadize all the vlues between 0 and 1.
random = random * maxValue #Multiply the standardized values by the maximum value.
#Plot histogram to check skewness
plt.hist(random,30,density=True, color = 'red', alpha=0.1)
plt.show()
请参考此处的文档: https://docs.scipy.org/doc/scipy/reference/ generated/scipy.stats.skewnorm.html
代码生成以下图。
就像您所描述的那样,只需确保您的偏态分布总计为 1.0:
pers = np.arange(1,101,1)
# Make each of the last 41 elements 5x more likely
prob = [1.0]*(len(pers)-41) + [5.0]*41
# Normalising to 1.0
prob /= np.sum(prob)
number = np.random.choice(pers, 1, p=prob)
np.random.choice 的 p 参数是与第一个参数中数组中每个元素关联的概率。所以类似:
np.random.choice(pers, 1, p=[0.01, 0.01, 0.01, 0.01, ..... , 0.02, 0.02])
其中 0.01 是 1-59 的较低概率,0.02 是 60-100 的较高概率。
SciPy 文档有一些有用的示例。
http://docs.scipy.org/doc/numpy-dev/reference/ generated/numpy.random.choice.html
编辑: 您也可以尝试此链接并寻找适合您正在寻找的模型的分布(大约在页面的一半位置)。
可以从 numpy.random 或 scipy.stats 获取 any 所需的分布,并根据需要进行所需的转换或反转。例如。对数正态乘以 -1 到 reflect 样本并从 x 轴上的零向右移动——得到左侧有长尾的负偏(左偏)分布。
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
shift= 100
mu, sigma = 3., 0.5 # mean and standard deviation
s = -1* np.random.lognormal(mu, sigma, 1000) + shift
##Display the histogram of the samples,
import matplotlib.pyplot as plt
count, bins, ignored = plt.hist(s, 100, align='mid')
plt.axis('tight')
plt.show()