将均匀分布转换为正态分布

10 浏览
0 Comments

将均匀分布转换为正态分布

如何将均匀分布(大多数随机数生成器产生的分布,例如在0.0和1.0之间)转换为正态分布?如果我想要选择自己的均值和标准差呢?

0
0 Comments

将一个均匀分布转换为正态分布的问题的出现原因是想要将一个分布函数转换为另一个分布函数时,需要使用所需函数的反函数。换句话说,如果想要一个特定的概率函数p(x),可以通过对其进行积分得到分布函数d(x) = integral(p(x)),然后使用其反函数Inv(d(x))。现在使用具有均匀分布的随机概率函数,并将结果值通过函数Inv(d(x))进行转换。这样,根据所选择的函数,可以得到具有相应分布的随机值。

这是一种通用的数学方法-通过使用它,可以选择任何具有反函数或良好反函数逼近的概率或分布函数。

这种方法被忽视了,但在生成高斯变量方面非常有效。在这种情况下,可以使用牛顿法有效地计算反累积分布函数(导数为e^{-t^2}),初始近似值可以很容易地获得为有理分数,所以只需要3-4次误差函数和指数函数的计算。如果使用准随机数,这是必需的,因为在这种情况下,必须使用恰好一个均匀数来获得一个高斯数。

请注意,需要反转累积分布函数,而不是概率分布函数。Alexandre暗示了这一点,但我认为更明确地提到它可能不会有害-因为答案似乎暗示了概率密度函数。

如果准备相对于均值随机选择一个方向,可以使用概率密度函数吗?

这被称为逆变换抽样。

这里是在SE上有一个相关问题的链接,其中有一个更广义的回答和很好的解释。

0
0 Comments

问题的出现原因:

将一个均匀分布转换为正态分布的问题,可能是因为在某些情况下需要使用正态分布而不是均匀分布来模拟数据。均匀分布是每个值出现的概率都相等,而正态分布是以均值为中心,呈现出钟形曲线的分布。

解决方法:

有两种常见的方法可以将均匀分布转换为正态分布:Ziggurat算法和Box-Muller变换。

Ziggurat算法是一种高效的方法,用于将均匀分布转换为正态分布。该算法使用一种特定的分层结构,通过生成随机数对来实现转换。这个算法的实现较为复杂,但却非常高效。

Box-Muller变换是另一种将均匀分布转换为正态分布的常见方法。这个方法较为简单,易于实现。它基于两个独立的均匀分布随机变量的生成,并使用一些数学运算来将它们转换为正态分布的随机变量。

这些方法都需要使用一个合适的底层随机数生成器,以确保生成的随机数具有高质量和良好的随机性。其中,Mersenne Twister是一个常用的随机数生成器,也可以考虑其他合适的生成器。

代码示例(使用Box-Muller变换):

import random
def convert_uniform_to_normal():
    u1 = random.uniform(0, 1)
    u2 = random.uniform(0, 1)
    
    z1 = math.sqrt(-2 * math.log(u1)) * math.cos(2 * math.pi * u2)
    z2 = math.sqrt(-2 * math.log(u1)) * math.sin(2 * math.pi * u2)
    
    return z1, z2
z1, z2 = convert_uniform_to_normal()
print(z1, z2)

这样,我们就可以使用转换后的正态分布随机数来模拟需要的数据。

0
0 Comments

问题的出现原因:

- Box Muller方法的结果被限制在-6到6之间,效率远低于其他方法。

- Ziggurat方法需要进行表格查找,并且由于缓存大小问题需要进行平台特定的调整。

- Ratio-of-uniforms方法是最受欢迎的方法,只需要进行几次加法/乘法和1/50的对数运算。

- 反转累积分布函数(CDF)的方法效率高,但人们常常忽视这一点。

解决方法:

- 不使用Box Muller方法。

- 使用Ziggurat方法,但需要进行一些平台特定的调整。

- 使用Ratio-of-uniforms方法。

- 使用反转CDF方法。

关于[-6,6]的限制,有人怀疑这个说法是否正确。对于这个问题,某些情况下了一位老师的观点,但也有人指出这一限制同样存在于反转CDF方法中。为了避免这个问题,可以使用具有非零概率生成接近零的浮点数的均匀RNG。大多数RNG没有这个特性,因为它们生成一个典型的64位整数,然后映射到[0,1]范围内。这使得这些方法不适用于采样高斯变量的尾部。

对于大多数用户来说,不使用Box Muller变换可能是误导性的。虽然了解其限制很重要,但对于大多数不过度依赖异常值的应用程序,可能不需要担心这个问题。例如,如果你曾经依赖于使用numpy从正态分布中进行抽样,那么你就依赖于Box Muller变换(极坐标形式)。

本文讨论了将均匀分布转换为正态分布的方法,并指出了每种方法的优势和劣势。Box Muller方法的效率低于其他方法,并且有结果被限制在-6到6之间的问题。Ziggurat方法需要进行表格查找和平台特定的调整。Ratio-of-uniforms方法是最受欢迎的方法,只需要进行几次加法/乘法和1/50的对数运算。反转CDF方法效率高,但常常被忽视。最后,文章指出了不使用Box Muller变换可能是误导性的,并举了numpy库中使用Box Muller变换的例子。

0