python - 高斯随机分布的奇怪行为

标签 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始终为正或负的 float 列表。这意味着random.gauss调用总是为 x 中的每个 float 分配一个更大的新值或小于 x 中所有值的

我希望 random.gauss调用对 x 中的 float 进行洗牌围绕其值向右和向左,因为这是一个随机过程。

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

最佳答案

这是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

关于python - 高斯随机分布的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21458906/

相关文章:

R + ggplot : how to use a custom smoother (Gaussian Process)

Python 二维高斯拟合与数据中的 NaN 值

python - 不知道如何用高斯Python拟合数据

python - 加载 pickle 的 python 对象使用大量内存

Java——画一个三角形

JavaScript 从一个范围内随机选择/返回一个数字?

c++ - 在 C++ 中使用随机数生成一系列可重复的数字

python - 如何绘制从特定开始日期开始的时间序列?

Python - 格式为零长度的字段名称

python - 河内代表塔