【发布时间】:2012-01-12 01:45:01
【问题描述】:
在matlab中,如何生成两个随机点簇,如下图。你能告诉我脚本/代码吗?
【问题讨论】:
-
您是要生成点,还是要对它们进行聚类?
-
根据定义,k-means 将无法对此进行聚类,因为没有 voronoi 分离。试试 DBSCAN 或 OPTICS。
标签: matlab cluster-analysis k-means
在matlab中,如何生成两个随机点簇,如下图。你能告诉我脚本/代码吗?
【问题讨论】:
标签: matlab cluster-analysis k-means
如果你想生成这样的数据点,你需要有它们的概率分布才能生成这些点。
对于你的观点,我没有真正的分布,所以我只能给出一个近似值。从您的图中,我看到两者都大约位于一个圆上,具有随机半径和有限的角度跨度。我假设这些角度和半径均匀分布在某些范围内,这似乎是一个很好的起点。
因此,在极坐标(即角度和半径)而不是笛卡尔坐标(即水平和垂直)中生成随机数据也是有意义的,并将它们转换为允许绘图。
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
这会产生:
当您处理可以轻松转换的分布以及可以轻松描述点的可能位置时,此方法的效果相对较好。如果你不能,还有其他methods,例如逆变换采样方法,它提供生成数据的算法,而不是像我在这里所做的手动变量转换。
【讨论】:
假设您确实想对现有数据执行聚类操作,而不是生成数据本身。由于您有一些数据图,因此您已经知道如何做到这一点似乎是合乎逻辑的!如果我在这个假设上错了,那么你以后应该更仔细地提出你的问题。
人类的大脑非常擅长看到这样的模式,在计算机上编写代码通常需要一些认真的努力。
如前所述,k-means 等传统聚类工具会失败。幸运的是,图像处理工具箱已经为这些目的编写了很好的工具。我可能会建议将绘图转换为图像,使用填充点来绘制点。确保这些点足够大,以便它们在一个簇内相互接触,并有一些重叠。然后在必要时使用膨胀/侵蚀工具确保填充任何小裂缝,但不要过分导致集群合并。最后,使用区域分割工具挑选出集群。完成后,将图像中的像素单位转换回您的空间单位,您就完成了任务。
要使图像处理方法发挥作用,与集群内的粗糙度相比,集群之间需要有足够的分离度。但这对于任何成功的方法来说都是显而易见的。
【讨论】:
K-means 不会给你你想要的。
对于 K-means,向量根据其最近的聚类中心进行分类。我只能想到两种方法可以得到图中所示的非凸分配:
为了实现你的目标:
您可以找到关于非线性聚类算法的列表here。具体来说,请查看 MST 集群页面上的this reference。您的确切形状会显示在 PDF 的第四页上,并与 K-Means 发生的情况进行比较。
对于现有的 MATLAB 代码,您可以尝试这个 Kernel K-Means 实现。另外,请查看Clustering Toolbox。
【讨论】: