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

时间:2011-06-08 17:53:31

标签: random distribution data-mining computational-geometry uniform

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

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

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

5 个答案:

答案 0 :(得分: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]

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

如果您的维度数量很大,那么这样做有很大好处,可以立即使用,同时生成随机向量,直到找到一个大小小于1的向量,这会导致您的计算机只是挂在十几个维度上左右,因为任何一个资格的概率都变得非常小。

答案 1 :(得分:13)

您将无法使用所描述的算法获得均匀分布的角度集合。角度将偏向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

答案 2 :(得分:2)

在开发ML算法时,我有完全相同的问题 在得到2-d案例的样本并绘制出角度的分布后,我得到了与Jim Lewis相同的结论。

此外,如果你试图从[-1,1]中随机抽取x轴和y轴时在2d中得出方向的密度分布,你会看到:

f_X(x) = 1/(4*cos²(x)) 如果0&lt; x&lt; 45⁰

f_X(x) = 1/(4*sin²(x)) 如果x&gt; 45⁰

其中x是角度,f_X是概率密度分布。

我在这里写过: https://aerodatablog.wordpress.com/2018/01/14/random-hyperplanes/

答案 3 :(得分:1)

从正态分布中采样的算法有一个加速实现:random::uniform_on_sphere

答案 4 :(得分:-3)

#define SCL1 (M_SQRT2/2)
#define SCL2 (M_SQRT2*2)

// unitrand in [-1,1].
double u = SCL1 * unitrand();
double v = SCL1 * unitrand();
double w = SCL2 * sqrt(1.0 - u*u - v*v);

double x = w * u;
double y = w * v;
double z = 1.0 - 2.0 * (u*u + v*v);