使用统一随机变量实现高斯随机变量


11

我正在尝试编写一个C ++函数,该函数将根据给定的均值和方差返回高斯随机值。

有一个库函数rand(),该函数返回0和之间的随机数RAND_MAXRAND_MAX没有固定的值,但可以保证至少为。其PDF是统一的。2151

我正在使用中央极限定理将其转换rand()为高斯变量。我正在做的是调用rand()用户指定的时间,然后将其返回值加起来,然后将其均值转换为用户指定的均值。

高斯PDF
在上面的图中,我将高斯随机生成器调用了次,并绘制了其返回值的频率。如您所见,它的方差很大,因为它是由许多其他随机值的总和创建的。107

它成功返回具有高斯PDF和指定平均值的高斯变量。但是,问题在于其差异。我被困在这一点上,因为我不知道如何将其方差更改为用户指定的值。

这是我的代码(暂时不完整;参数“方差”被忽略):

template <class T>
T Random::GetGaussian(T Mean /*= 0*/, T Variance /*= 1*/)
{
    T MeanOfSum = NUM_GAUSSIAN_SUMS / static_cast<T>(2);
    T Rand = 0;
    for (uint64_t i=0; i<NUM_GAUSSIAN_SUMS; i++)
    {
        Rand += static_cast<T>(rand()) / RAND_MAX;
    }
    return Rand - (MeanOfSum - Mean);
}

假定NUM_GAUSSIAN_SUMS是100,并且RAND_MAX是32767。

我想根据函数的参数更改随机变量的方差。我的问题是,如何更改此随机变量的方差?我该怎么做?


3
有比中心极限定理更好和更快的方法来生成高斯随机变量。搜索Box-Muller方法之一;之字形方法据说更好。
Dilip Sarwate 2012年


3
在较早的时候,执行时间是一个重要的考虑因素,人们会求和随机变量(而不是),然后减去以得到对标准随机变量的简单近似,然后进行缩放以获得随机变量。(有关为何起作用的信息,请参见@Hilmar的答案)。对于许多应用程序而言,此简单方法效果很好,但是将值限制在范围内,当Six-Sigma成为流行语时,这个简单的想法被抛在了一边。12 U(0,1)1006N(0,1)Y=σX+μN(μ,σ2)(μ6σ,μ+6σ)
Dilip Sarwate 2012年

@DilipSarwate也许您应该发布这些替代方案作为答案,并说明我们偏爱它的理由
Ivo Flipse 2012年

@IvoFlipse对问题的回答是“固定均值后如何固定方差?” 本质上是Hilmar接受的答案所说的,并经注释修正:通过缩放固定方差,然后重新确定均值,或者更好的是,不要先确定均值,因为您必须重新确定以后再说 首先通过缩放确定方差,然后确定均值。OP并不表示他/她根本对更好的方法不感兴趣,甚至没有批评nibot的链接,甚至没有Box-Muller方法的代码。所以我将保持现状。
Dilip Sarwate 2012年

Answers:


6

您的初始算法会创建一个随机变量,该变量在0和1之间均匀分布。其方差为1/12。如果将这些NUM_GAUSSIAN_SUMS实例的和相加,则方差为NUM_GAUSSIAN_SUMS/12。为了获得目标方差,V您需要将求和后的随机变量乘以sqrt(V*12/NUM_GAUSSIAN_SUMS)

顺便说一句,模板对于浮点数和双精度数会很好地工作,但是任何不动点类型都存在很大的数值问题。


5

如何更改此随机变量的方差?

CXCXc2X


cXcX

1
居中,重新缩放,然后恢复均值。缩放居中的随机变量不会影响均值(零)。
Emre 2012年

1

还有另一种方式!

想一想,如果您想要其他分布而不是高斯分布怎么办?在这种情况下,您将无法真正使用中央极限定理;那你怎么解决呢?

有一种方法可以将统一随机变量转换为任意PDF。该方法称为逆变换法

ü[0-1个]

X=FX-1个ü

FXX

因此,您要做的就是将CDF逆函数应用于从统一rv样本中检索到的变量。

而且,与早期方法不同-这将不需要任何迭代,并且将不依赖于要使结果更接近高斯的迭代次数。

这是证明这一点的参考文献之一。


3
>还有另一种方式!的确如此,但与所考虑的问题无关,该问题特别是关于高斯随机变量的。高斯CDF或其反函数都不能使用有限数量的运算来以基本术语表示,因此无法使用建议的方法。
Dilip Sarwate 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.