louvain社团检测算法(python)

这里写目录标题

  • louvain社团检测算法(python)
    • 壹、完整代码
    • 贰、分步解释
      • 1.为网络中的每个节点分配一个社团;
      • 2. 算法初始化
      • 3. 第一阶段循环
      • 4. 第一阶段文字图片双解释
      • 5.第二个阶段
      • 6.获得社团
      • 7.两个阶段进行循环
      • 8. 主函数进行调用运行
      • 9整体代码

壹、完整代码

参考连接:
https://blog.csdn.net/qq_34356768/article/details/104888579

贰、分步解释

Louvain

分为循环迭代的两个阶段。

假设有V个节点的加权网络(可存在自环)

# coding=utf-8
import collections
import random# 加载(顶点1,顶点2,权重)得图表示
def load_graph(path):                 #参数path:文件路径字符串G = collections.defaultdict(dict) # 设置空白默认字典with open(path) as text:for line in text:vertices = line.strip().split()  # .strip()删除字符串line开头结尾处得空格 # .split()按照空格分隔# 返回一个列表,含有3个字符串元素v_i = int(vertices[0])v_j = int(vertices[1])w = float(vertices[2])G[v_i][v_j] = wG[v_j][v_i] = wreturn G

1.为网络中的每个节点分配一个社团;

每个节点具有属性:vid:节点编号;cid:社团编号;k_in:节点自环个数

class Vertex():def __init__(self, vid, cid, nodes, k_in=0):self._vid = vidself._cid = cidself._nodes = nodes   # self._kin = k_in      # 结点内部的边的权重

2. 算法初始化

算法中的graph:_G_

算法中的总边数:_m_

有两个字典:

  • _cid_vertices:用于存放社区编号,字典类型
    _cid_vertices[vid]:编号为vid的社区
  • _vid_vertex:用于存放顶点编号,字典类型,每个顶点进行class Vertex实例化,赋予每个顶点各项初始属性
    _vid_vertex[vid]:编号为vid的顶点,字典类型
class Louvain():def __init__(self, G): # 算法初始化self._G = G  # G是一个嵌套字典self._m = 0  # 边数量# 下面两个空字典存放信息self._cid_vertices = {}  # 需维护的关于社区的信息(社区编号,其中包含的结点编号的集合)self._vid_vertex = {}    # 需维护的关于结点的信息(结点编号,相应的Vertex实例)for vid in self._G.keys(): # self._G.keyds()字典得键值列表# 含vid得社区名为vid,社区用列表表示,必含有Vidself._cid_vertices[vid] = set([vid]) # 对于顶点vid进行‘类初始化 class Vertex'self._vid_vertex[vid] = Vertex(vid, vid, set([vid]))# 求graph得边数量:对每个vid得邻居 neighbor ,如果neirbor>vid,则加1,避免(i,j)和(j,i)重复self._m += sum([1 for neighbor in self._G[vid].keys() if neighbor > vid])

