社区发现系列02-算法介绍

news2025/1/18 10:04:26
hello, 大家好,欢迎来到阿君聊风控,我是阿君(一名有7年互金和电商风控经验的算法工程师)。
 
在上篇文章https://blog.csdn.net/u010569893/article/details/128565829?spm=1001.2014.3001.5502 中我们了解到可以用社区发现技术来对图进行划分,进而挖掘到作弊团伙。那么常用的社区发现算法有哪些呢?今天我们就来聊一聊常用的社区发现算法和原理,以及通过实验来来对比不同社区发现算法划分的效果

一、社区发现算法

网络图内部连接比较紧密的节点子集合对应的子图叫做社区(community),各社区节点集合彼此没有交集的称为非重叠型(disjoint)社区,有交集的称为重叠型(overlapping)社区。对给定的网络图寻找其社区结构的过程称为“社区发现”。大体上看,社区发现的过程就是一种聚类的过程。

1.1 LPA标签传播算法

1、基本思想:

标签传播算法是不重叠社区发现的经典算法,其基本思想是:将一个节点的邻居节点的标签中数量最多的标签作为该节点自身的标签。给每个节点添加标签(label)以代表它所属的社区,并通过标签的“传播”形成同一标签的“社区”结构。

给每个节点添加标签(label)以代表它所属的社区,并通过标签的“传播”形成同一标签的“社区”结构。一个节点的标签取决于它邻居节点的标签:假设节点z的邻居节点有z1至zk,那么哪个社区包含z的邻居节点最多z就属于那个社区(或者说z的邻居中包含哪个社区的标签最多,z就属于哪个社区)。优点是收敛周期短,无需任何先验参数(不需事先指定社区个数和大小),算法执行过程中不需要计算任何社区指标。

时间复杂度接近线性:对顶点分配标签的复杂度为O(n),每次迭代时间为O( m),找出所有社区的复杂度为O (n +m),但迭代次数难以估计

2、传播过程: 
1)初始时,给每个节点一个唯一的标签; 
2)每个节点使用其邻居节点的标签中最多的标签来更新自身的标签。 
3)反复执行步骤2),直到每个节点的标签都不再发生变化为止。 
一次迭代过程中一个节点标签的更新可以分为同步和异步两种。所谓同步更新,即节点z在第t次迭代的label依据于它的邻居节点在第t-1次迭代时所得的label;异步更新,即节点z在第t次迭代的label依据于第t次迭代已经更新过label的节点和第t次迭代未更新过label的节点在第t-1次迭代时的label。

注: 
1、迭代次数设定一个阈值,可以防止过度运算; 
2、对于二分图等网络结构,同步更新会引起震荡; 
//3、类似(“强”社区>)定义的结构(该社区>=); 
4、每个顶点在初始的时候赋予唯一的标签,即“重要性”相同,而迭代过程又采用随机序列,会导致同一初始状态不同结果甚至巨型社区的出现; 
5、如果能预测“社区中心”点,能有效提高社区发现的准确度,大幅提高效; 
6、同一节点的邻居节点的标签可能存在多种社区最大数目相同的情况,取“随机”一个作为其标签

 

3、算法改进思路:初始化或传播改进 
1)给节点或边添加权重(势函数、模块密度优化、LeaderRank值、局部拓扑信息的相似度、标签从属系数等),信息熵等描述节点的传播优先度,进而初步确定社区中心点以提高社区划分的精度; 
2)标签初始化改进,如提取一些较为紧密的子结构来作为标签传播的初始标签(非重叠最小极大团提取算法 orz。。。)或通过初始社区划分算法先确定社区的雏形再进行传播。 
3)标签随机选择改进,将1)中的权值和节点邻接点的度数等作为参考因素,对标签更新过程进行修正

1)在社区中寻找不重叠三角形作为起始簇的雏形,以提高算法结果的稳定性和运行效率; 
2)添加标签熵属性,在迭代过程中不采用随机序列,而是根据每个节点的标签熵来排序序列; 
3)在2)的基础上,为了不完全消除标签传播算法的随机性,将排序好的队列平均分成三个部分,在每个部分内,节点进行随机排列。 
4)对于同一节点的邻居节点的标签可能存在多种社区最大数目相同的情况,不使用随机方法,而是分析该节点的邻节点的邻节点集标签分布情况来决定该节点的标签

5)在社区中寻找以度最大的若干节点为中心的“雪花型”结构作为起始簇的雏形 


 

1.2 Louvain算法(基于模块度的层次型社区发现算法)

1、 算法的思想:

