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

问题描述 投票:0回答:4

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

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

python statistics
4个回答
12
投票

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

左偏分布直方图

代码生成以下图。

enter image description here


5
投票

就像您所描述的那样,只需确保您的偏态分布总计为 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)

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


0
投票

可以从 numpy.randomscipy.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()

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.