3. 第一阶段循环

 # 属于 class Louvain():def first_stage(self):mod_inc = False  # 用于判断算法是否可终止visit_sequence = self._G.keys()  # 需要拜访得节点列表(所有节点)random.shuffle(list(visit_sequence)) # 转化为列表后并打算列表得排列顺序while True:can_stop = True  # 第一阶段是否可终止for v_vid in visit_sequence:# 随机选择第一个节点v_vid(随机体现在shuffle),# 其’属性_vid_vertex'是对节点实例化后,令‘属性_cid'(即节点所在得社区编号)赋值v_cid = self._vid_vertex[v_vid]._cid# 假设G={1102:{1221:2,1321:3},1221:{1102:2,1456:4}}# G[1102].values()=[2,3] ,sum求和后表示含节点1102得边数目  # kin初始化为0# k_v表示节点v_vid的所有边权重之和k_v = sum(self._G[v_vid].values()) + self._vid_vertex[v_vid]._kincid_Q = {}# G[1102].keys()=[1221,1321],即节点1102得邻居for w_vid in self._G[v_vid].keys():w_cid = self._vid_vertex[w_vid]._cid  # 邻居所在得社区编号if w_cid in cid_Q:continue    # 若邻居w_ci的社区在 字典cid_Q中则不操作else:   '''_cid_vertices[w_cid]:表示编号为w_cid的社区,k是社区w_cid的节点G[k].values():是权重值sum(self._G[k].values()) :节点k的所有出边的边总数_vid_vertex[k]._kin: 表示对节点k的‘属性k_in’(自环边)sum([k的所有边(出边+自环边)]):社区w_cid的内部边+连接边 '''tot = sum([sum(self._G[k].values()) + self._vid_vertex[k]._kin \for k in self._cid_vertices[w_cid]])'''v_vid节点的邻居w_vid的v_vid的社区编号v_cid;w_vid的社区编号为w_cid如果v_vid与其邻居w_vid的社区编号相同,则移除v_vid后计算社团的边权重之和'''if w_cid == v_cid:tot -= k_v'''_cid_vertices[w_cid]:表示社区编号为w_cid的社区,k是社区内的节点G[v_vid].items():G[1102].items()=dict_items([(1221, 2), (1321, 3)])k_v_in:当遍历节点v_vid的邻居时判断k如果是w_cid社区内的节点,则求权重之和'''                                             k_v_in = sum([v for k, v in self._G[v_vid].items() if k in self._cid_vertices[w_cid]])delta_Q = k_v_in - k_v * tot / self._m  # 由于只需要知道delta_Q的正负,所以少乘了1/(2*self._m)cid_Q[w_cid] = delta_Qcid, max_delta_Q = sorted(cid_Q.items(), key=lambda item: item[1], reverse=True)[0]'''参量 key:表示排序的关键字参量 reverse=True:表示逆序,从大到小排列lambda item :item[1]: item 是一个sorted的变量(即为字典的items迭代量),形式为(key,value)的二元组item[1],即表示上述二元组的value整体含义为:按照字典中的value,从大到小排序'''if max_delta_Q > 0.0 and cid != v_cid:self._vid_vertex[v_vid]._cid = cidself._cid_vertices[cid].add(v_vid)self._cid_vertices[v_cid].remove(v_vid)can_stop = Falsemod_inc = Trueif can_stop:breakreturn mod_inc            

4. 第一阶段文字图片双解释

随机选择random.shuffle(list(visit_sequence))

while True
1.can_stop:用于判断第一阶段是否终止
2.for v_vid in 考虑G中所有的节点:
​ 2.1 选择一个顶点v_vid,得到其属性:1️⃣社团编号v_cid;2️⃣连接到v_vid的边的权重之和k_v
​ 2.2 cid_Q={} 空字典,用于存储 模块度增量
​ 2.3 for w_vid in 考虑顶点v_vid的所有邻居节点:
​ 2.3.1 can_stop=True
​ 2.3.2 (也就是计算将节点v_vid移动到其邻居所在的社区后,计算模块度增量)
​ 2.3.4 选择邻居w_vid,得到其属性:
​ 2.3.4.1 1️⃣社团编号w_cid
​ 2.3.4.2 2️⃣判断社团编号w_cid是否是cid_Q的键;
​ 2.3.4.2.1 ✔️continue
​ 2.3.4.2.2 ✖️将原节点v_vid移除所属社团,加入其邻居所属的社团,评估模块度收益
​ 2.3.4.2.2.1

