【问题标题】:Filtering away nearby points from a list从列表中过滤掉附近的点
【发布时间】:2023-04-02 12:28:01
【问题描述】:

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 代码从我在那个答案中留下的地方开始,那么我更容易尝试它。

下一步是计算位图中真正有多少簇。我仍在努力定义该问题,因此我可能会返回有关它的问题。

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

如果您知道我可以如何使问题更清楚,请告诉我。

【问题讨论】:

  • 聚集质量有点令人困惑,因为我不确定它是否与高度或温度等标量值正确相关。例如,如果我有一个质量为 1 点的给定区域,这与具有质量为 1/10 的 10 个点的相同区域相同。也许澄清一下?
  • 我问的原因是,如果它是一个标量值,比如温度,你可以用轮廓来挑选温度相等的区域。
  • 抱歉回复晚了。是的,我想说我们正在处理单元格中的标量数据。毕竟是质量。

标签: python algorithm language-agnostic bitmap filtering


【解决方案1】:

您知道,您正在寻求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 算法,看看它是否更接近您真正想要的。

【讨论】:

  • 有趣的东西。 voronoi 图也称为 Dirichlet 镶嵌,我不知道 LDA。我认为如果你把质量当作标量,这个问题是可以解决的,基本上等同于为 GPS 测量大地水准面时所做的重力建模。
  • 谢谢!这里有很多有趣的东西。根据您的推理和您的一些链接,我理解我可能不应该太快地划分我的问题。找到一个关于均值偏移的 PDF:homepages.inf.ed.ac.uk/rbf/CVonline/LOCAL_COPIES/TUZEL1/…
  • @smacl:请注意,Dirichlet 是一个相当重的术语(这个人是一位非常重要的数学家)。在 LDA 中,它指的是狄利克雷分布,它作为集群的先验。在此之前,我还没有听说过他的其他作品,比如空间镶嵌。
【解决方案2】:

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

【讨论】:

  • 我认为对于K-means,需要知道簇的数量。
  • 你是对的,确实如此。但是,提问者对什么是“集群”并没有明确的定义,这或多或少是不可能的。
  • 问题更多是关于过滤列表而不是聚类。但我明白你的意思。如果您检查该问题中链接的其他问题,是否会使定义更清晰?
【解决方案3】:

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

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

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

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

【讨论】:

  • 谢谢。这个问题讨论的列表包含插值质量点。因此,每个簇中质量最大的点可以被视为每个簇的质心。现在我将查看那个三角测量链接,看看它是否是我正在寻找的。​​span>
【解决方案4】:

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

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

【讨论】:

  • 它看起来很像颜色量化(现在,我已经检查过了)。谢谢!但似乎大多数真实世界的颜色量化都适用于已知数量的集群(调色板)。就我而言,我需要自己找出答案(粗略地说,准确的答案不是问题)。
【解决方案5】:

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

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

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

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

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

【讨论】:

  • +1。我认为出于这个目的,特别是因为我们正在讨论小位图,我会先冒险走这条路。
【解决方案6】:

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

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

【讨论】:

  • 谢谢!和+1。当我考虑这个问题时,我倾向于看到一个重力“网”。我会带上你的线索,看看它会把我引向何方。
猜你喜欢
  • 2022-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-16
  • 1970-01-01
  • 2015-12-23
相关资源
最近更新 更多