从列表中过滤掉附近的点

时间:2009-01-06 12:54:58

标签: python algorithm language-agnostic bitmap filtering

half-answered a question about finding clusters of mass in a bitmap。我说半答案是因为我把它放在一个条件下,我将位图中的所有点按质量分类并留给读者来过滤从同一个簇中删除点的列表。

然后在考虑这一步时,我发现解决方案没有像我想的那样跳出来。所以现在我要求你们帮忙。我们有一个像这样的质量点的列表(一个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)

请注意,列表在此处排序。如果您的解决方案更喜欢不对它们进行排序,那就完全没问题了。

挑战if you recall是找到群众的主要群体。群集的数量尚不清楚。但是你知道位图的尺寸。有时,群集中的多个点的质量大于下一个(大小)群集的中心。所以我想做的就是从较高质量的点开始,并移除同一簇中的点(附近的点)。

当我尝试这个时,我最终不得不一遍又一遍地浏览部分列表。我有一种感觉,我只是愚蠢。你会怎么做?伪代码或真实代码。当然,如果你能用Python代码从我离开的那个地方起飞,我就更容易进行实验。

下一步是弄清楚位图中确实有多少个簇。我仍然在努力定义这个问题所以我可能会回答一个问题。

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

如果你知道如何让问题更清楚,请告诉我。

6 个答案:

答案 0 :(得分:5)

您知道,您正在寻求ill-posed问题的解决方案:不存在确定的解决方案。那很好......它只是让它变得更有趣。您的问题不合适主要是因为您不知道您想要多少个群集。聚类是机器学习的关键领域之一,多年来已经开发了很多方法。

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

K-means聚类基本上是最简单的mixture model。有时升级到通过期望最大化学习的高斯混合体(在刚刚给出的链接中描述)是有帮助的。这比k-means更强大。理解它需要花费更多的精力,但是当你这样做时,它并不比k-means更难实现。

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

有些模型可以自动为您选择群集数量,例如基于Latent Dirichlet Allocation的群集,但要正确理解工具要困难得多。

您可能还想查看mean-shift算法,看它是否更接近您真正想要的内容。

答案 1 :(得分:4)

听起来我正在寻找K-means算法。

答案 2 :(得分:3)

正如我在你的问题的评论中提到的,答案是基于在这种情况下质量是否可以被认为是标量。如果是这样,基于颜色的解决方案可能无法正常工作,因为颜色通常不会被视为标量。

例如,如果我有一个高质量点的给定区域,那么是否具有10个质量的10点的相同区域?如果这是真的,那么在这种情况下质量不是标量,并且我倾向于研究用于空间地挖掘类似的不可伸缩值的算法,例如, voronoi diagrams

alt text

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

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

答案 3 :(得分:1)

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

触发此内存的算法的确切名称使我失败,但如果弹出,我会编辑答案,但与此同时,您应该查看颜色量化并查看某些算法是否有用。< / p>

答案 4 :(得分:1)

从“Convex Hull”问题开始。你也在寻找一些类似“凸壳”的集群。

请注意,“群集”含糊不清。您的场地平均质量。有些点的质量高于平均值,有些点低于平均值。高于平均值意味着你找到了一个集群?节点必须离多远才能成为集群或单独集群的一部分?

两座山峰和山脊之间有什么区别?

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

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

答案 5 :(得分:1)

既然你已经在谈论质量,为什么不是基于引力的解决方案。一个简单的粒子系统不需要非常准确,你不必再运行它太长时间才能更好地猜测簇的数量。

如果您对群集数量有更好的了解,那么k-means最近邻居变得可行。

相关问题