1)初始时,将图中的每个节点看作是一个独立的社区,社区的数量跟节点的数量相同
2)对每个节点i, 分别尝试将该节点划分到其邻居节点所在的社区,根据下面的公式(3)计算划分前和划分后模块度的变化delta(Q) ,也就是模块度增益, 并记录模块度增益最大的那个邻居节点,如果最大模块度增益>0, 则将即节点i分配到那个邻居节点中,否则保持不变
3)重复2),直到所有节点的所属社区不再变化
4)对图进行压缩,将所有的子图压缩成一个超节点,社区内节点之间的边的权重转化为超节点的权重,社区间边的权重转化为超节点的权重
5)重复1)直到整个图的模块度不再发生变化

从流程看,该算法可以产生层次性的社区结构,这样分层的结构是每个网络的自然属性,使研究员得意深入了解某个社区的内部结构和形成机制。
其中计算最耗时的是最底层的社区划分,节点按社区压缩后,将大大缩减节点和边的数量,并且计算节点i的分配只跟节点i的邻居节点有关,因此计算很快,是一种高效的层次社区发现算法,是一种迭代的2层社区发现算法
该算法目前被认为是快速、准确,被认为是效果和性能最优的社区发现算法之一;该算法对图的大小几乎没有上限要求,并且能够在迭代几轮后快速收敛,这为处理拥有百万节点以上的大型社交网络的社区发现提供了可能

2、 模块度和模块度的增益

参考:http://www.yalewoo.com/modularity_community_detection.html
1)模块度的定义:
可以理解为:社区内部变得权重减去所有与社区节点相连边的权重和的平方,对无向图更好理解,即社区内部边的度数减去社区内节点的总度数。

2)模块度的增益
模块度增益

上式可以理解为: 括号内第一项ki,in表示实际节点i(或社区A)与要移入社区B之间的连接边的权重之和, tot ki/m 则为随机情况下节点i(或社区A)在总的加权度为 tot ki的情况下与当前graph上任意 的节点或社区连接的边的权重的期望. 第一项若比第二项大则说明节点i(或社区A)与该社 区B的连接程度是具有显著的意义的, 那么便加入到该社区, 反之则不加入。 模块度是评估一个社区网络划分好坏的度量方法,可以看出,它是一种相对性的指标。

1.3、CPM算法

k-团渗透算法(CPM)[1]是第一个能够发现重叠社区的算法,重叠社区指的是结点可以同时属于多个社区。重叠社区在社交网络中是十分常见的,因为每个人都有着多种多样的社交关系。

网络中的最大团指的是,团中任意两个结点之间都有边连接,并且它不被其他的团所包含。

CPM算法的想法非常简单,首先它找出网络中所有大小至少为k的最大团。然后构建一个团图,每个最大团都是团图中的一个结点,如果两个团c1与c2共享min(c1,c2)-1个邻居的话,它们在新图中的结点之间就存在边。最后团图中的每个连通单元就是一个结点的社区,而它可能是重叠的。

代码参见:https://github.com/zzz24512653/CommunityDetection/blob/master/algorithm/CPM.py

1.4、GN算法(分裂性社区发现算法)

http://blog.csdn.net/aspirinvagrant/article/details/45599071
    GN算法[1]是社区发现中的第一个算法,也就是它开启了这个研究领域。它的基本思想是删除掉那些社区之间的连接,那么剩下的每个连通部分就是一个社区。
那么问题来了,就是那些是社区之间的边呢?作者巧妙地借助最短路径解决了这个问题,
他们定义一条边的介数(betweeness)为网络中所有结点之间的最短路径中通过这条边的数量,而介数高的边要比介数低的边更可能是社区之间的边。其实,这也比较好理解,因为两个社区中的结点之间的最短路径都要经过那些社区之间的边,所以它们的介数会很高
    GN算法每次都删除网络中介数最大的边,直至网络中的所有边都被删除。这样GN的过程对应着一颗自顶向下构建的层次树。在层次树中选择一个合适的层次分割即可。
GN算法的步骤如下: 
(1)计算每一条边的边介数; 
(2)删除边界数最大的边; 
(3)重新计算网络中剩下的边的边阶数;
(4)重复(3)和(4)步骤,直到网络中的任一顶点作为一个社区为止。
GN算法的缺陷:
(1)不知道最后会有多少个社区;
(2)在计算边介数的时候可能会有很对重复计算最短路径的情况,时间复杂度太高;
(3)GN算法不能判断算法终止位置。
(4)但是其计算时间复杂度较高,对于一个拥有n个节点和m条边的网络,其时间复杂度为O(m2n),因此往往不能直接应用在大图的社区发现问题中。

