【发布时间】: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