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

285 篇文章 71 订阅
38 篇文章 3 订阅
  •  用于进行graph点的聚类(community detection)
  • 一个community内的点紧密地互相连接,community之间的点连接得很稀疏

1 主要算法

1.1 初始化

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

1.2 逐点更新

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

  • 当得到候选集\wp'_v后,点v更新后的community如下:
    • 如果点v原先的community也在 候选集\wp'_v 中,那么点v不改变community
    • 否则从几个 候选集\wp'_v 中随机选择一个( 候选集\wp'_v 中的几个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()

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

《计算流体力学:原理与应用(第二版)》是Blazek J.(作者)编写的一本关于计算流体力学的书籍。它是该领域中一本权威的教材,被广泛用于工程、物理学和气象学等领域的教学和研究。 这本书详细介绍了计算流体力学的基本原理和方法。计算流体力学是一种利用数值方法来模拟流体流动的科学与工程领域。它结合了流体力学的基本方程和计算机算法,可以用来解决各种流体流动问题,如水力学、空气动力学、热传导等。 该书的第二版相对于第一版进行了更新和扩充。它涵盖了更多的应用案例和实例,以及最新的计算流体力学发展和技术。除了介绍基本的数值方法和离散化技术,书中还详细讨论了网格生成、边界条件、初始条件等问题。 此外,书中还介绍了计算流体力学在不同领域的具体应用。它涵盖了航空航天、汽车工程、能源系统、气象学、生物医学等多个领域的应用案例。通过这些案例,读者可以更好地理解和应用计算流体力学在不同实际问题中的作用和意义。 总的来说,Blazek J.的《计算流体力学:原理与应用(第二版)》是一本对计算流体力学进行全面而深入介绍的教材。它不仅适用于从事相关研究和工作的科学家和工程师,也适合作为大学本科和研究生水平的课程教材。通过学习这本书,读者能够掌握计算流体力学的基本理论和方法,并能够应用到实际问题中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UQI-LIUWJ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值