我有大约 10K 到 100K 个节点的网络,这些节点都已连接。这些节点通常被分组为社区集群,这些社区集群之间通过许多边紧密相连,并且存在集线器等。在社区之间存在具有一些边的节点bridging / 连接社区在一起。这些数据集位于邻接矩阵中
我尝试过谱聚类(丁等 2001 http://www.cc.gatech.edu/~mihail/D.8802readings/kdd3a.pdf)但它在大型数据集上确实很慢,并且当存在很多模糊性时似乎会停止工作(桥接器不是通往另一个集群的唯一桥接路线 - 其他社区可以充当替代代理路线)。
我尝试过一些方法martelot http://www.elemartelot.org/index.php/programming/cd-code例如用于模块化优化的纽曼算法,但没有在该工作中纳入稳定性优化函数(这可能是至关重要的吗?)。在由随机图(ER 图)创建簇的合成数据集上,这些方法有效,但在存在嵌套层次结构的真实数据集上,结果是分散的。不过,使用独立的可视化应用程序/工具,桥梁是显而易见的。
您会推荐/建议尝试哪些方法?我正在使用 MATLAB。
你到底想做什么?检测社区或它们之间的桥梁?这是两个不同的问题。一旦有了社区,识别连接两个不同社区的节点的边就足够简单了。所以,我猜你想检测社区。
实际上有数千种方法用于此目的,其中一些是在 Matlab 中实现的,例如您引用的方法,或者广义Louvain算法 http://netwiki.amath.unc.edu/GenLouvain/GenLouvain(也是基于模块化优化)。然而,它们中的大多数都可以作为 C 或 C++ 程序使用,例如InfoMap http://www.tp.umu.se/~rosvall/code.html(基于数据压缩范例),WalkTrap http://www-rp.lip6.fr/~latapy/PP/walktrap.html(使用基于随机游走的距离进行聚类),马尔可夫簇 http://micans.org/mcl/(模拟一些传播机制),这样的例子不胜枚举……
这些工具或多或少地以不同的方式形式化了社区结构的概念,当应用于同一网络时,可能会导致不同的(估计的)社区结构。当然,不同的社区也意味着不同的桥梁。所以问题是知道如何为您的数据选择合适的方法。你似乎有a priori有关您正在学习的网络的知识,因此您应该使用它来做出选择(而不是编程语言)。例如,即使您没有明确说明,您似乎也在寻找分层社区结构:并非所有工具都能够检测这种结构。同样,如果您认为一个节点可以同时属于多个社区,那么您应该考虑寻找重叠的社区,例如使用CFinder http://www.cfinder.org/(基于派系渗透)。
我建议您看看这篇关于社区检测的精彩评论,您可能会发现一些有趣的信息,让您可以选择一种方法:图中的社区检测 http://arxiv.org/abs/0906.0612。另外,从编程的角度来看,我建议您使用igraph库 http://igraph.sourceforge.net/(适用于 C、R 和 Python):它包含多个标准社区检测工具。您可以在您的数据上尝试它们,看看您会得到什么。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)