楠姐技术漫话:接着唠唠社区发现 | 京东云技术团队

news2024/10/6 16:30:20

halo,大家好很开心又和大家见面了

在第一篇 楠姐技术漫画:图计算的那些事 发布之后,楠姐收到了很多建议、鼓励和支持,非常感谢大家的喜欢,所以楠姐尽自己所能马不停蹄开始第二篇的创作,虽迟但到~

本篇依然是风控算法分享,其实也依然算是图算法系列。社区发现作为最基础的图算法之一,也是楠姐在2020年入职后,第一个跟着大腿有样学样,学习、上手和应用的图算法,因此在第一期之后,楠姐就立刻决定把它单独拿出来写一期,进一步来说,无论图计算今天和日后发展如何,我们都不该忘记最初的前人基石,同时也希望自己和每个小伙伴,无论路已走多远,都能不忘初心,不忘滴水之恩。

PART 1 ★—

其实社区发现

也并不是什么难懂的名词

相信所有看过第一期漫话的宝子们

应该还没忘记图的概念

那社区又是什么呢?

社区其实反映的是

网络中的个体行为的局部性特征

以及其相互之间的关联关系

换通俗一些的说法…

用户之间的点赞、私信、关注等动作形成了边

那些关联尤为紧密的用户就形成一个社区

而分属不同社区的用户之间

关联则非常稀疏或根本不存在关联

近几年流行的饭圈文化就是一个很好的例子

明白了什么是社区

其实社区发现所要做的事也就很易懂了

正是要发现这些潜在的、有特定关系的节点集合

以及每个社区中都有哪些节点

这样做的目的和效果也有很多

我们京东的注册/营销/支付/物流/信贷等各大系统

黑产团伙在很多细节上的关联总是非常紧密的

与正常用户显得格格不入

再比如生物学领域

基因调控网络分析、主控基因识别

还有疾病传播学

传染关键社区识别以及易感人群发现等

还有上一期评论区中提到的

👍基于社交网络的海王识别器👍

都可以用到社区划分

一是要确认当前使用场景内

确实存在着明显聚集规律

节点间存在一定的逻辑可以形成社区结构

而不是无规律分散

二是不要把社区拓扑结构欧式空间结构混淆

虽然在欧式空间中

向量夹角小的点向量彼此距离近

向量夹角大的点向量彼此距离远

但即使距离相近的点向量

也不一定就存在业务或者逻辑上的拓扑关联

牢记以上两点

才不会让你的社区划分被限制使用方式或失效

PART 2 ★—

那说到这呢

可能会有算法的小伙伴发现

社区发现好像和聚类非常相似

它们都属于无监督算法

聚类要做的是

“簇内距离最小化,簇间距离最大化”

社区发现要做的是

“社区内部节点关联紧密,社区之间节点关联稀疏”

确实二者之间存在着很多相似性

但依然也是有区别的

机器学习中常见的聚类算法

本质上是一种更通用的方法

适用于多种常见的数据类型

而社区发现本质上则是图结构上的聚类

而关于社区本身

其实也有两种不同的类型

非重叠社区重叠社区

前者说的是图中的每个节点只属于一个社区

而后者则允许同一个节点可以分属于多个社区

PART 3 ★—

社区发现算法类别繁多

不同算法划分的社区自然也是不同的

不管是人还是模型去执行一些学习任务

都有关于学习是否到位的评判方法

那我们如何评价一个社区发现算法的好坏呢?

此时就不得不先提一个重要的基本概念

模块度(modularity)

这是一种常用的社区划分评估指标

为了怕大家睡着从而忘记一键三连

楠姐贴一个简化版的模块度计算公式

通俗来说

模块度的物理含义是

社区内部的边数与随机情况下的边数的差距

如果越大,说明社区内部密集度高于随机情况

这里的随机情况指的是图中节点和边的数量不变

把节点之间连接关系随机打乱

一个图如果看起来不像随机产生的

那可能就是存在社区的

如果一个社区发现算法

尽可能多的将关联紧密的点划分在同一社区中

尽量避免所得社区之间还存在过多的边

这样就能得到较高的模块度

也会被认为是较好的一种划分方式

PART 4 ★—

自从2002年“社区”概念被提出后

社区发现算法就一直在快速发展

首先是比较直接基于模块度的社区发现

这类算法直接把模块度作为优化目标

有着良好的解释性

Louvain算法是其中的典型代表

它的二阶段思路非常清晰

第一个阶段称为模块度优化阶段

先把图中的每个节点都视作一个独立的社区

对每个节点

依次尝试将其分配到它每个邻居节点的社区中

计算分配前后模块度的变化

并将该节点分配至模块度增益最大的一个邻居社区

如果没有任何一个邻居社区能提升模块度

则该节点的社区保持不变

对所有节点进行一轮以上计算后

