效率非常高的FN算法Python实现

  • 基本概念
  • 优化实现
  • 对比实验

前几期推送介绍了一些非重叠社区发现算法(GN算法、FN算法),比较适用于小网络社区检测。FN算法计算效率相较于GN算法有一定提升,且社区划分效果不错。以下是GN、FN算法具体介绍和对比:

社区发现之GN算法Python实现
社区发现之FN算法Python实现

在社区发现之FN算法Python实现中,需要多次计算合并两个社区的增益 Δ Q \Delta{Q} ΔQ,但是 Δ Q \Delta{Q} ΔQ的计算方式的不同也会影响算法最终的一个计算效率,因此本文针对 Δ Q \Delta{Q} ΔQ的计算方式进行了一些优化,相较于社区发现之FN算法Python实现中的计算效率有很大提升。以下是优化前后计算时间在不同网络下的对比(第一列是测试用例及网络规模,第二、三列为Q和计算时间,FN:优化前,Fast-N:优化后)。

Newman, M. E. J. ,2004. Fast algorithm for detecting community structure in networks. phys rev e stat nonlin soft matter phys, 69, 066133.

去看原文

基本概念

在社区中有几个关键概念需要先进行说明,以下是FN社区合并的一个示意图:

FN算法是一种层次聚类算法。起初每个节点都是一个类。每次合并让Q值增加(即 Δ Q \Delta{Q} ΔQ)最大的一对节点,重复这个过程,直到所有节点都在一个社区为止。在这个合并的过程中,选择Q值(社区发现评估指标)最大的作为最终划分结果。

Δ Q = 2 ( e i j − a i a j ) \Delta{Q}=2(e_{ij}-a_ia_j) ΔQ=2(eij​−ai​aj​)
其中, e i j e_{ij} eij​表示连接社区 i i i和社区 j j j的边的比例; a i a_i ai​表示连接到社区 i i i的所有末端节点比例, a i = ∑ j e i j a_i=\sum_j{e_{ij}} ai​=∑j​eij​。

那么上图各个社区的几个关键量如下图(注意,为书写方便,以下的量没有除以网络边的总数),并给出这些量合并两个社区的动态更新公式:

同时, e i i e_{ii} eii​这个量可以用来计算模块度Q。因此,我们需要将上述三个量在算法计算过程中进行保存,并在合并社区后进行动态更新,就无需采用遍历的方式重新计算这些量。

优化实现

在这里,为了方便设计数据结构来存储中间变量,我们不使用Python任何第三方库进行实现。

# -*- coding: utf-8 -*-
# @Author: 武辛
# @Email: geo_data_analysis@163.com
# @Note: 如有疑问,可加微信"wxid-3ccc"
# @All Rights Reserved!
​
import sys, copy, time
​
def FN():print("load the network...")network = loadNetwork("network/test.txt")
​max_Q = float("-inf"); partition = Nonestart_time = time.time()while len(network.Communities) > 0:print("left %d communities need to merge, waiting..." % len(network.Communities))det_Q = float("-inf")max_link = Nonefor link in network.Links.values():community_i = link[0]community_j = link[1]
​if community_i == community_j: continue
​# 计算两个community的det_Qcur_Q = cal_det_Q(network, community_i, community_j)
​# 找到合并两个community Q值增加最大的进行合并if cur_Q > det_Q:det_Q = cur_Qmax_link = linkif max_link is None: break
​# 合并两个community,将社区j合并到社区i中community_i = max_link[0]community_j = max_link[1]merge(network, community_i, community_j)
​# 合并社区j后,更新社区i的e_ii,a_i,e_ij信息update_community_info(network, community_i, community_j)
​# 删除边ijdel network.Links[max_link]
​# 计算合并社区ij后的模块度cur_Q = cal_Q(network)if cur_Q > max_Q:max_Q = cur_Qpartition = copy.deepcopy(list(network.Communities.values()))
​t2 = time.time()print("Find %d communities after %.3f seconds, the maximal Q is %.3f" % (len(partition), t2 - start_time, max_Q))
​
if __name__ == '__main__':FN()
load the network...
left 22 communities need to merge, waiting...
left 21 communities need to merge, waiting...
left 20 communities need to merge, waiting...
left 19 communities need to merge, waiting...
left 18 communities need to merge, waiting...
left 17 communities need to merge, waiting...
left 16 communities need to merge, waiting...
left 15 communities need to merge, waiting...
left 14 communities need to merge, waiting...
left 13 communities need to merge, waiting...
left 12 communities need to merge, waiting...
left 11 communities need to merge, waiting...
left 10 communities need to merge, waiting...
left 9 communities need to merge, waiting...
left 8 communities need to merge, waiting...
left 7 communities need to merge, waiting...
left 6 communities need to merge, waiting...
left 5 communities need to merge, waiting...
left 4 communities need to merge, waiting...
left 3 communities need to merge, waiting...
left 2 communities need to merge, waiting...
left 1 communities need to merge, waiting...
Find 3 communities after 0.006 seconds, the maximal Q is 0.528

对比实验

为了验证该算法的效率,我们采用了几个网络(自定义测试网络、dolphins、football、collaboration)来进行对比实验,以下是这几个网络的详细信息:


