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

使用Python从单尾分布生成范围内的随机数,python,python-3.x,random,statistics,Python,Python 3.x,Random,Statistics,我想从一个单尾分布生成一个范围为[0,1]的随机浮点,如下所示 上面是卡方分布。但是,我只能从一个范围内的均匀分布中找到有关绘图的资源。查看库 numpy.random.chisquare(df,size=None) 你可以用一个,例如 这里我们从一个Beta(2,5)分布中提取数字 贝塔分布是统计学中一种非常通用且基本的分布;无需详细说明,通过更改参数alpha和Beta,您可以使分布左偏、右偏、均匀、对称等。分布是在区间[0,1]上定义的这与您的目标一致 更具技术性的评论 虽然贝塔分布的

我想从一个单尾分布生成一个范围为[0,1]的随机浮点,如下所示

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

查看库

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

你可以用一个,例如

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

贝塔分布是统计学中一种非常通用且基本的分布;无需详细说明,通过更改参数
alpha
Beta
,您可以使分布左偏、右偏、均匀、对称等。分布是在区间
[0,1]上定义的
这与您的目标一致


更具技术性的评论 虽然贝塔分布的代数性质肯定比贝塔分布好,但我认为后者是更基本的分布;例如,在贝叶斯推理中,贝塔分布在处理二项式(-like)过程时通常作为共轭先验

其次,贝塔分布的平均值和方差可以非常简单地用参数
alpha
Beta
表示;例如,平均值简单地由
alpha/(alpha+Beta)
表示


最后,从计算和统计推断的角度来看,将Beta分布拟合到数据通常在Python(或R)中的几行代码中完成,其中大多数Python库,如
numpy
scipy
已经包含了处理Beta发行版的方法。

我倾向于自然限定在[0…1]区间(或任何其他[a…b]区间,可以稍后重新缩放)的发行版,比如@MauritsEvers的答案。原因是,你知道这个分布,并且可以得到(或阅读)一些关于它的有趣事实。如果你使用chi2和截断它,你不清楚如何争论你所拥有的东西的属性

就我个人而言,我更喜欢贝塔分布,平均值、模式、方差等的表达式要简单得多

只需安装它

pip install kumaraswamy
和样品

from kumaraswamy import kumaraswamy

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

q = d.rvs(10)
print(q)
在维基文章中,将在洋红色曲线后生成10个数字


如果您不想要Beta或Kumaraswamy,有f.e.和其他许多

如果您想要从ChiSquare发行版中抽取大小
N=5的样本,您可以尝试库:

有一个完整的发行版列表

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

s = np.array(Sample)
print(s)
>>>array([[1.65299759],
      [6.78405097],
      [0.88528975],
      [0.87900211],
      [0.25031129]])
只需调用:
distribution.drawPDF()

定制:

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

我看到了这一点,但我不确定如何保证[0,1]中的值。您应该说是要截断分布(即忽略范围(0,1)之外的部分)还是要重新缩放它(即将间隔(0,15)映射到(0,1))。我想重新缩放itOK。考虑到:忽略大于15的值(即仅过滤掉它们),对于每个小于或等于15的值,除以15。您可以调用
numpy.random.chisquare
以获取要使用的值列表。
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)
s = np.array(Sample)
print(s)
>>>array([[1.65299759],
      [6.78405097],
      [0.88528975],
      [0.87900211],
      [0.25031129]])
from openturns.viewer import View
graph = distribution.drawPDF()
title = str(distribution)[:100].split('\n')[0]
graph.setTitle(title)
View(graph, add_legend=False)