我正在运行一些代码,其目的是获取浮点列表/数组和相同长度的关联列表/数组作为“错误”,并根据高斯分布对第一个列表进行洗牌。
这是一个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
。
由于 mu
和 sigma
是 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/