Python 高斯随机分布的奇异行为
我正在运行一段代码,其目的是将一个浮点数列表/数组和一个相同长度的关联列表/数组作为“错误”,并根据高斯分布对第一个列表进行无序排列 这是代码的Python 高斯随机分布的奇异行为,python,random,gaussian,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 = rando
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
中的浮点值左右移动,因为这是一个随机过程
为什么没有发生这种情况?我对流程的理解有误吗?这是:
注意,is正在为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
哦,我明白了,所以我应该在for
循环中递归地执行此操作,以便为每个浮点获得不同的随机洗牌,或者有更好的方法来实现此操作吗?没关系,我将结束此操作,提出一个新的问题,以避免混淆。谢谢@unutbu!好吧,既然你写了那么好的代码来替换我的错误代码,那么就没有必要再提出另一个问题了。再次非常感谢!
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