生成欧氏范数的随机向量<;=Python中的1?
更具体地说,给定一个自然数d,如何在R^d中生成随机向量,使每个向量x具有欧几里德范数,这是基于Wolfram Mathworld在math.stackexchange.com上的文章和类似问题,您可以通过生成生成欧氏范数的随机向量<;=Python中的1?,python,numpy,random,Python,Numpy,Random,更具体地说,给定一个自然数d,如何在R^d中生成随机向量,使每个向量x具有欧几里德范数,这是基于Wolfram Mathworld在math.stackexchange.com上的文章和类似问题,您可以通过生成d独立高斯随机变量的向量和均匀分布在闭合区间[0,1]上的随机数U,然后根据用户2357112的答案将向量归一化为normU^(1/d),来生成这样的向量,您需要这样的东西: import numpy as np ... inv_d = 1.0 / d for ...: gauss
d
独立高斯随机变量的向量和均匀分布在闭合区间[0,1]
上的随机数U
,然后根据用户2357112的答案将向量归一化为normU^(1/d)
,来生成这样的向量,您需要这样的东西:
import numpy as np
...
inv_d = 1.0 / d
for ...:
gauss = np.random.normal(size=d)
length = np.linalg.norm(gauss)
if length == 0.0:
x = gauss
else:
r = np.random.rand() ** inv_d
x = np.multiply(gauss, r / length)
# conceptually: / length followed by * r
# do something with x
(这是我的第二个Python程序,所以不要向我开枪……)
诀窍在于
- 具有相同σ的d个独立高斯变量的组合在d维上是一个高斯分布,它显著地具有球对称性
- 通过除以范数,可以将d维中的高斯分布投影到单位球面上,并且
- d维单位球体中的均匀分布具有累积的径向分布rd(这是您想要的)
- 这是我正在使用的Python/Numpy代码。由于它不使用循环,因此速度要快得多:
n_vectors=1000
d=2
rnd_vec=np.random.uniform(-1, 1, size=(n_vectors, d)) # the initial random vectors
unif=np.random.uniform(size=n_vectors) # a second array random numbers
scale_f=np.expand_dims(np.linalg.norm(rnd_vec, axis=1)/unif, axis=1) # the scaling factors
rnd_vec=rnd_vec/scale_f # the random vectors in R^d
第二个随机数数组(unif)需要作为第二个比例因子,因为否则所有向量的欧几里德范数都将等于一。您还应该定义期望的概率分布。我想,欧几里德空间是一致的。你可以根据约束条件减少后续数字的空间。对于最基本的情况,如果d=2,第一个数字是0.4,那么在区间[0,sqrt(1-0.4**2)]中生成第二个数字?@ayhan:这会不会使最后几个维度不太可能是高数字(因为这需要之前所有的维度都很小),从而影响随机性?“几乎所有的高维空间都是”远离中心。换句话说,高维单位超立方体可以说几乎完全由超立方体的“角”组成,几乎没有“中间”——@lamb_da_微积分你是对的,第一个数字不应该来自均匀分布。@WalterTross:的确,这就是为什么我们要采取第二步来修正标准。