【问题标题】:Translation of clustering problem to graph theory language聚类问题到图论语言的翻译
【发布时间】:2011-02-09 03:53:14
【问题描述】:

我有一个矩形平面网格,每个单元格都分配了一些整数权重。我正在寻找一种算法来识别具有高于平均重量的 3 到 6 个相邻单元格的集群。这些斑点应具有近似圆形的形状。

对于我的情况,不包含集群的单元格的平均权重约为 6,而包含集群的单元格的平均权重约为 6+4,即在 6 左右的某处有一个“背景权重”。权重的波动范围为泊松统计量。

对于小的背景贪婪或种子算法表现得相当好,但如果我的集群单元的权重接近背景波动,即即使没有任何东西,它们也会倾向于找到集群。此外,我无法在所有可能的设置中进行暴力搜索,因为我的网格很大(大约 1000x1000)并且我计划经常这样做(10^9 次)。我的印象是在图论中可能存在解决这个问题的方法。我听说过顶点覆盖和派系,但我不确定如何最好地将我的问题翻译成他们的语言。我知道图论可能在输入的统计性质方面存在问题,但我很想看看那里的算法能找到什么,即使它们无法识别每个集群。

这里是一个裁剪示例:框架区域每个单元格平均有 10 个条目,所有其他单元格平均有 6 个条目。当然,网格会进一步扩展。

| 8|  8|  2|  8|  2|  3| 
| 6|  4|  3|  6|  4|  4| 
        ===========
| 8|  3||13|  7| 11|| 7|
|10|  4||10| 12|  3|| 2|
| 5|  6||11|  6|  8||12|
        ===========
| 9|  4|  0|  2|  8|  7|

【问题讨论】:

  • 听起来像是计算机视觉中很久以前解决的问题。例如,试图检测黑暗背景上的暗星。虽然天文学家可能有很多资源,但他们也不介意快速完成。我怀疑你的问题以前已经解决了。顺便说一句,我会坚持使用矩阵数据结构。使用起来更快,而且很有意义。你想做什么?
  • 1000x1000 并没有那么多。你可以: A)使用一个好的快速“矩阵”库。 SciPy B) 计算平均“亮度”。 C)从左到右迭代每个单元格,然后从上到下。现在假设正方形 3x3。计算平均密度。看起来平均水平 - 继续前进。看起来比平时高?然后调查该地区。如果您有较大的区域(想想昏暗的星星旁边的天空中的云),这个问题很容易发生。这些云会搞砸一切。必须对数据的外观做出假设。
  • @Hamish:对于“已解决”,我正在寻找一种可靠的方法(很少有误报)。 AFAIK 这可能是一个 NP 难题
  • 我计划这样做十亿次。
  • @honk,这甚至不是一个定义明确的问题。你的规格很弱。特别是:什么是“高于平均水平”? 1 个标准差(无论那可能意味着什么)?理论上任何事情都是NP完全问题。像计算机视觉领域的从业者只是接受现实并以最好的方式处理它。你打算做什么10亿次?您需要处理1B“图像”吗?给我们一些关于你正在尝试做的事情的背景。处理实时数据?顺便说一句,小波可能有用,但我不太了解它们。

标签: graph cluster-analysis


【解决方案1】:

对于图论解决方案,有几句话in wikipedia,但您最好在 MathOverflow 上发帖。 This question 也可能有用。

在计算中解决这些问题的传统方法(可能最好考虑其普遍性)是栅格分析 - 在 GIS 和遥感领域众所周知,因此有许多工具可以提供实现。用于查找最适合您的问题的关键字是栅格、最近邻、重采样和聚类。 GDAL 库通常是其他工具的基础。

例如http://clusterville.org/spatialtools/index.html

您可以尝试查看 GDAL 库和源代码,看看是否可以在您的情况下使用它,或者看看它是如何实现的。

为了检查圆形,您可以将剩余值转换为多边形并检查结果特征

http://www.gdal.org/gdal_polygonize.html

【讨论】:

  • 感谢 geographika 的链接。由于我的信号非常微弱,我不想丢弃背景(无论如何这会引发另一组波动问题)。至于形状,我并不关心它,我只想找到斑点。最后,这些想法仍然(需要)遵循已知存在问题的贪婪或种子算法。这就是我寻找不同方法的原因。
  • 再次感谢您的指点。但正如我所写,我已经意识到这些工具,并正在寻找一个完全不同的方向来解决这个问题(主要是为了不习惯用他们的术语来思考的局限性)。我猜这个问题只是措辞不佳或缺乏重点。
【解决方案2】:

我不确定我是否看到了图论类比,但您可以通过预先计算面积积分来加快速度。这感觉像是一个多尺度的事情。

A[i,j] = Sum[Sum[p[u,v], {u, 0, i}, {v, 0, j}]];

那么一个矩形(a,b),(c,d)区域的平均亮度为

(A[c,d] - (A[c,b] + A[a,d]) + A[a,b])/((c-a)(d-b))

如果您的单元格中有大量数字,Overflow 可能不是您的朋友。

【讨论】:

  • 您能解释一下这对识别 blob 有什么用处吗?问题真的是“信号”与“背景”非常接近。
  • 您可以使用 4 次内存访问和 4 次加法,而不是计算像素的 k 个邻域中的平均值(这需要 k*k 次内存访问和添加)。
  • 如果您从图像的较大区域开始并尝试递归查找具有相似信噪比的区域,然后应用您的区域平均过滤器,这种类型的事情可能会很好。
【解决方案3】:

使用 union-find 算法进行聚类?速度非常快。

我猜这个图表是考虑到每对相邻的高价值单元相连的结果。使用 union-find 算法查找所有集群,并接受所有超过一定大小的集群,可能也有形状约束(例如,基于到集群中心的平均平方距离与集群大小)。这是 union-find 算法的一个微不足道的变体,可以随时收集所需的统计信息(计数、x 的总和、x ^ 2 的总和、y 的总和、y ^ 2 的总和)。

【讨论】:

    【解决方案4】:

    如果您只是在寻找一种将您的问题转化为图形问题的方法,那么您可以这样做。

    从每一点看你所有的邻居(这可能是 8 个相邻的正方形或 4 个相邻的正方形,这取决于你想要什么)。寻找具有最大值的邻居,如果它比你大,然后将自己连接到这个正方形。如果它更小,则什么也不做。

    在此之后,您将拥有一片森林或可能有一棵树(尽管我认为这不太可能)。这是将矩阵转换为图形的一种可能方式。我不确定它是否是最有用的翻译。

    【讨论】:

    • 这听起来是一个非常有趣的方法。我会创建一个额外的树来解释波动吗?
    • 您在答案中描述的内容将单元格聚集到计数最高的邻居。此计数可能会波动,因此该组合可能不属于同一个集群。
    猜你喜欢
    • 2012-09-08
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-25
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多