【问题标题】:What are the differences between community detection algorithms in igraph?igraph 中的社区检测算法有什么区别?
【发布时间】:2012-03-17 07:58:48
【问题描述】:

我有一个大约 100 个 igraph 对象的列表,其中一个典型对象具有大约 700 个顶点和 3500 个边。

我想确定哪些顶点组更有可能发生联系。然后我的计划是使用混合模型来预测使用顶点和组属性有多少组内关系顶点。

有些人可能想回应我项目的其他方面,这很好,但我最感兴趣的是有关 igraph 中用于分组顶点的函数的信息。我遇到过这些community detection algorithms,但我不确定它们的优缺点,或者其他一些功能是否更适合我的情况。我也看到了链接here,但它们并不特定于 igraph。谢谢你的建议。

【问题讨论】:

    标签: r igraph


    【解决方案1】:

    以下是 igraph 中当前实现的社区检测算法的简短摘要:

    • edge.betweenness.community 是一个层次分解过程,其中边缘按边缘介数分数的降序删除(即通过给定边缘的最短路径的数量)。这是因为连接不同组的边更有可能包含在多个最短路径中,这仅仅是因为在许多情况下,它们是从一个组到另一个组的唯一选择。这种方法产生了很好的结果,但由于边缘介数计算的计算复杂性以及每次边缘去除后必须重新计算介数分数,因此速度非常慢。您的具有约 700 个顶点和约 3500 条边的图在可以使用这种方法进行分析的图的大小上限附近。另一个缺点是edge.betweenness.community 构建了一个完整的树状图,并且没有给你任何关于在哪里切割树状图以获得最终组的指导,所以你必须使用其他一些措施来决定(例如,模块化分数树状图每个级别的分区)。

    • fastgreedy.community 是另一种分层方法,但它是自下而上而不是自上而下。它试图以贪婪的方式优化称为模块化的质量函数。最初,每个顶点都属于一个单独的社区,并且社区被迭代合并,使得每次合并都是局部最优的(即产生最大的模块化当前值增加)。当无法再增加模块化时,该算法就会停止,因此它会为您提供分组和树状图。该方法速度很快,并且由于没有要调整的参数,因此通常作为第一个近似值尝试该方法。但是,众所周知,它会受到分辨率限制的影响,即低于给定大小阈值的社区(如果我没记错的话,取决于节点和边的数量)将始终与相邻社区合并。

    • walktrap.community 是一种基于随机游走的方法。一般的想法是,如果你在图上执行随机游走,那么游走更有可能留在同一个社区内,因为只有少数边在给定社区之外。 Walktrap 运行 3-4-5 步的短随机游走(取决于其参数之一),并使用这些随机游走的结果以自下而上的方式合​​并单独的社区,例如 fastgreedy.community。同样,您可以使用模块化分数来选择切割树状图的位置。它比快速贪心方法慢一点,但也更准确一些(根据原始出版物)。

    • spinglass.community 是一种来自统计物理学的方法,基于所谓的 Potts 模型。在这个模型中,每个粒子(即顶点)可以处于 c 种自旋状态之一,粒子之间的相互作用(即图的边缘)指定了哪些顶点对更愿意留在其中相同的自旋状态以及哪些更喜欢具有不同的自旋状态。然后对给定数量的步骤模拟模型,最终粒子的自旋状态定义社区。后果如下: 1) 社区最终永远不会超过c个,虽然你可以将c设置为高达200,这很可能是足以满足您的目的。 2) 最后可能会有少于c 个社区,因为一些自旋状态可能会变空。 3) 不能保证网络中完全远程(或断开)部分的节点具有不同的自旋状态。这更有可能只是断开连接图的问题,所以我不会担心。该方法不是特别快,也不是确定性的(因为模拟本身),但有一个可调节的分辨率参数来确定集群大小。 spinglass 方法的一种变体也可以考虑负面链接(即,其端点更喜欢位于不同社区中的链接)。

    • leading.eigenvector.community 是一种自上而下的分层方法,再次优化了模块化功能。在每个步骤中,图被分成两部分,分离本身会显着增加模块化。拆分是通过评估所谓的模块化矩阵的前导特征向量来确定的,并且还有一个停止条件可以防止紧密连接的组被进一步拆分。由于涉及特征向量计算,它可能不适用于 ARPACK 特征向量求解器不稳定的退化图。在非退化图上,它可能比快速贪心方法产生更高的模块化分数,尽管它有点慢。

    • label.propagation.community 是一种简单的方法,其中每个节点都分配有一个 k 标签。然后该方法迭代地继续并以每个节点以同步方式获取其邻居的最频繁标签的方式将标签重新分配给节点。当每个节点的标签是其邻域中最频繁的标签之一时,该方法停止。它非常快,但会根据初始配置(随机决定)产生不同的结果,因此应该多次运行该方法(例如,一张图 1000 次),然后建立一个共识标签,这可能是乏味。

    igraph 0.6 还将包括基于信息论原理的最先进的 Infomap 社区检测算法;它尝试构建一个分组,为图上的随机游走提供最短的描述长度,其中描述长度由编码随机游走路径所需的每个顶点的预期比特数来衡量。

    无论如何,我可能会使用fastgreedy.communitywalktrap.community 作为第一个近似值,然后当事实证明这两种方法由于某种原因不适合特定问题时评估其他方法。

    【讨论】:

    • 据我所知,这对于非确定性算法来说是很常见的事情。但是,您应该小心,因为在一次算法运行中的社区 i 不一定与另一次运行中的社区 i 匹配,因为社区 ID 没有语义含义。
    • 有一个新的:multilevel.community。介意将其添加到您的列表中吗? (顺便说一句,现有答案非常好。谢谢!)
    • @Tamás 你能解释一下multilevel.communityfastgreedy.community 算法之间的区别吗?似乎这两者非常相似。提前非常感谢。
    • 他们不一样; fastgreedy.community 迭代地合并社区对,总是选择能够最大程度提高整体模块性的对。在multilevel.community,社区不合并;取而代之的是,节点在社区之间移动,以便每个节点做出 local 决策,以最大化其 自己的 对模块化分数的贡献。当这个过程卡住时(即没有一个节点改变他们的成员),那么所有的社区都被折叠成单个节点并且这个过程继续(这就是它是多级的)。
    • @Antoine:InfoMap 算法在处理有向边方面具有良好且科学合理的方法。 igraph 中的实现不是最有效的(由于许可问题),但它应该适用于较小的图。如果实在是太慢了,可以试试mapequation.org的算法作者的代码
    【解决方案2】:

    可以在此处找到不同社区检测算法的摘要:http://www.r-bloggers.com/summary-of-community-detection-algorithms-in-igraph-0-6/

    值得注意的是,InfoMAP 算法是最近出现的可能有用的算法(它也支持有向图)。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    • 2020-01-21
    • 2017-03-07
    相关资源
    最近更新 更多