【问题标题】:Generate Random Number in Range from Single-Tailed Distribution with Python使用 Python 从单尾分布生成范围内的随机数
【发布时间】:2019-11-12 10:52:21
【问题描述】:

我想从一个看起来像这样的单尾分布中生成一个 [0, 1) 范围内的随机浮点数

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

【问题讨论】:

  • 你应该说是要截断分布(即忽略范围外的部分(0, 1))还是重新缩放它(即将区间(0, 15)映射到(0, 1)).
  • 我想重新调整它
  • 好的。鉴于此:忽略大于 15 的值(即只过滤掉它们),并且对于每个小于或等于 15 的值,除以 15。您可以调用 numpy.random.chisquare 来获取要使用的值列表。

标签: python python-3.x random statistics


【解决方案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])

【讨论】:

  • 我看到了这个,但我不确定如何保证 [0, 1) 中的值。
【解决方案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) 分布中抽取数字

Beta 分布是统计中非常通用且基本的分布;无需赘述,通过更改参数alphabeta,您可以使分布左偏、右偏、均匀、对称等。分布在区间[0, 1] 上定义,这与你在追求。


更技术性的评论

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

其次,Beta 分布的均值和方差可以很简单地用参数alphabeta 表示;例如,平均值仅由alpha / (alpha + beta) 给出。

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

【讨论】:

    【解决方案3】:

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

    我个人更喜欢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 和很多其他人

    【讨论】:

      【解决方案4】:

      如果您想从 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)
      

      【讨论】:

        猜你喜欢
        • 2013-05-02
        • 2019-07-03
        • 2010-12-24
        • 1970-01-01
        • 2015-08-27
        • 2015-07-09
        • 1970-01-01
        • 2010-11-21
        • 1970-01-01
        相关资源
        最近更新 更多