Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
生成欧氏范数的随机向量<;=Python中的1?_Python_Numpy_Random - Fatal编程技术网

生成欧氏范数的随机向量<;=Python中的1?

生成欧氏范数的随机向量<;=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,如何在R^d中生成随机向量,使每个向量x具有欧几里德范数,这是基于Wolfram Mathworld在math.stackexchange.com上的文章和类似问题,您可以通过生成
d
独立高斯随机变量的向量和均匀分布在闭合区间
[0,1]
上的随机数
U
,然后根据用户2357112的答案将向量归一化为norm
U^(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:的确,这就是为什么我们要采取第二步来修正标准。