一些节点便已经被划分在了同一个社区

接着开始第二阶段——社区聚合阶段

把同一个社区的节点视作一个新的节点

社区内部的边视作权重和累加的自环边

社区之间的边视作新节点之间的边

根据这个新的图结构再重复第一阶段

两个阶段循环往复

直到模块度不再更优为止

Louvain算法由于其较低的时间复杂度

十分适用于大规模网络的社区检测

也成为应用最广泛的算法之一

★★

第二种经典方法

是基于节点表达的社区发现

该类方法将图节点表达和映射到多维向量空间

并结合传统聚类算法将它们聚集成社区

这种方法不可避免的要进行矩阵计算

或者使用额外的节点表征算法

计算开销很大

但它能直接使用传统聚类的成果

因此灵活性非常好

比如,典型的一个方案就是

使用node2vec进行图节点编码

再使用聚类将相似的节点向量进行聚合

node2vec其实是借鉴了NLP领域中的word2vec

简单来讲,它先会在图结构中进行随机游走

通过随机游走

采样出多条节点序列

类似于文本序列

而我们要表征的节点

就类似于文本中的字词

再使用NLP领域中常用的SkipGram算法

将节点表示成量化的向量表达

以文本理解为例

如果我们想让人工智(zhi)能(zhang)理解下面这句话:

那是不是可以把这句话中“技术漫话”遮挡住

让模型进行填空:

“楠姐发了____,很快就要火了”

如果模型能正确填上

就可以一定程度代表模型学会了这句话中每个字词的含义

或者反过来也可以

把除了“技术漫话”之外其他的字全部遮挡住

让模型进行补写:

技术漫话,_____”

要是模型补充的很不错

也代表模型学会了这句话和里面的字词

上面做的这些事

就是NLP领域内的word2vec算法

第一种填空的方式叫CBOW模型

第二种补充的方式就是SkipGram模型

在图的节点表征中

用于图节点序列也是一样的道理

那么说回社区发现

有了节点的数值表示

就可以借助任意一个传统的聚类算法

达成最终的节点社区划分的目标

但是分两步的方法终究费时费力

也有一些优秀的算法

可以将节点编码和聚类合二为一

一起进行优化

单纯是由于懒

楠姐就不再赘述

★★★

今天要说的第三种经典的社区发现思路

是基于信息论的社区发现

里面的典型代表是楠姐的“老熟人”

——赫赫有名的infomap算法

它也采用了在图中随机游走的方式进行节点序列的采样

但它社区发现的目标

是最小化节点的平均编码长度

所谓编码

其实就是用有限个标记的组合来表示原始信息

大家最熟知的就是二进制编码

即只用0和1两个数字

编码与原始对象通常是一一对应的

比如“楠”可能对应着“11”,“姐”对应着“1001”,那么“楠姐”就对应着(11,1001)

如果需要我们快速地记录下所看到的文字

记录的方式需要将每个字对应一个二进制编码

那为了记得更快

我们显然是希望经常出现的字用短的编码

比如“楠姐”这个词如果出现的很频繁

如果用“11000010001”来表示“楠姐”

要是每次听到“楠姐”都需要写这么长的数字

该是多么一件糟心的事情

如果用短的编码,比如“10”来表示“楠姐”

那相对而言记录速度就能有明显提升

也显得“楠姐”没有那么讨厌了

那么该如何找到一种最优的节点编码

使得平均编码最短呢

这个在信息论中已经给出了严谨的公式计算

也就是存在着一个“信息熵”的极限

不管用什么样的编码方式

其平均编码都不可能低于信息熵

这个信息熵也正是无损压缩的能力极限

这也正是信息论中的最小熵原理

回到Infomap算法本身

它额外借助了一个分组编码的思路

把最小信息熵和社区发现结合了起来

有没有一种可能

大家选择的记忆方式是酱紫的:

前面五个是人类活动

其次两个是搬砖项目

再往后三个是好吃的

后面三个是游戏

最后大家再分别记住四种分组里具体都有什么

是的,没错

这样的记忆方式就是一种更高效的方式

**也是infomap所采用的编码方式——**层次编码

它把每个节点都尝试进行分类

节点的编码均为在类内的编码

额外还有一套独立的类别编码

由于有了分类的思想

不同类的节点可以使用相同的编码

比如“楠姐”和“东坡肘子”都可以用使用“01”

这样就无形中压缩了整体的编码长度

再加上前面提到的最小熵目标

我们就可以搜寻一种最优的分层编码

来使得最短平均编码长度越小越好

最后每个节点编码时的分类

就是最终所属的社区

Infomap最大的优点也在于此

真是一种强大且漂亮的算法

还有一些其他类型的社区发现

比如基于标签传播的方法

基于图分割的方法

广义社区发现等等

感兴趣的宝子们可以卷起来了!

