使用Python从单尾分布生成范围内的随机数

时间:2019-07-01 19:36:02

标签: python python-3.x random statistics

我想从看起来像enter image description here的单尾分布中生成一个范围为[0,1)的随机浮点数

以上是卡方分布。但是,我只能从一定范围内的均匀分布中找到绘图资源。

4 个答案:

答案 0 :(得分:2)

您可以使用Beta distribution,例如

import numpy as np

np.random.seed(2018)
np.random.beta(2, 5, 10)
#array([ 0.18094173,  0.26192478,  0.14055507,  0.07172968,  0.11830031,
#        0.1027738 ,  0.20499125,  0.23220654,  0.0251325 ,  0.26324832])

这里我们从Beta(2, 5)分布中提取数字

enter image description here

Beta分布是统计中非常通用的基础分布;无需赘述,可以通过更改参数alphabeta来使分布左偏,右偏,均匀,对称等。分布是在间隔{{1}上定义的},这与您追求的目标保持一致。


更多技术评论

尽管Kumaraswamy distribution肯定比Beta distribution具有更好的代数性质,但我认为后者是更基本的分布。例如,在贝叶斯推断中,当处理二项式(类)过程时,Beta分布通常作为共轭进入。

第二,可以用参数[0, 1]alpha非常简单地表示Beta分布的均值和方差;例如,平均值仅由beta给出。

最后,从计算和统计推断的角度来看,将Beta分布拟合到数据通常是在Python(或R)中的几行代码中完成的,其中大多数Python库(如alpha / (alpha + beta)和{{ 1}}已经包括处理Beta分布的方法。

答案 1 :(得分:2)

我会倾向于自然地以[0 ... 1]区间(或以后可以重新缩放的任何其他[a ... b]区间)为界的分布,例如@MauritsEvers答案。原因是,您知道分布,并且可以得出(或阅读)一些有趣的事实。如果您使用chi2 adn截断它,则不清楚如何争论所拥有财产的性质。

我个人更喜欢Kumaraswamy distribution而不是Beta分布,均值,众数,方差等表达式要简单得多。

只需安装

pip install kumaraswamy

和样品

from kumaraswamy import kumaraswamy

d = kumaraswamy(a=2.0, b=5.0)

q = d.rvs(10)
print(q)

将按照Wiki文章中的洋红色曲线生成10个数字。

如果您不希望使用Beta或Kumaraswamy,则有f.e. Logit-normal distribution和其他很多人

答案 2 :(得分:1)

查看numpy.random.chisquare method库。

numpy.random.chisquare(df, size=None)

>>> np.random.chisquare(2,4)
array([ 1.89920014,  9.00867716,  3.13710533,  5.62318272])

答案 3 :(得分:1)

如果要从ChiSquare分布中提取大小为N = 5的样本,可以尝试使用OpenTURNS库:

import openturns as ot`
# define your distribution. Here, nu = 3. (nu is a float > 0)
distribution = ot.ChiSquare(3) 

# draw a sample of size N from `distribution`
N=5
sample = distribution.getSample(N)

可用的发行版完整列表here

sample具有OpenTURNS格式,但是您可以将其作为Numpy数组进行操作:

s = np.array(Sample)
print(s)
>>>array([[1.65299759],
      [6.78405097],
      [0.88528975],
      [0.87900211],
      [0.25031129]])

您也可以通过调用distribution.drawPDF()

轻松地绘制分布PDF。

自定义:

from openturns.viewer import View
graph = distribution.drawPDF()
title = str(distribution)[:100].split('\n')[0]
graph.setTitle(title)
View(graph, add_legend=False)

enter image description here