COPRA算法

LPA 算法简单直观 ,易于理解。而且求解准确性很高(指的是运气好的时候,毕竟随机性太大了hh)无需指定社区个数等其他任何参数.最主要是算法时间复杂度很低.接近线性但是 LPA 算法存在两个问题 :

  • 第一,其稳定性较差,原因是社区间标签易传播 ,当一个节点存在多个可选标签时.随机地选择其中一个 . 对于不同的随机选择会产生不同的社区发现结果
  • 第二 ,在现实生活中,很多节点可能同时属于多个标签 .而 LPA 算法是无法挖掘出重叠社区结构的.

对此,基于LPA算法,引入了新的标签结构(c,b),其中,c表示社区标识符(它可能属于哪个社区),b表示节点x在社区c中的从属系数(它属于该社区的可能性),且0≤b≤1。顶点x的所有从属系数之和等于1,通过btb_tbt​(c,b)表示迭代次数t时的顶点x对于社区c的从属系数,N(x)表示顶点x的邻接顶点集。具体计算公式为:

bt(c,x)=∑y∈N(x)bt−1(c,y)∣N(x)∣b_t(c,x) = {{\displaystyle \sum_{y\in N(x)}b_{t-1}(c,y)}\over{|N(x)|}}bt​(c,x)=∣N(x)∣y∈N(x)∑​bt−1​(c,y)​

每次传播过程都是将邻居节点的归属系数取并集进行归一化。

其中,N(x)是节点x的所有邻居节点。t是迭代次数。该公式的意义是计算x节点所有邻居节点属于c社区的隶属度之和与邻居节点数的比值。

迭代t中一个顶点的标签总是基于迭代t−1中它相邻的标签。

因为我们需要一个节点保存多个社区标识符信息,而不是所有的社区标识符信息。所以我们会删除那些低于阈值1/v的社区信息,v是超参数,表示一个节点最多可以属于几个社区。

从标签向量中删除社区对之后,将剩余的隶属度进行归一化(分别乘(除)以一个常数,使其之和为1)。

