【问题标题】:Generating random vectors of Euclidean norm <= 1 in Python?在Python中生成欧几里得范数<= 1的随机向量?
【发布时间】:2016-10-01 08:40:03
【问题描述】:

更具体地说,给定一个自然数 d,我如何在 R^d 中生成随机向量,使得每个向量 x 都具有欧几里得范数

通过 numpy.random.rand(1,d) 生成随机向量是没有问题的,但是对于不小的 d,这种具有 norm

编辑:回复:沃尔特的评论,是的,我正在寻找 R^d 中单位球中向量的均匀分布。

【问题讨论】:

  • 您还应该定义您期望的概率分布。我猜是欧几里得空间中的均匀。
  • 您可以根据约束减少后续数字的空间。对于最基本的情况,如果 d=2,并且第一个数字是 0.4,则在区间 [0, sqrt(1-0.4**2)] 中生成第二个?
  • @ayhan:这会不会使得最后几个维度不太可能是高数字(因为这需要所有以前的维度都很小),从而损害随机性?
  • "几乎所有的高维空间都离中心“很远”。换句话说,高维单位超立方体可以说几乎完全由“角”组成超立方体的,几乎没有“中间”——en.wikipedia.org/wiki/Curse_of_dimensionality
  • @lamb_da_calculus 你是对的,第一个数字不应该来自均匀分布。

标签: python numpy random


【解决方案1】:

这是我正在使用的 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) 作为第二个缩放因子,否则所有向量的欧几里得范数都等于 1。

【讨论】:

    【解决方案2】:

    根据 user2357112 的回答,你需要这样的东西:

    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(这就是你的 need to invert

    【讨论】:

      【解决方案3】:

      根据 Wolfram Mathworld 关于hypersphere point pickingNate Eldredge's answer 的文章与math.stackexchange.com 上的类似问题,您可以通过生成d 独立高斯随机变量和随机数的向量来生成这样的向量U 均匀分布在闭区间 [0, 1] 上,然后将向量归一化为范数 U^(1/d)

      【讨论】:

      • @WalterTross:确实,这就是为什么我们有第二步来修复规范。
      猜你喜欢
      • 2020-11-11
      • 2012-06-11
      • 2019-04-21
      • 2021-03-07
      • 1970-01-01
      • 2020-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多