PART 5 ★—

社区发现算法算是图计算中的一条重要分支

也是我们风控技术中离不开的工具

它在纷繁复杂的网络结构中

总能提供给我们一种微观视角

揭示着事物的结构和本质

只要你的想象力足够丰富

就绝对有社区发现算法所能发挥的空间

事在人为,行则终至!

加油吧,算法攻城狮们~

----写在最后----

本篇文章图片构思、创意、整体结构、后期修改,全部版权归楠姐所有,素材生成均源自于Midjourney以及楠姐原创提示词生成。楠姐出图不易,并非完美,请勿未经允许用于其他场合及目的。

本篇文章图片创意均只为了说明及示意,且带有一定夸张和幽默元素,切勿对号入座哦如有雷同,纯属巧合无意冒犯~

本篇文章文字均根据以下参考文献汇总撰写:

[1]. 马耀,汤继良. 图深度学习[M].电子工业出版社.

[2]. 张长水,唐杰,邱锡鹏[M]. 图神经网络导论[M].人民邮电出版社.

[3]. CSDN. 写综述想到的[EB/OL]. https://blog.csdn.net/loptimistic/article/details/8173555

[4]. CSDN. 社区发现(Community Detection)算法[EB/OL]. https://blog.csdn.net/huangxia73/article/details/11801661

[5]. 博客园. 社区发现算法总结[EB/OL]. https://www.cnblogs.com/nolonely/p/6262508.html

[6]. 知乎. 简析社区发现和聚类[EB/OL]. https://zhuanlan.zhihu.com/p/428821516

[7]. 知乎. 万物皆网络,万字长文详解社区发现算法Louvain[EB/OL]. https://zhuanlan.zhihu.com/p/556291759

[8]. CSDN. infomap最全面易懂的解释–最小熵原理:“层层递进”之社区发现与聚类[EB/OL]. https://blog.csdn.net/jinking01/article/details/103511553

作者:京东科技 丁楠

来源:京东云开发者社区 转载请注明来源

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

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

相关文章

高等数学笔记

|sinx|连续不可导 只要在x0处存在极限且极限等于f(x0)则函数在此处连续 如果某点可导则左右导数应该相等(可导一定连续,连续不一定可导) 双曲函数的由来 塞入dx 莱布尼茨公式 sin(nx)的k次导n^k*sin(nxkΠ/2) 注意符号! 二阶导公…

实时操作系统Freertos开坑学习笔记:(五):任务调度和时间片调度

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、任务调度1.开启任务调度器函数2.启动第一个任务 二、任务切换的原理三、时间片调度1.基本概念2.看一个实际例程①我们设置滴答定时器中断时间为50ms&#x…

低代码平台:IVX 重新定义编程

目录 🍬一、写在前面 🍬二、低代码平台是什么 🍬三、为什么程序员和技术管理者不太可能接受“低代码”平台? 🍭1、不安全(锁定特性) 🍭2、不信任 🍬四、IVX低代码平台 &a…

Vue3数值动画(NumberAnimation)

效果如下图:在线预览 APIs 参数说明类型默认值必传from数值动画起始数值number0falseto数值目标值number1000falseduration数值动画持续时间,单位msnumber3000falseautoplay是否自动开始动画booleantruefalseprecision精度,保留小数点后几位…

vue响应式详解

1. 响应式的定义 我们都知道,vue是基于javascript的,那我们使用一段javascript代码来描述响应式 let a 1,b 1,c; c a b; console.log(c) // 输出 2 // 改变 a的值 a 3; // 重新给c赋值 即把 c a b; 再执行一遍c的值才能变为 4 // c a b; // …

map组件轨迹,定位,导航,定位点遮罩

小程序使用map组件实现轨迹&#xff0c;定位&#xff0c;导航&#xff0c;定位点遮罩 map组件常用属性说明&#xff0c; 看着还要自己研究写 我们立志成为cv工程师 直接上代码&#xff01;&#xff01;&#xff01; <template><map id"map" class"m…

天软高频因子日内及隔夜动量因子

天软因子序列课程再次启动&#xff0c;本周四&#xff08;9月7日&#xff09;下午4点相约腾讯会议&#xff0c;可直接扫描下方二维码&#xff0c;欢迎大家参会&#xff01; 本次会议主要内容有&#xff1a; 1.介绍日内及隔夜动量因子的构造逻辑&#xff0c;如何选择市 场代理变…

Spring AOP与静态代理/动态代理

文章目录 一、代理模式静态代理动态代理代理模式与AOP 二、Spring AOPSping AOP用来处理什么场景jdk 动态代理cglib 动态代理面试题&#xff1a;讲讲Spring AOP的原理与执行流程 总结 一、代理模式 代理模式是一种结构型设计模式&#xff0c;它允许对象提供替代品或占位符&…

说说MySQL主从复制?