假设v为2,故阈值为1/v=0.5,低于此阈值的标签信息都会被删除,如果一个节点中所有的标签都低于此阈值就随机选择一个。删除标签后的网络信息为:
比如上图节点b三个从属系数都为1/3,都小于阈值1/2,所以都删除,并且随机选择一个,这里假如选择了c,然后归一化,从属系数为1,b的标签变为(c,1)。
对于节点c,从属系数都为1/2大于阈值,都合格,按公式计算{(c,1)+(c,1)}/2 所以结果为{(c,1}.
其它节点也类似,然后网络信息就变成了下图。

对于v<2时,COPRA算法就变成了LPA算法。

与LPA算法一样,COPRA可能具有高度的不确定性,一个顶点的社区通常是由随机选择决定的。然而,在真实的网络中,COPRA通常比其他测试算法产生更好的结果(就模块化而言)。

算法流程如下:

评价指标:扩展Q函数

Dolphin 数据集是 D.Lusseau 等人使用长达 7 年的时间观察新西兰 Doubtful Sound海峡 62 只海豚群体的交流情况而得到的海豚社会关系网络。这个网络具有 62 个节点,159 条边。节点表示海豚,而边表示海豚间的频繁接触

代码与数据下载github

Python代码如下:

class COPRA:def __init__(self, G, T, v):""":param G:图本身:param T: 迭代次数T:param r:满足社区次数要求的阈值r"""self._G = Gself._n = len(G.nodes(False))  # 节点数目self._T = Tself._v = vdef execute(self):# 建立成员标签记录# 节点将被分配隶属度大于阈值的社区标签lablelist = {i: {i: 1} for i in self._G.nodes()}for t in range(self._T):visitlist = list(self._G.nodes())# 随机排列遍历顺序np.random.shuffle(visitlist)# 开始遍历节点for visit in visitlist:temp_count = 0temp_label = {}total = len(self._G[visit])# 根据邻居利用公式计算标签for i in self._G.neighbors(visit):res = {key: value / total for key, value in lablelist[i].items()}temp_label = dict(Counter(res) + Counter(temp_label))temp_count = len(temp_label)temp_label2 = temp_label.copy()for key, value in list(temp_label.items()):if value < 1 / self._v:del temp_label[key]temp_count -= 1# 如果一个节点中所有的标签都低于阈值就随机选择一个if temp_count == 0:b = random.sample(temp_label2.keys(), 1)temp_label = {b[0]: 1}# 否则标签个数一定小于等于v个 进行归一化即可else:tsum = sum(temp_label.values())temp_label = {key: value / tsum for key, value in temp_label.items()}lablelist[visit] = temp_labelcommunities = collections.defaultdict(lambda: list())# 扫描lablelist中的记录标签,相同标签的节点加入同一个社区中for primary, change in lablelist.items():for label in change.keys():communities[label].append(primary)# 返回值是个数据字典,value以集合的形式存在return communities.values()```参考结果:
>D:\anaconda3\python.exe D:/APTX-4869/CommunityDetection/CORPA.py
0 [0, 40, 10, 14, 47, 15, 42, 36, 28, 2, 44, 61, 3, 8, 59, 4, 51, 30, 37, 45, 20, 29, 11, 12, 33, 34, 38, 43, 16, 50, 52, 24, 18, 55, 21, 23, 35, 49, 39, 58, 46, 53]
1 [1, 41, 17, 19, 54, 26, 27, 5, 56, 9, 13, 57, 6, 7, 30, 32, 22, 25, 31, 60, 39, 48]
2 [4, 51, 11, 24, 55, 21, 23, 35]
0.3655
算法执行时间0.028006553649902344

社区发现算法——COPRA算法相关推荐

  1. 社区发现算法 python_社区发现(Community Detection)算法(转)

    作者: peghoty 社区发现(Community Detection)算法用来发现网络中的社区结构,也可以看做是一种聚类算法. 以下是我的一个 PPT 报告,分享给大家. 从上述定义可以看出:社区 ...

  2. 附源码|复杂网络社区发现——标签传播算法(LPA)

    本文通过Python 3.7实现了标签传播算法的两个代码(1.自己写的,2.调包实现),并通过空手道俱乐部的例子进行可视化显示. 标签传播是一种半监督机器学习算法,它将标签分配给以前未标记的数据点.在 ...

  3. 社区发现系列03-Louvain算法分辨率

    1.分辨率局限 louvain算法存在的问题:分辨率局限.就是说当通过优化模块度来发现社区结构时,网络在存在一个固有的分辨率局限,导致一些规模较小但是结构显著的社区淹没在大的社区中,无法被识别到. 造 ...

  4. 标签传播算法_复杂网络社区发现算法汇总

    社区发现 这篇文章汇总了一些常见的社区发现概念和算法,包括 Modularity Q Fast Unfolding(Louvain Algorithm) LPA SLPA KL算法 GN算法 社区: ...

  5. 社区发现算法-Community Detection-NormalizeCut/Louvain/NMF/LPA

    本文结构安排 图聚类简介 正则化割 Louvain 非负矩阵分解(NMF) 其他常见方法 图(graph):是一种由点和边集构成的结构 G = ( V , E ) G=(V,E) G=(V,E) 图聚 ...

  6. 社区发现算法 - Fast Unfolding(Louvian)算法初探

    1. 社团划分 0x1:社区是什么 在社交网络中,用户相当于每一个点,用户之间通过互相的关注关系构成了整个网络的结构,在这样的网络中,有的用户之间的连接较为紧密,有的用户之间的连接关系较为稀疏,在这样 ...

  7. 文献记录(part66)--一种基于交叉熵的社区发现算法

    学习笔记,仅供参考,有错必纠 关键词:复杂网络:社区发现:交叉熵: 一种基于交叉熵的社区发现算法 摘要 作为复杂网络中的一个极其重要的研究领域,社区结构的搜寻和发现研究具有重要的应用价值 . 该文将信 ...

  8. 社区发现SLPA算法

    社区(community)定义:同一社区内的节点与节点之间关系紧密,而社区与社区之间的关系稀疏. 设图G=G(V,E),所谓社区发现是指在图G中确定nc(>=1)个社区C={C1,C2,..., ...

  9. fastunfolding算法_社区发现算法综述—part1

    目前我能在arxiv上找到的最新的关于社区发现算法系列的综述文了. 正文从这里开始: 2.2 社区发现 现代网络在规模.多样性和复杂性上呈指数增长. 由于网络的变化,各种各样呈现出网络结构的不同类型的 ...

  10. 社区发现(一)--算法综述

    基础概念简介:https://baike.baidu.com/item/%E7%A4%BE%E5%8C%BA%E5%8F%91%E7%8E%B0%E7%AE%97%E6%B3%95/19460396 ...

最新文章

  1. PHP也玩并发,巧用curl 并发减少后端访问时间
  2. python与excel结合-Python与Excel 不得不说的事情
  3. [Linux]lnmp一键安装包,访问yii/tp5/laravel的时候,报错500或者空白页面
  4. android nuwa2,android热更新
  5. LinkedBlockingQueue源码
  6. nodejs mysql事务处理_关于NodeJs如何使用Mysql模块实现事务处理实例
  7. 获取元素在文档上的正确坐标
  8. Atitit 信息链(Information Chain)的概念理解 attilax总结
  9. JavaWeb汽车商城项目
  10. linux系统使用宝塔来搭建内部gitlab教程
  11. oracle一次提交大量sql语句 begin end的使用
  12. 关于消防系统安装的一些规范
  13. Keil5快速下载支持包
  14. mybatis中如何防止sql注入和传参
  15. windows11,java最详细安装jdk,手把手教你安装jdk,配置环境变量
  16. 2021年所有干货文章导航!#内有惊喜
  17. 聚合支付行业的2019年终总结大会!细品,你细品~
  18. 自定义蜘蛛网图 NetView
  19. 【正交调制】数字调制技术之正交调制
  20. KeePass密码管理软件 ---下载安装及汉化

热门文章

  1. android studio创建和安装虚拟机
  2. 乐高Mindstorms使用ev3dev进行编程
  3. Linux卸载Anaconda
  4. js 生成条形码(JsBarcode.all.min.js)
  5. Qt界面程序中嵌入其他可执行exe程序
  6. Vmware虚拟机桥接模式设置
  7. 【gigabyte】开机循环进入技嘉主板界面、BIOS功能识别不出硬盘
  8. C语言 打印九九口诀表
  9. 怎么卸载脚手架_安装卸载流程 · 广联达BIM模板脚手架设计软件帮助文档 · 看云...
  10. 伺服电机抖动原因分析