2

我有大约 10K 到 100K 个节点的网络,这些节点都已连接。这些节点通常被分组为社区集群,这些社区与它们之间的许多边缘紧密相连,并且存在集线器等。在社区之间,有一些边缘将社区桥接/连接在一起的节点。这些数据集在邻接矩阵中

我已经尝试过光谱聚类(Ding et al 2001),但它在大型数据集上真的很慢,并且当存在很多歧义时似乎停止工作(桥梁不是通往另一个集群的唯一桥梁路线 - 其他社区可以充当替代代理路由)。

我尝试了一些来自martelot的方法,例如用于模块化优化的 Newman 算法,但没有将稳定性优化功能纳入这项工作(这可能很关键吗?)。在由随机图(ER 图)创建集群的合成数据集上,这些方法有效,但在存在嵌套层次结构的真实数据集上,结果分散。使用独立的可视化应用程序/工具,桥梁是显而易见的。

您会推荐/建议尝试哪些方法?我正在使用 MATLAB。

4

1 回答 1

6

你到底想做什么?检测社区,或它们之间的桥梁?这是两个不同的问题。一旦你有了社区,就很容易识别连接来自两个不同社区的节点的边。所以,我猜你想检测社区。

为此目的实际上有数千种方法,其中一些在 Matlab 中实现,例如您引用的那个,或广义的 Louvain 算法(也基于模块化优化)。但是,它们中的大多数都可以作为 C 或 C++ 程序使用,例如InfoMap(基于数据压缩范式)、WalkTrap(使用基于随机游走的距离进行聚类)、Markov Cluster(模拟一些传播机制)和列表继续...

这些工具或多或少不同地形式化了社区结构的概念,当应用于同一网络时,可能会导致不同的(估计的)社区结构。当然,不同的社区也意味着不同的桥梁。所以问题是要知道如何为您的数据选择合适的方法。你似乎有先验关于您正在学习的网络的知识,因此您应该使用它来做出选择(而不是编程语言)。例如,即使您没有明确说明,您似乎也在寻找一种分层的社区结构:并非所有工具都能够检测到这种结构。同样,如果您认为一个节点可以同时属于多个社区,那么您应该考虑寻找重叠的社区,例如使用CFinder(基于 clique 渗透)。

我建议你看看这篇关于社区检测的优秀评论,你可能会发现一些有趣的信息让你可以选择一种方法:Graphs 中的社区检测。此外,从编程的角度来看,我建议您使用igraph 库(可用于 C、R 和 Python):它包含几个标准的社区检测工具。你可以在你的数据上试用它们,看看你会得到什么。

于 2013-05-20T16:11:07.833 回答