创建具有左倾斜概率分布的随机数

时间:2014-07-20 21:11:08

标签: python statistics

我想在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)

我不知道如何生成左倾离散概率函数。有任何想法吗?谢谢!

3 个答案:

答案 0 :(得分:3)

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

编辑: 您也可以尝试使用此链接并查找适合您正在寻找的模型的分布(大约在页面的一半处)。

http://docs.scipy.org/doc/scipy/reference/stats.html

答案 1 :(得分:1)

与您所描述的一样,只需确保您的偏斜分布加起来为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)

答案 2 :(得分:0)

这是您使用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

Histogram of left-skewed distribution