使用Python从单尾分布生成范围内的随机数
我想从一个单尾分布生成一个范围为[0,1]的随机浮点,如下所示 上面是卡方分布。但是,我只能从一个范围内的均匀分布中找到有关绘图的资源。查看库使用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]上定义的这与您的目标一致 更具技术性的评论 虽然贝塔分布的
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)