【问题标题】:How to identify clusters of nodes in a network如何识别网络中的节点集群
【发布时间】:2023-03-12 22:40:02
【问题描述】:

我有一张表,描述了几组连接的节点:

node
origin_node REFERENCES node
start_time
end_time

我想知道数据集包含多少个集群,例如如果记录是:

A, B, 10:00, 11:00
B, C, 9:00, 9:15
D, E, 10:00, 10:15
B, A, 13:00, 13:30
E, B, 12:00, 13:20
F, G, 9:00, 9:15

...那么我将有 2 个集群 {A,B,C,D,E} 和 {F,G}

(时间几乎无关紧要 - 它只是为了证明 node+origin_node 不一定是唯一的/有序的)。

但是我在制定一种从几千行中识别集群的算法时有点卡住了。

我正在使用 MySQL 5.0.22 - 所以没有“CONNECT BY”,并且可以访问 PHP 和 awk - 尽管我更容易理解算法而不是编码解决方案。只要分析数据需要不到几个小时的时间,我就会倾向于简单而不是顺序。

顺便说一句:这是一个现实世界的问题——不是家庭作业(我很久以前就不再是学生了——也许还为时过早;)

TIA

【问题讨论】:

  • 在搜索算法之前,您应该很好地确定您要解决的问题,即,什么是抓住您的聚类想法的“公式”?它们与en.wikipedia.org/wiki/K-means_clustering 使用的相似吗?
  • 我认为没有办法在 MySQL 中使用单个 SQL 语句来做到这一点。我会在程序上更接近它作为存储过程或在 PHP 中。如果它只有几千行,那么无论您如何处理性能都应该不是问题。可能是一个由节点键控的哈希表,其值为集群。然后,您只需要将集群合并在一起即可。
  • @akappa:也许我对聚类一词的使用不合适,因为 Wikipedia 上关于聚类算法的讨论虽然很有趣,但基于测量基数指标的相对距离——而我的数据主要是名义上的,以一组重叠树的形式存在(即生成的复合图可能包含闭环)

标签: php mysql algorithm networking graph


【解决方案1】:

我更容易理解算法而不是编码解决方案

试过这些链接吗?

http://en.wikipedia.org/wiki/Cluster_analysis

http://en.wikipedia.org/wiki/Category:Data_clustering_algorithms

此外,虽然不是 MySQL,但微软网站上也有一些东西:

http://msdn.microsoft.com/en-us/library/ms174879.aspx


编辑,根据您的评论:

在您的特定情况下,类似于创建闭包表的方法可能会起作用。

使用临时表...

从任意节点开始。将其分配给新集群。

下一个节点。是否存在从当前识别的集群到节点的链接?

  • 如果否,则将其分配给新集群。

  • 如果是,请将其分配给该集群。然后,对于每个链接,验证已处理的节点是否在同一个集群中。如果没有,请将它们重新分配给该集群。

【讨论】:

  • 查看我在上面回复 akapa 的评论
【解决方案2】:

遍历网络并标记访问过的节点(类似于垃圾收集算法)。它相当高效,但需要相当多的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-20
    • 2020-04-29
    • 2016-09-24
    • 2018-10-24
    相关资源
    最近更新 更多