多维空间中的随机单位向量

Mat*_*att 20 random distribution data-mining uniform computational-geometry

我正在研究一种数据挖掘算法,我想从特征空间的特定点中选择一个随机方向.

如果我为[-1,1]中的每个n维选择一个随机数,然后将矢量标准化为长度1,我将在所有可能的方向上得到均匀分布?

我在理论上只是在这里说,因为计算机生成的随机数实际上并不是随机的.

小智 36

一个简单的技巧是从高斯分布中选择每个维度,然后标准化:

from random import gauss

def make_rand_vector(dims):
    vec = [gauss(0, 1) for i in range(dims)]
    mag = sum(x**2 for x in vec) ** .5
    return [x/mag for x in vec]
Run Code Online (Sandbox Code Playgroud)

例如,如果您想要一个7维随机向量,请选择7个随机值(来自高斯分布,平均值为0,标准差为1).然后,使用毕达哥拉斯公式计算得到的向量的大小(每个值的平方,加上正方形,并取结果的平方根).最后,将每个值除以幅度以获得归一化的随机向量.

如果您的维度数量很大,那么这有利于始终立即工作,同时生成随机向量,直到您发现一个大小小于1的那个将导致您的计算机简单地挂在十几个维度左右,因为他们任何一个资格的概率变得非常小.

  • 快速解释其原因:给定<x,y>处的点的概率P是P(x)*P(y).高斯分布大致为e ^( - x ^ 2),因此e ^( - x ^ 2)*e ^( - y ^ 2)为e ^( - (x ^ 2 + y ^ 2)).这仅是点与原点的距离的函数,因此得到的分布是径向对称的.这很容易推广到更高的尺寸. (5认同)
  • 这里有一个关于为什么这种方法是正确的参考http://mathworld.wolfram.com/HyperspherePointPicking.html (2认同)
  • 附加说明:Box-Muller 变换可用于从独立的均匀分布变量对生成独立的正态分布变量对(没有“浪费”)。 (2认同)

Jim*_*wis 14

您将无法使用所描述的算法获得均匀分布的角度集合.角度将偏向n维超立方体的角.

这可以通过消除原点距离大于1的任何点来解决.然后,您将处理球形而不是立方体(n维)体积,然后您的角度集应均匀分布在样本空间上.

伪代码:

令n为维数,K为所需向量数:

vec_count=0
while vec_count < K
   generate n uniformly distributed values a[0..n-1] over [-1, 1]
   r_squared = sum over i=0,n-1 of a[i]^2
   if 0 < r_squared <= 1.0
      b[i] = a[i]/sqrt(r_squared)  ; normalize to length of 1
      add vector b[0..n-1] to output list
      vec_count = vec_count + 1
   else
      reject this sample
end while
Run Code Online (Sandbox Code Playgroud)