2011-05-22 37 views
1

我有一个表描述了多个连接的节点:如何识别节点的集群网络中

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 - 虽然它会是我更容易理解的算法,而不是编码的解决方案。只要花费不到几个小时的时间来分析数据,我就会倾向于简化订单。

BTW:它是一个现实世界的问题 - 没有家庭作业(我不再是一个学生在很久以前 - 也许还为时过早;)

TIA

+0

在搜索算法之前,您应该正确地确定要解决的问题,即捕获您的群集想法的“公式”是什么?它们是否与http://en.wikipedia.org/wiki/K-means_clustering使用的类似? – akappa 2011-05-22 11:55:30

+0

我不认为有一种方法可以在MySQL中使用单个SQL语句来执行此操作。我会更程序化地将它作为存储过程或PHP。如果只有几千行,无论你如何处理,性能都不应该成为问题。也许一个HashTable按节点键入一个集群的值。那么你只需要将集群合并在一起即可。 – 2011-05-22 12:00:51

+0

@akappa:也许我对术语聚类的使用是不恰当的,因为尽管有趣的是,维基百科上的聚类算法的讨论基于测量基本指标的相对距离 - 而我的数据主要是名义上的,并且存在为一组重叠的树(即最终的复合图可能包含闭环) – symcbean 2011-05-22 14:57:21

回答

0

与步行网络和标记访问节点(类似于垃圾收集算法)。它的效率相当高,但需要相当多的代码。

0

这将会是我更容易了解一个算法,而不是编码的解决方案

尝试这些链接?

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


编辑,每次您的评论:

在你的 特殊情况下,类似于创建闭合表的东西可能会起作用。

使用临时表...

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

下一个节点。是否存在指向当前标识的集群的节点的链接?

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

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

+0

请参阅我的评论以回复上面的akapa – symcbean 2011-05-22 14:58:17