【问题标题】:Strange behaviour with Gaussian random distribution高斯随机分布的奇怪行为
【发布时间】:2014-01-30 14:17:22
【问题描述】:

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

这是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 中的浮点数围绕其值左右移动,因为这是一个随机过程。

为什么没有发生这种情况?我对这个过程的理解有问题吗?

【问题讨论】:

    标签: python random gaussian


    【解决方案1】:

    这是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 模块来生成这些值。这比使用 Python 循环调用random.gauss 更快:

    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
    

    【讨论】:

    • 哦,我明白了,所以我应该在 for 循环中递归地执行此操作,以便为每个浮点数获得不同的随机洗牌,或者有更好的方法来实现这一点?
    • 没关系,我会关闭这个,对此提出一个新问题,以避免混淆。谢谢@unutbu!
    • 好吧,既然你写了这么棒的代码来替换我的错误代码,就不需要打开另一个问题了。再次非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2012-03-14
    • 2014-03-09
    • 2015-04-22
    • 1970-01-01
    • 1970-01-01
    • 2020-08-24
    • 2015-09-20
    • 2012-10-08
    相关资源
    最近更新 更多