Matlab n维点分布

Matlab n维点分布,matlab,math,geometry,distribution,Matlab,Math,Geometry,Distribution,如何像图A一样分配点 图B的matlab代码: N = 30; % number of points r = 0.5; % r = radius d = 50; % dimension C_point = 0; % center point figure, clf C = ones(1, d) * C_point; C_rep = repmat( C,N,1); X = randn(N,d); s2 = sum(X.^2,2) ; radius = r * (rand(N,1).^(1

如何像图A一样分配点

图B的matlab代码:

N = 30;   % number of points
r = 0.5; % r = radius 
d = 50;  % dimension
C_point = 0; % center point
figure, clf
C = ones(1, d) * C_point;
C_rep = repmat( C,N,1);
X = randn(N,d); 
s2 = sum(X.^2,2) ;
radius = r * (rand(N,1).^(1/d));  
X = X.*repmat(radius./sqrt(s2),1,d) + C_rep; 

%% Plot 2D
t = linspace(0, 2*pi, 100);
x = r*cos(t) + C(1);
y = r*sin(t) + C(2);    
plot(x,y,'b')
hold on
plot(C(1),C(2),'b.', 'MarkerSize', 10) % center point
hold on  
plot(X(:,1), X(:,2),'r.','markersize',10); 
axis equal;rotate3d off; rotate3d on;drawnow;shg; 
hold on
ax = axis;

我应该改成图A的样子


OP的代码计算均匀分布在d维长方体中的点,将这些点投影到d维球体上,然后采样半径以将它们移动到d维球体内。这是完美的,除了框内的点投影到球体上时,不会在该球体上形成均匀分布。相反,如果你发现随机点分布在高斯分布中,你就可以得到均匀的角度分布

首先计算
d
维度中高斯分布的点(我在这里做的所有工作都对OP的代码进行了最小的更改):

请注意,我使用的是
randn
,而不是
rand
randn
创建高斯分布

接下来,我们规范化向量,使点移动到球体:

nX = sqrt(sum(X.^2,2));
X = X./repmat(nX,1,d);
这些点是均匀分布的,可以通过
散点3(X(:,1)、X(:,2)、X(:,3))进行验证;轴相等
并旋转显示(2D渲染无法正确执行)。这就是我在上面设置
d=3
N=1000
的原因。我希望能够画出这些点,并看到很多

接下来,我们计算到原点的随机距离,如您所做的,并根据维度进行校正:

radius = r * (rand(N,1).^(1/d));
X = X.*repmat(radius,1,d) + C_rep;
X
现在在球中均匀分布。同样,
scatter3(X(:,1),X(:,2),X(:,3));轴相等
显示了这一点

但是,如果设置
d=50
,然后只绘制数据的两个维度,则不会看到数据填充圆。你也不会看到均匀分布。这是因为你要把一个50维的球投射到2维上,这根本不起作用。您必须信任数学,或者必须对数据进行切片:

figure, hold on
t = linspace(0, 2*pi, 100);
x = r*cos(t) + C(1);
y = r*sin(t) + C(2);    
plot(x,y,'b')
plot(C(1),C(2),'b.', 'MarkerSize', 10) % center point
axis equal

I = all(abs(X(:,3:d))<0.1,2);
plot(X(I,1), X(I,2),'r.','markersize',10); 
图,稍等
t=linspace(0,2*pi,100);
x=r*cos(t)+C(1);
y=r*sin(t)+C(2);
图(x,y,'b')
图(C(1)、C(2)、‘b’、‘MarkerSize’、10%中心点
轴相等

I=all(abs(X(:,3:d))问题出在哪里?您是否只想将点随机分布在整个圆上(而不是像图B中那样围绕中心)?问题标题中的n维是什么意思?你知道点的3D分布和3D图吗?我不确定是否有一种直接的方法可以在n维球体内随机生成点,找到任意形状内的点的正确方法是在边界框内生成点,然后测试它是否存在形状内部。例如:
X=2*rand(1,d)-1
,然后测试是否
sum(X.^2)这里有另一种方法:有答案。它涉及到生成一个高斯分布变量。@Cris Luengo我的代码来自您评论中的链接。请检查链接中的AMB和Kuan Sung评论。请您推荐一个好的参考资料来解释所有这些概念。谢谢。我没有一个参考资料,这是信息多年来我一直在拼凑。你可以在维基百科上读到的多维高斯分布。我在2D中知道的根-
d
技巧,显然它在任何维度都有效。根-d技巧:半径r+dr处壳的体积与r^d成正比。如果你均匀地采样r,小r的壳将得到相同的nu其小体积中的点的数量,如较大r的壳,体积大得多。通过均匀采样r^d(取[0,1]范围内均匀变量的根-d得到),将更多的点分配给更大的体积壳,这样所有r的点密度都相等。感谢您的回答,如果我有M个d维球,每个球内有N个点(点均匀分布),该怎么办。如何在不相互碰撞或重叠的情况下均匀分布M d维球?@Shdotcom:这是一个完全不同的问题,您可能应该为此发布一个新问题(或者先做一些研究,我相信您也会找到相应的代码).请注意,均匀分布且无重叠的球与球内任意放置的点无关。
figure, hold on
t = linspace(0, 2*pi, 100);
x = r*cos(t) + C(1);
y = r*sin(t) + C(2);    
plot(x,y,'b')
plot(C(1),C(2),'b.', 'MarkerSize', 10) % center point
axis equal

I = all(abs(X(:,3:d))<0.1,2);
plot(X(I,1), X(I,2),'r.','markersize',10);