二、不同算法的社区划分效果:

1、样本:

1500个节点的互联网小额贷款首次逾期账号形成的大图

2、社区划分软件:pajek、networkx

pajek的使用:
参考:复杂网络分析软件NetworkX和Pajek的关联及后者使用方法小结_蛐蛐蛐的博客-CSDN博客
  1. networkx是python的一个第三方包,可以方便地调用各种图算法的计算。
  2. 将NetworkX中的网络转成Pajek可以读取的网络,实际上只需要一条语句: nx.write_pajek(G,'Pajek.net'
  3. 然后就可以用Pajek打开这个文件,具体而言,启动Pajek界面后,选择“Network”下的第一个图标,然后打开。这里再简单总结一下这个软件的使用。例如,对于刚才打开的网络,可以进行社团发现,操作如下:
  4. 在菜单栏中点Network——Create Partition——Communities——Louvain Method,选择任一种算法,运行后就可以在Partitions这一栏生成结果。
  5. 对于这样的社团划分结果,我们希望能把结果可视化出来,那么只需要选择Draw——Network + First Partition即可。就简单总结这么多,希望能帮助大家在熟悉NetworkX的前提下迅速掌握Pajek的使用方法。
3、实验结论:
1)Louvain算法和GN算法的划分效果是比较符合预期的,但是由于GN算法的时间复杂度太高,所有Louvian算法是最优的选择
2)Louvain算法可用于风控、个性化推荐等领域,虽然效果比不上GNN,但是计算成本非常低且无需标注数据,适用于规模较大的网络。在计算成本和计算时间上有着明显的优势。

4、不同社区划分算法的实验结果

实验1 Louvain算法:

结果:有32个社区,Q=0.8678

实验2:GN算法

结果:35个社区  Q=0.854

实验3:谱聚类算法(基于谱图划分的聚类算法)

结果:n=40 (缺点:划分出较多的孤立点,社区划分不均匀)

实验4: LPA算法

结果:n=390(划分出的孤立点较多,社区划分不均匀)

 

实验5: EM算法:

结果:n=40

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/144777.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

全面兼容各端的动画库PAG,对标Lottie

感谢Tencent 开源了PAG库,终于有了国人自己的动画库了,该库兼容:移动端,桌面端,,WEB端,还有小程序端,真可谓用心了,而且PAG库相对其他库,使用的pag文件更小&a…

《UEFI内核导读》SecCore与PeiCore简介(I)

敬请关注:“固件C字营 SecCore也被称之为VTF,被映射到Boot Firmware Volume (BFV),BFV的地址被放置在0xFFFFFFE0连续的4个字节(小端模式)。 SecCore 是一个FFS firmware file,其文件末端地址与于BFV的末端…

磨金石教育摄影技能干货分享|摄影拼贴技法的运用与效果

河南省-黄阳惠智-《那是山吗》画面中是一片群山景象。我们看上去感觉像是画出来的,又像是电脑做的图。其实这是摄影师用了中国山水画的特有表现手法,对桂林山水的景象,进行了拼贴在创造。作者用一些非山非水的现代物品,像织女一样…

【记录一】gis理论

gis地图相关一、gis 理论知识二、fianlshell连接服务器连接服务器命令行记录三、geoserver地图服务器初识geoserver添加新图层最近图层样式修改图层样式新增编辑图层的样式四、git上传代码查看远程地址上传代码时新建tag一、gis 理论知识 二、fianlshell连接服务器 连接服务器…

【小知识点】免费头像API,用 Python Flask 动态生成一个汉字头像

本案例是 爬虫训练场 项目的衍生案例,用于渲染用户头像,大家也可以将该接口用于其它目的。 本文会使用随机汉字生成技术,如未掌握,可以查看 Python 随机生成一个汉字 文章目录基础环境配置加载本地 txt 文件,用于随机生…

打包安卓apk后的V1和V2签名

前言:打包apk后上架之前需要进行加固,加固后生成的apk文件需要进行重新签名;单独的apk文件可以使用基于JDK(需要安装java jdk)和SDK(需要下载android studio 开发工具)的命令进行手动签名。安装…

【Maven】核心概念

Maven的核心概念一、Maven工程中约定的目录结构二、仓库管理🎶仓库的概述🎶仓库的分类本地仓库所在位置的设置重写更改本地仓库路径,不使用默认路径有什么好处呢?🎶Maven对仓库的使用三、POM工程的唯一标识依赖&#x…

数据结构与算法:泛型初学习

