【问题标题】:How to generate this shape in Matlab?如何在 Matlab 中生成这个形状?
【发布时间】:2012-01-12 01:45:01
【问题描述】:

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

【问题讨论】:

  • 您是要生成点,还是要对它们进行聚类?
  • 根据定义,k-means 将无法对此进行聚类,因为没有 voronoi 分离。试试 DBSCAN 或 OPTICS。

标签: matlab cluster-analysis k-means


【解决方案1】:

如果你想生成这样的数据点,你需要有它们的概率分布才能生成这些点。

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

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

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,例如逆变换采样方法,它提供生成数据的算法,而不是像我在这里所做的手动变量转换。

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 这是我从别处得到的图,所以我没有原始的Matlab代码来生成它。我知道 K-means 会失败,所以我想试试单联动和全联动,看看哪个更好。但在任何聚类之前,第一步是生成这些数据。那么如何在 Matlab 中做到这一点呢?谢谢。
    【解决方案3】:

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

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

    • 您的输入数据实际上是高维数据,而您的示例图像只是二维投影。
    • 您正在使用跨维度缩放的距离度量。

    为了实现你的目标:

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

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

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

    【讨论】:

    • 这是我从别处得到的图,所以我没有原始的Matlab代码来生成它。我知道 K-means 会失败,所以我想试试单联动和全联动,看看哪个更好。但在任何聚类之前,第一步是生成这些数据。那么如何在 Matlab 中做到这一点呢?所有数据都是二维的。
    猜你喜欢
    • 1970-01-01
    • 2016-06-20
    • 1970-01-01
    • 2018-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-20
    • 2014-03-30
    相关资源
    最近更新 更多