如何在Matlab中生成这个形状?

时间:2011-12-03 07:39:14

标签: matlab cluster-analysis k-means

在matlab中,如何生成两个随机点集群,如下图所示。你能告诉我脚本/代码吗?

Target shape

3 个答案:

答案 0 :(得分:5)

如果要生成此类数据点,则需要使其概率分布能够生成点。

对于你的观点,我没有真实的分布,所以我只能给出近似值。从你的图中我看到它们大致位于一个圆上,具有随机半径和角度的有限跨度。我假设这些角度和半径均匀分布在某个范围内,这似乎是一个非常好的起点。

因此,在极坐标(即角度和半径)中生成随机数据而不是笛卡尔坐标(即水平和垂直)也是有意义的,并将它们转换为允许绘图。

C1 = [0 0];   % center of the circle
C2 = [-5 7.5];
R1 = [8 10];  % range of radii
R2 = [8 10];
A1 = [1 3]*pi/2; % [rad] range of allowed angles
A2 = [-1 1]*pi/2;

nPoints = 500;

urand = @(nPoints,limits)(limits(1) + rand(nPoints,1)*diff(limits));
randomCircle = @(n,r,a)(pol2cart(urand(n,a),urand(n,r)));

[P1x,P1y] = randomCircle(nPoints,R1,A1);
P1x = P1x + C1(1);
P1y = P1y + C1(2);

[P2x,P2y] = randomCircle(nPoints,R2,A2);
P2x = P2x + C2(1);
P2y = P2y + C2(2);

figure
plot(P1x,P1y,'or'); hold on;
plot(P2x,P2y,'sb'); hold on;
axis square

这会产生:

Outcome

当您处理可轻松转换的分布以及何时可以轻松描述点的可能位置时,此方法的效果相对较好。如果不能,还有其他methods,例如逆变换采样方法,它提供算法来生成数据而不是手动变量转换,就像我在这里所做的那样。

答案 1 :(得分:2)

K-means不会给你你想要的东西。

对于K-means,向量基于其最近的聚类中心进行分类。我只能想到两种方法可以得到图中所示的非凸分配:

  • 您的输入数据实际上是更高维度的,您的样本图像只是一个二维投影。
  • 您使用的距离指标在维度上具有不同的缩放比例。

实现您的目标:

  • 使用非线性聚类算法。
  • 对输入数据应用非线性变换。 (可能不可行)。

您可以找到非线性聚类算法here的列表。具体来说,请查看MST群集页面上的this reference。您的确切形状将显示在PDF的第四页上,并与K-Means进行比较。

对于现有的MATLAB代码,您可以尝试此Kernel K-Means实现。另外,请查看Clustering Toolbox

答案 2 :(得分:2)

假设您确实希望对现有数据执行群集操作,而不是生成数据本身。由于你有一些数据的图表,你已经知道如何做到这一点似乎是合乎逻辑的!如果我在这个假设中错了,那么你应该在将来更仔细地提出你的问题。

人类大脑非常擅长在这样的事情中看到模式,在计算机上编写代码通常需要付出一些努力。

如前所述,传统的集群工具(如k-means)将失败。幸运的是,图像处理工具箱具有用于这些目的的良好工具。我可能会建议将绘图转换为图像,使用填充点来绘制点。确保点足够大,使它们在一个簇内相互接触,并有一些重叠。然后在必要时使用扩张/侵蚀工具以确保填充任何小裂缝,但不要导致群集合并。最后,使用区域分割工具来挑选群集。完成后,从图像中的像素单位转换回空间单位,您就完成了任务。

要使图像处理方法起作用,与群集中的粗糙度相比,群集之间需要充分分离。但这对于任何成功的方法来说都是显而易见的。