我有一个描述几组连接节点的表:
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}
(时间几乎无关紧要 - 只是在那里证明节点+ origin_node不一定是唯一/有序的。)
但是我在制定一个识别几千行集群的算法时有点困难。
我正在使用MySQL 5.0.22 - 所以没有'CONNECT BY',并且可以访问PHP和awk - 尽管我更容易理解算法而不是编码解决方案。只要花费不到几个小时的时间来分析数据,我就会依赖简单而不是订单。
顺便说一句:这是一个现实世界的问题 - 不是家庭作业(我很久以前就不再是学生了 - 也许为时过早;)TIA
答案 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
根据您的评论进行修改:
在您的特定情况下,类似于创建闭包表的东西可能会起作用。
使用临时表......
从任意节点开始。将其分配给新群集。
下一个节点。是否有指向当前已识别群集的节点的链接?
如果不是,请将其分配给新群集。
如果是,请将其分配给该群集。然后,对于每个链接,验证已处理的节点是否在同一个集群中。如果没有,请将它们重新分配给该群集。
答案 1 :(得分:0)
走路网络并标记受访节点(类似于垃圾收集算法)。它的效率相当高,但需要相当多的代码。