1.包装类 java中的数据类型int,double等不是对象,无法通过向上转型获取到Object提供的方法,而像String却可以,只因为String是一个对象而不是一个类型。基本数据类型由于这样的特性,导致无法参与转型,泛型&…

【服务器数据恢复】Raid5丢失一块盘被重建的数据恢复案例

服务器数据恢复环境: 一台服务器上5块硬盘组建raid5磁盘阵列,用于存储公司数据,无备份。 服务器故障&分析: 服务器上一块硬盘故障掉线,用户聘请一家运维公司对服务器进行维护,运维公司技术人员在没有了…

redis 基础

Redis学习笔记配置文件启动redis与redis进行交互redis命令Redis通用命令keys 查看所有符合模板的keytype 查看这个key的存储类型![在这里插入图片描述](https://img-blog.csdnimg.cn/175e3a5c1b064ce09b9b47cc1c7b34f9.png)del 删除一个keyexists 判断一个Key是否存在ttl 查看一…

HummerRisk V0.8.0:新增金山云、K8s基准检测、源IP审计分析等

HummerRisk V0.8.0发布:多云检测支持金山云、K8s检测新增CIS Benchmark 功能 、操作审计增加源 IP 分析功能、主机检测增加Linux 检测规则。同时优化 operator及Benchmark 的自动/手动安装,优化多个结果展示页面等。 感谢社区中小伙伴们的反馈&#xff…

整型常量不同进制间的相互转换

整型常量可以分别用二进制、八进制、十进制和十六进制表示,不同的进制并不影响数据本身的大小,同一个整型常量可以在不同进制之间转换,具体转换方式如下。 1.十进制和二进制之间的转换 (1)十进制转二进制 十进制转换成二进制就是一个除以2…

实验用试剂mPEG-PDLLA介绍;甲氧基聚乙二醇-聚DL-丙交酯 嵌段共聚物

PLA-MPEG、peg-pla、mPEG-PDLLA 甲氧基聚乙二醇-聚乳酸、甲氧基聚乙二醇-聚DL-丙交酯 结构式: 【详情】 化学式:CH3(C2H4O)m (C6H10O2)n 溶剂:氯仿、二氯甲烷、丙酮、DMF、DMSO等有机溶剂。 性状:半固体或固体&a…

【C++核心编程】C++全栈体系(八)

C核心编程 第四章 类和对象 C面向对象的三大特性为:封装、继承、多态 C认为万事万物都皆为对象,对象上有其属性和行为 例如: ​ 人可以作为对象,属性有姓名、年龄、身高、体重…,行为有走、跑、跳、吃饭、唱歌… …

数据采集网关对接MySQL数据库

数据采集网关嵌入式 ARM 控制器 BL301/BL302支持 MySQL、InfluDB、SQLite 等数据库。Mysql 支持 5.1.51~5.1.73 版本。 将编译好的文件拷贝到 BL302 的/usr/local/mysql 目录下,将里面的可执行文件复制 到/usr/sbin 目录下或者在设备上设置环境变量 export PATH&quo…

Mentor-dft 学习笔记 day51-State Stability Examples

State Stability Examples 以下为包含状态稳定性报告的示例,显示了状态稳定性分析中的不同行为。示例基于图B-1所示的设计。该设计具有以下三个时钟:• clk1— The only scan clock • clk2— Clocks a particular non-scan flip-flop • reset— Resets…

燕山大学软件学院硕士研究生指导教师情况

燕山大学信息科学与工程学院(软件学院)简介 燕山大学信息科学与工程学院源于东北重型机械学院自动控制系,始建于 1960 年。1983 年,无线电技术、计算机及应用两个专业脱离自动控制系,于东北重型机械学院组建计算机 工…

Java中的.length与.length()

目录一. .length1. .length究竟有多长?2. 为什么会有.length呢?3. 二维数组的创建方法4. 数组是对象二. .length()1. .length()怎么用呢?2. char数组怎么转换为String3. String怎么转换为char数组三. 对比1. 为什么数组不像String&#xff0c…

【 uniapp - 黑马优购 | 商品详情 】详情页UI结构设计、商品导航区域实现

个人名片: 🐼作者简介:一名大二在校生,讨厌编程🎋 🐻‍❄️个人主页🥇:小新爱学习. 🐼个人WeChat:hmmwx53 🕊️系列专栏:&#x1f5bc…

SVN使用教程

SVN使用教程 常见图标状态 1、常规:绿色圈带白色对勾,主要是表示自己电脑上的文件或者文件夹与SVN服务器上对应的文件一致,在自己电脑没有进行任何修改。 2、修改:红色圈带白色感叹号,当你开始编辑一个文件&#xff…