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

Random 多维空间中的随机单位向量,random,distribution,data-mining,computational-geometry,uniform,Random,Distribution,Data Mining,Computational Geometry,Uniform,我正在研究一个数据挖掘算法,在这个算法中,我想从特征空间中的一个特定点选择一个随机方向 如果我从[-1,1]中为n个维度中的每一个选择一个随机数,然后将向量的长度规格化为1,我会在所有可能的方向上得到均匀分布吗 我在这里只是从理论上讲,因为计算机生成的随机数实际上并不是随机的。用你描述的算法,你不会得到均匀分布的角度集合。角度将偏向于n维超立方体的角 这可以通过消除距离原点大于1的任何点来修复。然后你处理的是一个球形而不是立方(n维)体积,你的角度集应该均匀分布在样本空间上 伪代码: 设n为维数

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

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


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

用你描述的算法,你不会得到均匀分布的角度集合。角度将偏向于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
vec\u计数=0
而向量u计数如果0
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的向量,这将导致你的计算机挂起十几个维度左右,因为它们中任何一个符合条件的概率都变得非常小。

从正态分布采样的算法有一个改进的实现:

我在开发ML算法时遇到了完全相同的问题。
#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);
我得到了与Jim Lewis相同的结论,在为二维情况绘制了样本并绘制了由此产生的角度分布图之后

此外,如果在从[-1,1]随机绘制x轴和y轴时,尝试推导2d方向的密度分布,您将看到:

f_X(X)=1/(4*cos²(X))
如果0
f_X(X)=1/(4*sin²(X))
如果X>45⁰

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

我在这里写过:

这正是我所担心的。我只是没能像你描述的那样在脑海中把它正式化。直觉上我知道我想要我可能的随机向量来描述一个圆。我只是不知道如何在代码中实现它。@Matt:我对我的答案进行了一些扩展,希望能有所帮助。如果你能用一个封闭形式的表达式来解决这个问题,为什么要使用一个具有非确定性运行时和分支的算法呢?太好了!谢谢你的补充建议。顺便说一下,boost就是这样实现的。;)这里有一个关于为什么这个方法是正确的参考,一个关于为什么这个方法有效的快速解释:一个点在给定点的概率P是P(x)*P(y)。高斯分布的形式大致为e^(-x^2),因此e^(-x^2)*e^(-y^2)是e^(-x^2+y^2)。这只是点到原点距离的函数,因此得到的分布是径向对称的。这很容易推广到更高的维度。附加说明:Box–Muller变换可用于从均匀分布变量的独立对生成正态分布变量的独立对(没有“浪费”)。对于像我这样的非机械类人来说,代码不再是很难读的。对它的作用,为什么它比公认的答案更好,或者其他什么有什么评论吗?