算法/论文笔记 Fluid Communities: A Competitive, Scalable and Diverse Community Detection Algorithm (2017)

Posted UQI-LIUWJ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法/论文笔记 Fluid Communities: A Competitive, Scalable and Diverse Community Detection Algorithm (2017)相关的知识,希望对你有一定的参考价值。

  •  用于进行graph点的聚类(community detection)
  • 一个community内的点紧密地互相连接,community之间的点连接得很稀疏

1 主要算法

1.1 初始化

  • 给定一张图G=(V,E),其中V是顶点集,E表示边集
  • 初始化的时候,初始化k个community
    • k是一个超参数,
    • 每个community  随机包含了一些点 (每一个community至少包含一个点)
    • 每个community 有一个对应的密度(density),在(0,1]之间

1.2 逐点更新

  • 算法是逐点进行该点属于的community 的更新的。所有点更新一轮称为一个superstep
    • 每一轮superstep,算法以随机的排序进行每个点community的更新迭代
    • 当每个点的community连续两轮superstep皆不更新的时候,算法收敛,停止
  • 其中,每个点的更新法则如下
    • v——需要更新community的点
    • ——点v更新后可能的community的集合(候选集)
    • ——点v的邻居
    • d(c)——community c的密度(density)
    • c(w)——点v的邻居/点v自己属于哪个类
  • 相当于是根据点v邻居属于哪个点,来判断点v选择哪个community之后,sum值最大

  • 当得到候选集后,点v更新后的community如下:
    • 如果点v原先的community也在 候选集 中,那么点v不改变community
    • 否则从几个 候选集 中随机选择一个( 候选集 中的几个community,他们的sum值是一样的)
    • ——>这个算法可以保证没有一个community最终会没有点(也就是至少一个点)

2 性质

2.1 异步算法

FluidC算法是异步算法,一步一个一个点更新。

如果是同步算法的话,每个community的density无法保证值就是公式(1)求得的值

——>有可能出现某个community 最终没有点

2.2 不会有特别大的community(除非真的点之间连边居多)

一个community中点越多,density越小。这会达到一个均衡

  • 比如上图,标蓝的点是这一轮需要更新的点
  • 红色框框内的数值表示,如果这个点被划到红色community,那么这个点在公式(2)下的sum有多少;绿色的同理
  • 可以看到,左边的情况下,最终蓝色点会被划到绿色的community内;而右边的情况里,蓝色点会被分给红色的community

2.3 线性时间复杂度

每一轮superstep,每一条边会被考虑两次(分别是它的两个节点被更新时的情况)

所以时间复杂度是O(E)

3 举例 

 

4 networkx实现

4.1 构建图

import numpy as np
import pandas as pd
import networkx as nx
import matplotlib.pyplot as plt
 

G = nx.Graph()
G.add_edges_from([(1, 5), (1, 2),(1,6),(2,3),(2,6),(3,4),(3,7),(4,7),(5,6),(6,7)])
 
plt.figure(figsize=(7,5))
nx.draw(G, with_labels=True)
plt.show()

4.2 FluidC算法 

par=nx.algorithms.community.asyn_fluidc(G,2)
par_lst=list(par)
par_lst
#[1, 2, 5, 6, 3, 4, 7]

4.3 按照community画图

color_lst=[0]*7
for i in par_lst[0]:
        color_lst[i-1]='green'
for i in par_lst[1]:
        color_lst[i-1]='red'
nx.draw(G, nodelist=[1,2,3,4,5,6,7],node_color=color_lst,with_labels=True)
plt.show()

和第三节推导出来的是一样的 

以上是关于算法/论文笔记 Fluid Communities: A Competitive, Scalable and Diverse Community Detection Algorithm (2017)的主要内容,如果未能解决你的问题,请参考以下文章

Raft论文读书笔记

论文阅读笔记 | 目标检测算法——Libra R-CNN算法

ICLR 2022最佳论文解读

ICLR 2022最佳论文解读

ICLR 2022最佳论文解读

论文笔记基于知识图谱的农业智能问答系统