collaboration网络(9875个节点,25973条边)用优化后的FN算法(见)需要989.2秒出结果,先前的实现方式需要12小时以上(时间太长,没有跑完)。可以看出,通过动态更新的方式可以很大程度上提升FN的计算效率。

去看原文

去看原文

去看原文

更多内容,请关注地学分析与算法。

效率非常高的FN算法Python实现相关推荐

  1. 社区发现算法python视频_社区发现FN算法Python实现

    社区发现FN算法Python实现 算法原理 评价指标 结果对比 源码 ​2004年,Newman在GN(Girvan and Newman, 2002)算法的基础上,提出了另外一种快速检测社区的算法, ...

  2. 社区发现FN算法Python实现

    社区发现FN算法Python实现 算法原理 评价指标 结果对比 源码 一种高效实现 ​2004年,Newman在GN(Girvan and Newman, 2002)算法的基础上,提出了另外一种快速检 ...

  3. 2021-03-15 数据挖掘算法—K-Means算法 Python版本

    数据挖掘算法-K-Means算法 Python版本 简介 又叫K-均值算法,是非监督学习中的聚类算法. 基本思想 k-means算法比较简单.在k-means算法中,用cluster来表示簇:容易证明 ...

  4. python数据结构算法 北京大学_北京大学公开课《数据结构与算法Python版》

    之前我分享过一个数据结构与算法的课程,很多小伙伴私信我问有没有Python版. 看了一些公开课后,今天特向大家推荐北京大学的这门课程:<数据结构与算法Python版>. 课程概述 很多同学 ...

  5. 决策算法python_GitHub - nxety/MachineLearning_Python: 机器学习算法python实现

    机器学习算法Python实现 目录 1.代价函数 其中: 下面就是要求出theta,使代价最小,即代表我们拟合出来的方程距离真实值最近 共有m条数据,其中代表我们要拟合出来的方程到真实值距离的平方,平 ...

  6. Apriori算法+python实现

    文章目录 一.相关概念 二.Apriori算法 三.Apriori算法示例: 四.代码实现: 参考链接:apriori算法 python实现 一.相关概念 支持度:support(A =>B) ...

  7. 正一派道家奇门遁甲排盘算法python程序

    正一派道家奇门遁甲排盘算法python程序程序 首先声明,这篇文章可能很快就会消失了,毕竟已经2020年了,还有很多人觉得奇门遁甲是"剪纸成人,撒豆成兵"的法术.其实奇门遁甲是一种 ...

  8. mooc数据结构与算法python版第十一周作业_中国大学 MOOC_数据结构与算法Python版_2020最新答案学习指南...

    中国大学 MOOC_数据结构与算法Python版_2020最新答案学习指南 更多相关问题 [判断题]实际集成运放的上限截止频率为无穷大 [多选题]现代城市的发展凸现出与以往不同的动力机制包括 教师在引 ...

  9. 算法(Python版)|156Kstars|神级项目-(1)The Algorithms - Python简介

    文章目录 算法(Python版) 项目地址 项目概况 说明 参与入门 社区频道 算法列表 Arithmetic Analysis 算术分析 Audio Filters 音频过滤器 Backtracki ...

最新文章

  1. CentOS7,使用tar命令解压缩文件
  2. RH033 Unit 9 vim: An Advanced Text Editor
  3. javascript es6 属性 __proto__ prototype 原型链 简介
  4. 区块链BaaS云服务(39)时戳信息Bystack
  5. 【SD】交货单如何在保存时更改LIKP表的值?
  6. unity的vr场景怎么做_营销技巧逐渐失效,如何通过场景化营销重新赢回市场?...
  7. 数论基础-小白学算法必学(一天一夜的成果)万字
  8. python编程常见的错误_Python编程时常见的3个错误
  9. c# 从一组数中随机抽取一定个数_Python随机模块22个函数详解
  10. eclipse导入jar包的三种方法
  11. 快压、360压缩、WinRAR关于打开快压通过超高压缩比压缩后的文件不兼容的问题...
  12. pg数据库创建触发器
  13. 计算机工程师难度排名,【2018一级造价工程师考试各个科目的难度排行榜】- 环球网校...
  14. MeanShift、K-Means与GMM迭代
  15. PS CJ34预算转借
  16. 使用百度AI将语音转换成文字(JAVA)
  17. Elasticsearch 7.10 之 Total shards per node
  18. 从0到1:微信小程序自选股项目回忆录
  19. javascript读取本地文件打印到浏览器中
  20. python初步学习(二) 3.19

热门文章

  1. Revit问题:创建牛腿柱和快速生成圈梁
  2. 用amd组装高档游戏型计算机,开学纳新要理智,DIY一台心仪电脑不求人
  3. 【AtomicLong】常规用法
  4. [精简]托福核心词汇41
  5. 自媒体人必备运营工具
  6. 16s之稀释曲线绘制
  7. 让chatgpt给我做个项目预算,感觉这样的项目预算才有的赚
  8. away3d中创建中文3d字体
  9. 天气越来越冷了,你的录音笔带好了吗
  10. MYSQL——大厂面试问题集合