【积】louvain社团检测算法(python)代码图片双解(一)相关推荐

  1. 除了基于模块度之外的其它社团检测算法

    一.模块度的局限性 (1)判断网络是否具有较强的社团结构一种方法是把一个给定网络与该网络相应的随机化模型做对比.通常做法是通过随机重连方式生成许多具有相同度序列的随机化网络,并计算这些网络的模块度的均 ...

  2. 多元线性回归算法python实现_手写算法-Python代码推广多元线性回归

    1.梯度下降-矩阵形式 上篇文章介绍了一元线性回归,包括Python实现和sklearn实现的实例.对比,以及一些问题点,详情可以看这里: 链接: 手写算法-Python代码实现一元线性回归 里面封装 ...

  3. 手写算法-python代码实现Ridge(L2正则项)回归

    手写算法-python代码实现Ridge回归 Ridge简介 Ridge回归分析与python代码实现 方法一:梯度下降法求解Ridge回归参数 方法二:标准方程法实现Ridge回归 调用sklear ...

  4. 匈牙利算法python代码实现以及原理图解

    匈牙利算法python代码实现以及原理图解 1.匈牙利算法python代码实现: 2.原理图解: 1.匈牙利算法python代码实现: scipy中有对应的接口scipy.optimize.linea ...

  5. 进化算法——蛙跳算法Python代码

    进蛙跳算法Python代码 蛙跳算法原理 Python代码 参考文献 蛙跳算法原理 假设种群个数为 c h r o m n u m chromnum chromnum , 分组个数为 g r o u ...

  6. yolov5实时检测屏幕python代码

    下面是一份使用 YOLOv5 进行实时屏幕检测的 Python 代码示例: ``` import cv2 import numpy as np import torch from models imp ...

  7. Modularity的计算方法——社团检测中模块度计算公式详解

    Modularity,中文称为模块度,是 Community Detection(社区发现/社团检测) 中用来衡量社区划分质量的一种方法.要理解Modularity,我们先来看社团和社团检测的概念. ...

  8. Modularity的计算方法——社团检测中模块度计算公式详解(转)

    文章转自http://www.yalewoo.com/modularity_community_detection.html Modularity,中文称为模块度,是 Community Detect ...

  9. python实现tomasulo算法_手写算法-python代码实现KNN

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 原理解析 KNN-全称K-Nearest Neighbor,最近邻算法,可以做分类任务,也可以做回归 ...

最新文章

  1. Ceylon语言加入Eclipse基金会
  2. 人脸识别技术在法国:质疑声中的先行者
  3. 分布式服务框架 Zookeeper(二)官方介绍
  4. canvas基础-绘制矩形(1)
  5. 最早的电子计算机艾尔妮,这些看似没用的NPC 却是我们最早的回忆
  6. UE4 iOS设备的兼容性
  7. Abp vnext Web应用程序开发教程 10 —— 书与作者的关系
  8. 加载elementor时出现问题_element ui 按需引入出现问题
  9. @NOIP2018 - D1T1@ 铺设道路
  10. QAliber - 介绍一款开源的GUI自动化测试工具
  11. 2021-08-27 向量究竟是什么?线性代数的本质,第1章
  12. PHP面试100题汇总
  13. ASP.NET 页面双向静态化
  14. 现代操作系统 第一章 引论
  15. 求两个数的最小公倍数
  16. 地坤诀中所记录的第二元婴的炼制办法与其余的炼制方式不一样
  17. gamemaker 更新 runtime 快一点
  18. Xmake v2.7.1 发布,更好的 C++ Modules 支持
  19. 最新Axure RP 9.0.0.3675 授权码 license
  20. Java + lua = 王炸!!

热门文章

  1. 在Wireshark中过滤UDS和OBD诊断ISO13400(DoIP)数据
  2. python培训学费多少钱-天津河东区儿童学编程哪里好_学费多少钱,学什么软件...
  3. 自制适合IPAD阅读的PDF文件
  4. 一些oracle的论坛和网站
  5. 架设win2003r2下配置好iis6+php+mysql_Windows2003搭建IIS+PHP+MYSQL环境全过程(一)
  6. Java集成DataX开发
  7. 谷歌开启隐身模式_Google宣布地图隐身模式和更多隐私控制
  8. 影视网站之发送阿里云推送邮件教程
  9. 毫米波雷达攻“芯”为上,行业巨头挑战传统供应链合作模式
  10. ERROR in ch.qos.logback.core.joran.action.AppenderRefAction - See http://logback.qos.ch/codes.html#a