高斯随机分布的奇怪行为

时间:2014-01-30 14:17:23

标签: python random gaussian

我正在运行一些代码,其目的是获取浮点数列表/数组以及相同长度的相关列表/数组作为“错误”,并根据高斯分布对第一个列表进行混洗。

这是代码的MWE

import random
import numpy as np

def random_data(N, a, b):
    # Generate some random data.
    return np.random.uniform(a, b, N).tolist()

# Obtain values for x.
x = random_data(100, 0., 1.)
# Obtain error/sigma values for x.
x_sigma = random_data(100, 0., 0.2)

# Generate new x values shuffling each float around a
# Gaussian distribution with a given sigma.
x_gauss = random.gauss(np.array(x), np.array(x_sigma))

print x-x_gauss

我发现执行x-x_gauss的结果是总是正面或负面的浮动列表。这意味着random.gauss调用始终为x中的每个浮点数分配更大的新值,或为x 中的所有值分配更小的

我希望random.gauss调用将x中的浮点值围绕其值向右和向左移动,因为这是一个随机过程。

为什么不发生这种情况?我对这个过程有什么不妥吗?

1 个答案:

答案 0 :(得分:2)

这是definition of random.gauss

def gauss(self, mu, sigma):
    random = self.random
    z = self.gauss_next
    self.gauss_next = None
    if z is None:
        x2pi = random() * TWOPI
        g2rad = _sqrt(-2.0 * _log(1.0 - random()))
        z = _cos(x2pi) * g2rad
        self.gauss_next = _sin(x2pi) * g2rad

    return mu + z*sigma

请注意,正在为z生成一个值,并返回mu + z*sigma。 由于musigma是numpy数组,因此这个计算是按元素进行的。由于sigma为正数,因此转换z*sigma要么始终为正数,要么为负数,具体取决于z

的符号

如果您使用的是NumPy,除非有特殊原因,否则我会使用np.random模块生成这些值。它比使用调用random.gauss

的Python循环更快
import numpy as np

N = 100
x = np.random.uniform(0., 1., size=N)
x_sigma = np.random.uniform(0., 0.2, size=N)

z = np.random.normal(0, 1, size=N)
x_gauss = x + z*x_sigma

print x-x_gauss