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的那个将导致您的计算机简单地挂在十几个维度左右,因为他们任何一个资格的概率变得非常小.
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)
归档时间: |
|
查看次数: |
12269 次 |
最近记录: |