0

关于在位图中查找质量簇的问题,我回答了一半。我说一半是因为我把它留在了位图中的所有点都按质量排序的条件下,然后留给读者过滤从同一簇中删除点的列表。

然后,当考虑这一步时,我发现解决方案并没有像我想象的那样跳出来。所以现在我向你们寻求帮助。我们有一个具有类似质量的点列表(一个 Python 元组列表,但您可以用任何语言表示它):

[ (6, 2, 6.1580555555555554),
  (2, 1, 5.4861111111111107),
  (1, 1, 4.6736111111111107),
  (1, 4, 4.5938888888888885),
  (2, 0, 4.54),
  (1, 5, 4.4480555555555554),
  (4, 7, 4.4480555555555554),
  (5, 7, 4.4059637188208614),
  (4, 8, 4.3659637188208613),
  (1, 0, 4.3611111111111107),
  (5, 8, 4.3342191043083904),
  (5, 2, 4.119574829931973),
  ...
  (8, 8, 0.27611111111111108),
  (0, 8, 0.24138888888888888) ]

每个元组的形式为:

(x, y, mass)

请注意,列表在此处排序。如果您的解决方案不希望对它们进行排序,那完全可以。

如果你还记得的话,挑战是找到主要的质量群。集群的数量是未知的。但是您知道位图的尺寸。有时,一个簇中的几个点的质量比下一个(按大小)簇的中心大。所以我想要做的是从质量较高的点出发并删除同一簇中的点(附近的点)。

当我尝试这样做时,我最终不得不一遍又一遍地遍历列表的某些部分。我有一种感觉,我对此很愚蠢。你会怎么做?伪代码或真实代码。当然,如果您可以使用 Python 代码从我在该答案中留下的地方开始,那么我更容易尝试它。

下一步是计算位图中真正有多少簇。我仍在努力定义这个问题,所以我可能会带着一个问题回来。

编辑:我应该澄清一下,我知道这个问题没有“正确”的答案。问题的名称是关键。我的集群的第一阶段已经完成。我正在寻找一种快速、准确“足够”的方法来过滤掉附近的点。

如果您看到我如何使问题更清楚,请告诉我。

4

6 回答 6

5

正如你所知道的,你正在寻求一个不适定问题的解决方案:不存在明确的解决方案。没关系……它只是让它更有趣。你的问题是不适定的,主要是因为你不知道你想要多少个集群。聚类是机器学习的关键领域之一,多年来已经开发了很多方法。

正如 Arachnid 所指出的,k-means算法往往是一个很好的算法,而且很容易实现。结果主要取决于所做的初始猜测和所需集群的数量。为了克服初始猜测问题,通常使用随机初始化多次运行算法并选择最佳结果。您需要定义“最佳”的含义。一种度量是每个点到其聚类中心的均方距离。如果您想自动猜测有多少个集群,您应该使用整个集群数量范围运行该算法。对于任何好的“最佳”度量,更多的集群看起来总是比更少的更好,所以你需要一种惩罚集群太多的方法。MDL _维基百科上的讨论是一个很好的起点。

K-means 聚类基本上是最简单的混合模型。有时,升级到通过期望最大化学习的混合高斯是有帮助的(在刚刚给出的链接中描述)。这可能比 k-means 更健壮。理解它需要更多的努力,但是当你理解它时,它的实现并不比 k-means 难多少。

还有很多其他的聚类技术,例如凝聚聚类和谱聚类。凝聚集群很容易实现,但选择何时停止构建集群可能很棘手。如果您进行凝聚聚类,您可能希望查看kd 树以进行更快的最近邻搜索。smacl 的答案描述了一种使用 Voronoi 图进行凝聚聚类的方式略有不同。

有些模型可以自动为您选择集群的数量,例如基于潜在狄利克雷分配的模型,但它们很难正确理解实现。

您可能还想查看均值偏移算法,看看它是否更接近您真正想要的。

于 2009-01-06T15:46:16.567 回答
4

在我看来,您正在寻找K-means算法。

于 2009-01-06T13:56:27.520 回答
3

正如我在对您的问题的评论中提到的那样,答案取决于在这种情况下是否可以将质量视为标量。如果是这样,基于颜色的解决方案可能不会起作用,因为颜色通常不被视为标量。

例如,如果我有一个质量为 1 个点的给定区域,这与具有 10 个质量的 1/10 点的相同区域相同吗?如果这是真的,那么在这种情况下质量不是标量,我倾向于研究一种用于在空间上对类似的不可缩放值进行组合的算法,例如voronoi 图

替代文字

在这种情况下,两个相邻的 voronoi 区域具有足够接近的质量匹配和距离,它们可以聚集在一起。您可以重复此操作以查找所有集群。

另一方面,如果您的质量是可扩展的,或者未知位置的质量可以从周围的点进行插值,我会倾向于对输入数据进行三角剖分和轮廓化,并使用轮廓之间的区域来查找质量相似的集群。

于 2009-01-06T13:42:05.193 回答
1

这听起来像颜色量化,您可以减少图像中的颜色数量。一种方法是在空间中绘制颜色,并将集群组合到集群的中心(或加权平均值)。

触发此内存的算法的确切名称让我失望,但如果它弹出我会编辑答案,但与此同时,你应该看看颜色量化,看看一些算法是否有用。

于 2009-01-06T13:02:17.553 回答
1

从“凸壳”问题开始。您还在寻找一些类似“凸包”的集群。

请注意,“集群”是模糊的。你在你的领域有一个平均质量。有些点的质量高于平均水平,有些低于平均水平。高于平均水平多少意味着您找到了一个集群?节点必须相距多远才能成为集群或单独集群的一部分?

两个山峰和一个山脊有什么区别?

您必须计算“地形” - 将所有具有相等密度的点连接到区域中。这要求您选择一个点并从一个点径向计算出您想要的位置,定位密度相等的位置。您可以将这些点连接到区域中。

如果您明智地选择了初始点,则区域应该嵌套。选择起点很容易,因为您从当地的高点开始。

于 2009-01-06T13:03:48.440 回答
1

既然您已经在谈论质量,为什么不使用基于重力的解决方案。一个简单的粒子系统不需要非常精确,而且您不必运行太长时间就可以更好地猜测集群的数量。

如果您对簇数有更好的了解,则 k-means 最近邻变得可行。

于 2009-01-06T13:21:28.060 回答