分析&回答 主从复制原理 主库记录binlog日志 在每次准备提交事务完成数据更新前&#xff0c;主库将数据更新的事件记录到二进制日志binlog中。主库上的sync_binlog参数控制binlog日志刷新到磁盘。 从库IO线程将主库的binlog日志复制到其本地的中继日志relay log中 从库会…

K8S的CKA考试环境和题目

CKA考试这几年来虽然版本在升级&#xff0c;但题目一直没有大的变化&#xff0c;通过K8S考试的方法就是在模拟环境上反复练习&#xff0c;通过练习熟悉考试环境和考试过程中可能遇到的坑。这里姚远老师详细向大家介绍一下考试的环境和题目&#xff0c;需要详细资料的同学请在文…

解决C++ 遇笔试题输入[[1,2,3,...,],[5,6,...,],...,[3,1,2,...,]]问题

目录 0 引言1 思路2 测试结果3 完整代码4 总结 0 引言 现在面临找工作问题&#xff0c;做了几场笔试&#xff0c;遇到了一个比较棘手的题目就是题目输入形式如下&#xff1a; [ [3,1,1], [3,5,3], [3,2,1] ] 当时遇到这个问题还是比较慌的&#xff0c;主要是之前没有遇到这样的…

RHCA之路---EX280(2)

RHCA之路—EX280(2) 1. 题目 Associate the share named /exports/registry to the built-in registry running within your OpenShift Enterprise instance so that it will be used for permanent storage Use exam-registry-volume for the volume name and exam-registry-…

公司内部传文件怎么安全——「用绿盾透明加密软件」

为保证公司内部文件传递的安全性&#xff0c;可以使用天锐绿盾透明加密软件来进行保护。以下是具体的操作步骤&#xff1a; 在公司内部部署天锐绿盾加密软件&#xff0c;确保需要传递的文件都能受到加密保护。 在员工的工作电脑上安装天锐绿盾客户端&#xff0c;并设置好相关的…

C++学习记录——삼십이 C++IO流

文章目录 1、C标准IO流2、C文件IO流1、二进制读写2、文本读写 3、stringstream 1、C标准IO流 C语言的printf和scanf无法很好的输入输出自定义类型&#xff0c;且还需要程序员自己确定类型&#xff0c;所以C就引入了输入流和输出流&#xff0c;是设备和内存之间的沟通。 其实io…

Gin学习记录3——模版与渲染

模版与渲染 一. 返回二. 模版2.1 基础模版2.2 同名模版2.3 模版继承2.4 模版语法 一. 返回 如果只是想返回数据&#xff0c;可以使用以下函数&#xff1a; func (c *Context) JSON(code int, obj any) func (c *Context) JSONP(code int, obj any) func (c *Context) String(…

阿里后端开发:抽象建模经典案例

0.引言 在互联网行业&#xff0c;软件工程师面对的产品需求大都是以具象的现实世界事物概念来描述的&#xff0c;遵循的是人类世界的自然语言&#xff0c;而软件世界里通行的则是机器语言&#xff0c;两者间跨度太大&#xff0c;需要一座桥梁来联通&#xff0c;抽象建模便是打…

一文读懂HOOPS Native平台:快速开发桌面端、移动端3D应用程序!

HOOPS Native Platform是用于在桌面和移动平台以及混合现实应用程序上构建3D工程应用程序的首要工具包。它由三个集成良好的软件开发工具包(SDK)组成&#xff1a;HOOPS Visualize、HOOPS Exchange、HOOPS Publish。HOOPS Visualize 是一个强大的图形引擎&#xff0c;适用于本机…

lement-ui 加载本地图片

实现图片展示时&#xff0c;发先本地的图片加载不了。 代码&#xff1a; <template><div><el-image src"../assets/logo.png" ></el-image></div> </template>结果发现不对&#xff0c;加载不出来&#xff0c;一查资料&#xf…

【Java】Jxls--轻松生成 Excel

1、介绍 Jxls 是一个小型 Java 库&#xff0c;可以轻松生成 Excel 报告。Jxls 在 Excel 模板中使用特殊标记来定义输出格式和数据布局。 Java 有一些用于创建 Excel 文件的库&#xff0c;例如Apache POI。这些库都很好&#xff0c;但都是一些较底层的库&#xff0c;因为它们要…

代码随想录算法训练营第42天 | ● 01背包问题,你该了解这些! ● 01背包问题,你该了解这些! 滚动数组 ● 416. 分割等和子集

文章目录 前言一、01背包问题&#xff0c;你该了解这些&#xff01;二、01背包问题&#xff0c;你该了解这些&#xff01; 滚动数组三、416. 分割等和子集总结 前言 01背包 一、01背包问题&#xff0c;你该了解这些&#xff01; 确定dp数组以及下标的含义 对于背包问题&#x…