我正在运行一些代码,其目的是获取浮点数列表/数组以及相同长度的相关列表/数组作为“错误”,并根据高斯分布对第一个列表进行混洗。
这是代码的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
中的浮点值围绕其值向右和向左移动,因为这是一个随机过程。
为什么不发生这种情况?我对这个过程有什么不妥吗?
答案 0 :(得分:2)
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
模块生成这些值。它比使用调用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