使用Matlab,如何生成在8维单位球上均匀定位(或分布)的3 ^ 10个网络?
答案 0 :(得分:3)
在n-d单位球体上获得点的一种简单方法是创建一个n-d立方体,切掉角落,并将剩余半径标准化为1.请注意,如果没有切割,分布将不均匀。
然而,由于超球面相对于封闭盒的体积随着维数的增加而减小,这不是一种特别有效的方式。
更好的方法是生成nd正态分布点(半径)的数组,并将它们标准化为球体的半径 - nd正态分布是径向对称的,因此表面上的分布将是均匀的< / p>
%# set-up
nPoints = 3^10;
nDim = 8;
%# create normally distributed variables
points = randn(nPoints,nDim);
%# normalize by dividing by the norm (=square root of sum(points.^2,2) )
points = bsxfun(@rdivide,points,sqrt(sum(points.^2,2)));
答案 1 :(得分:0)
好的,on Wikipedia我们读到了
半径为n的n球被定义为(n + 1)维欧氏空间中与中心点距离为r的点的集合,其中半径r可以是任何正实数
所以你的问题变成了在7空间中生成3 ^ 10个向量的问题。在不丢失任何内容的情况下,我们可以r = 1
。方法是在7空间中生成随机向量,然后以通常的方式将它们标准化为单位长度
这里有一些我匆忙敲门的代码,我知道我应该有矢量化的东西而不是写入循环,我会把它留给OP。代码不需要任何解释。
pointset = rand(3^10,7);
normset = zeros(3^10,1);
for ix = 1:3^10
normset(ix) = norm(pointset(ix,:));
end
for ix = 1:3^10
pointset(ix,:) = pointset(ix,:)/normset(ix);
end
当然,这依赖于Matlab的PRNG生成均匀分布的数字,以在8球上创建均匀分布的网络。
答案 2 :(得分:0)
来自维基百科n-sphere
生成均匀分布 (n - 1) - 球上的随机点 (即,n球的表面), Marsaglia(1972)给出了以下内容 算法
生成n维向量 正常偏差(足以使用 N(0,1),实际上是选择 方差是任意的), \ mathbf {X} =(X_1,X_2,\ ldots,x_n)。
现在计算出它的“半径” 点, R = \ SQRT {X_1 ^ 2 + X_2 ^ 2 + \ cdots + x_n ^ 2}。
vector \ frac {1} {r} \ mathbf {x}是 均匀分布在表面上 单位n球。
完成此任务的matlab代码片段是:
numdims = 8;
numpts = 3^10;
x = randn([numdims numpts]);
lx = repmat(sqrt(sum(x.^2,1)), [numdims 1]);
x = x./lx;
%x(:,j) is the jth point on the circle)