【问题标题】:Generating Random Upside-down Gaussian Distribution生成随机倒置高斯分布
【发布时间】:2020-08-24 05:19:21
【问题描述】:

我正在尝试生成一个随机分布,该分布遵循颠倒的高斯分布,移动 uo 使其仍在范围 (0,1) 内。我需要用尽可能少的特殊函数来做到这一点,并且只能使用平面随机数生成器。

我可以通过将平面随机数放入逆高斯 CDF 来根据高斯生成。这有效,并为我提供了我期望的高斯分布。在 python 中,这看起来像这样:

def InverseCDF(x, mu, sigma):
  return mu + sigma * special.erfinv(2*x - 1)

现在,当我尝试生成遵循 1-e^(-x^2) 的分布时,我相信此函数的逆 CDF 与现在具有逆误差函数参数的常规高斯相同2*p + 1。所以它如下所示:

   def InverseCDF(x, mu, sigma):
      return mu + sigma * special.erfinv(2*x + 1)

这里的问题是 erfinv 仅从 (-1,1) 定义,并且参数现在大于 1。我尝试过缩放它并以各种方式翻转,几乎在我可以的任何地方都放置负数,我似乎永远无法生成遵循颠倒高斯的直方图。在大多数情况下,我实际上得到了一个正则高斯分布。

知道我做错了什么,或者关于如何生成这个颠倒的高斯的任何提示?提前感谢您的帮助。

【问题讨论】:

  • 有趣的问题,但我对 pdf 的定义有点困惑。让 g(x) 是具有平均值 0 和方差 1 的普通正态 pdf。我猜你正在查看 max(g) - g(x) 其中 max(g) 是凹凸的最大值(我猜是 1 /sqrt(2 pi))。但是 max(g) - g(x) 在曲线下有无限的面积——你是否以某种方式限制了 x 的范围?
  • 是的,我应该声明 x 是有限制的。限制由我的具体问题决定,但对于这个玩具示例,我们可以将其设为 (0,1)。
  • 你的截断法线是在范围的中心,还是模式为零?你愿意使用接受/拒绝技巧吗?

标签: random probability gaussian


【解决方案1】:

好的,x 介于 0 和 1 之间,我为 cdf 得到这个:

-(sqrt(%pi)*(sqrt(2)*sigma*erf((sqrt(2)*x-sqrt(2)*mu)/(2*sigma))
            +sqrt(2)*erf(mu/(sqrt(2)*sigma))*sigma)
 -2*x)
 /(sqrt(%pi)*(sqrt(2)*erf((sqrt(2)*mu-sqrt(2))/(2*sigma))
             -sqrt(2)*erf(mu/(sqrt(2)*sigma)))*sigma
  +2)

也许一些代数可以找出逆的公式,如果不是,我猜数字根搜索会起作用。我想对于 mu 和 sigma 的特定值会更简单。

我使用 Maxima (http://maxima.sourceforge.net) 通过构建 pdf 并将其集成来做到这一点。绘制上面的表达式会产生一个似是而非的图景。

【讨论】:

  • 这看起来很有希望,感谢您的帮助。我认为倒数不会太难,但现在读起来有点太复杂/太难了。我们可以说 mu=0 会大大简化事情。在这种情况下,第二项在分子和分母中都消失了
  • 当 mu=0 时,这给出:-(sqrt(π) (sqrt(2) σ erf((sqrt(2) x)/(2 σ))) - 2 x) / (sqrt (π)×erf(-sqrt(2))/(2 σ) + 2)
  • 我看了几分钟,但没有看到一个简单的解决方案。我认为数字根查找器(甚至只是二分法)是解决它的可行方法。这适用于 mu 和 sigma 的任何值(以及任何范围,我很确定)。
猜你喜欢
  • 1970-01-01
  • 2011-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-09
  • 2012-03-14
  • 2014-04-15
相关资源
最近更新 更多