社群发现算法--强连通和连通在关联图谱中的应用
本文介绍社群发现算法在关联图谱中的应用。社群发现算法是图算法中的一种,图算法是图分析的工具之一。 图算法提供了一种最有效的分析连接数据的方法,它们描述了如何处理图以发现一些定性或者定量的结论。图算法基于图论,利用节点之间的关系来推断复杂系统的结构和变化。我们可以使用这些算法来发现隐藏的信息,验证业务假设,并对行为进行预测。
文章目录
- 一、图论中基本名词
- 二、导入数据
- 三、强连通算法
- 1 名词解释
- 2 在图中找强连通分量的具体算法
- 3 数据分析与查询
- 四、连通算法
- 1 一个通俗易懂的小例子
- 2 未加权连通图算法
- 3 加权连通图算法
一、图论中基本名词
1. 连通图(Connected Graphs):图中任意两点之间都有路相连。
2. 非连通图(Disconnected Graphs):图中存在两点之间没有路相连。
3. 有向图(Directed Graphs):节点的关系指定了方向。
4. 无向图(Undirected Graphs):节点的关系是双向的。
5. 加权图(Weighted Graphs): 节点或边上赋予权重。
6. 未加权图(Unweighted Graphs):节点和边上都没有权重。
7. 循环图(Cyclic Graphs):图中存在一些特殊的路径,它们的起点和终点是同一个节点。注:有向图的路径须需遵循边的方向。
8. 非循环图(Acyclic Graphs):图中不存在循环路径。
9. 子图(Subgraph):一张图的一部分,指节点集和边集分别是某一图的节点集的子集和边集的子集的图。
二、导入数据
把点和关系数据放到import文件夹下,运行如下语句:
using periodic commit 10000 load csv with headers from "file:/node_gzh.csv" as line with line create (:gzh {item:line.item, trans_amount_sum:line.trans_amount_sum, trans_cnt:line.trans_cnt, type:line.type});
CREATE INDEX ON :gzh(item)
using periodic commit 10000 load csv with headers from "file:/node_rela_gzh.csv" as line match (from:gzh {item: line.item_l}),(to:gzh {item:line.item_r}) merge (from)-[c:gzh{relation:line.relation}]-(to)
注:如需本文原数据可到公众号中回复“neo4j导入数据”,即可免费获取。更详细的数据导入说明参见文章:neo4j中导入数据的两种常用方式(千万级和亿级)。接下来详细阐述社群发现算法在关联图中的应用。
三、强连通算法
1 名词解释
1.两个节点强连通:在有向图G中,若两个节点u和v间有一条从u到v的有向路径,同时还有一条从v到u的有向路径,则称两个节点强连通。
2.强连通图:若有向图G的每两个节点都强连通,则称图G是一个强连通图。
3.强连通分量(Strongly Connected Components,简称SCC):有向图的极大强连通子图。
2 在图中找强连通分量的具体算法
在neo4j中运行如下语句,即可找出图中所有的强连通分量。
CALL algo.scc.stream("gzh","gzh")
YIELD nodeId, partition
MATCH (u:gzh) WHERE id(u) = nodeId
RETURN u.item AS item, partition
注:使用社群发现算法需要在neo4j中安装algo模块,可自行到网上搜寻教程安装。
参数说明:
scc:强连通分量的缩写,代表算法的类型。
gzh:第一个gzh代表节点的标签,第二个gzh代码关系的类型,我在导入数据时都写成了gzh所以是一样的,可根据具体数据调整。
(u:gzh):填入节点标签。
u.item:返回节点的属性,可根据需要自行调整。
得到结果如下:
3 数据分析与查询
对下载(页面中下载箭头)的数据用透视表进行分析排序,得到每一强连通分量中商户的数量,具体结果如下:
为了让大家更清晰地理解这个算法,从结果中挑一个(partition为8634)强连通分量进行回查展示。
在neo4j中运行如下语句:
WITH ['8635',
'8671',
'8698',
'16995',
'17808',
'18121',
'18622',
'18626',
'18688',
'18976',
'24924'
] AS arr
MATCH p=(n)-[]->(m)
WHERE n.item IN arr or m.item IN arr
RETURN p
with中的数据是partition为8634(11个点)组别中的item(商户编号),该语句查找这些节点所有对外的关系构成的子图。
得到结果如下:
图中总计13个点,红框中是11个点构成的强连通分量,任意两个节点之间都强连通。由于查询的是这个强连通分量中所有点对外关系构成的子图,查到了item为61886的节点还有两个对外的关系。虽然这11个点有到这两个点的路径,但是这两个点没有11个点的路径,所有这两个点不是这个强连通分量中的一员。
四、连通算法
顾名思义,连通算法是在全量图中寻找连通的子图,其中同一子图中的所有节点构成一个连通的组件。
1 一个通俗易懂的小例子
小胖、小华、小明、小雪、小红、小芳是同班同学,由于疫情好久都没有见面了。小胖给小华打了3分钟电话,小胖给小明打了10分钟电话。小雪给小红打了11分钟电话,小红给小芳打了5分钟电话。由上面的描述知小胖、小华、小明三人联系过,小雪、小红、小芳三人联系过。在neo4j中把如上关系转成关联图。
具体语句如下:
create (xiaopang:Person {name:'小胖'})
create (xiaohua:Person {name:'小华'})
create (xiaoming:Person {name:'小明'})
create (xiaoxue:Person {name:'小雪'})
create (xiaohong:Person {name:'小红'})
create (xiaofang:Person {name:'小芳'})CREATE (xiaopang)-[:LINK {weight: 3}]->(xiaohua)
CREATE (xiaopang)-[:LINK {weight: 10}]->(xiaoming)
CREATE (xiaoxue)-[:LINK {weight: 11}]->(xiaohong)
CREATE (xiaohong)-[:LINK {weight: 5}]->(xiaofang);
先创建点,再创建关系,把通话时长作为关系的权重。创建好的图如下(有向图):
下面用连通算法寻找大图中的子连通图。
2 未加权连通图算法
不考虑边的权重,在整个图中寻找连通子图,具体语句如下:
CALL algo.unionFind.stream('Person', 'LINK')
YIELD nodeId, setId
RETURN algo.asNode(nodeId).name AS Name, setId AS ComponentId
ORDER BY ComponentId, Name
参数说明:
unionFind:连通分量的英文,代表算法的类型。
Person代表节点标签,LINK代表关系类型。如果不写代表在所有标签和关系中寻找连通子图。
最后返回了组别id和对应节点的名称,并对组别进行排序展示。
注:如果只有一种节点和一种关系可以省略('Person', 'LINK')
括号中的内容,直接写一个括号即可。
得到结果:
可以发现小胖、小华、小明三人分在一组,小雪、小红、小芳分在一组。说明连通不考虑关系的方向,可以理解成把图当成无向图处理,两个点之间只要有边就连通。那么这个算法有什么用呢?
如果一个犯罪团伙之间有相互转账的关联关系,可以通过连通算法把所有有关联的人员放到一个组别(一张子图)中进行分析。
3 加权连通图算法
在官网中给出了加权连通图算法,可以通边和边的权重对连通图进行一个更细的划分。
具体语句如下:
CALL algo.unionFind.stream('Person', 'LINK', {weightProperty: 'weight',threshold: 4,concurrency:1})
YIELD nodeId, setId
RETURN algo.asNode(nodeId).name AS Name, setId AS ComponentId
ORDER BY ComponentId, Name
如果把threshold设为4,由于小胖和小华的关系weight为3,会把小华单独列为一类。但是我在运行该代码时一直在报错,欢迎大家在研究过程中和我探讨。接下来会研究标签传播算法和模块度算法在知识图谱中的具体应用,欢迎大家持续关注。
你可能感兴趣:
用Python绘制皮卡丘
用Python绘制词云图
Python人脸识别—我的眼里只有你
Python画好看的星空图(唯美的背景)
用Python中的py2neo库操作neo4j,搭建关联图谱
Python浪漫表白源码合集(爱心、玫瑰花、照片墙、星空下的告白)
长按(扫一扫)识别上方二维码学习更多Python和建模知识,让你的学习和工作更出彩。
社群发现算法--强连通和连通在关联图谱中的应用相关推荐
- 网络社群发现算法挖掘bilibili视频流量数据可视化
原文链接:tecdat.cn/?p=19006 最新研究表明,中国有超过7亿人在观看在线视频内容.Bilibili,被称为哔哩哔哩或简称为B站,是中国大陆第二个弹幕视频网站,最大的年轻人潮流文化娱乐社 ...
- 深度学习核心技术精讲100篇(二)-图网络中的社群及社群发现算法
前言 本篇博文主要讲解Graph中社群的概念,然后介绍了一种简单的社群发现算法Louvain Algorithm,最后提供可重叠的社群发现,提出BigCLAM算法,用来识别节点从属关系. 01 Gra ...
- 图网络中的社群及社群发现算法
导读:本文来自作者的学习笔记.主要讲解Graph中社群的概念,然后介绍了一种简单的社群发现算法Louvain Algorithm,最后提供可重叠的社群发现,提出BigCLAM算法,用来识别节点从属关系 ...
- Tarjan算法 —— 强连通双连通缩点 模板
TP 强连通缩点模板 双连通缩点模板 边双连通 点双连通 有向图 我们知道在一张 有向无环 图(也叫 DAG)中,肯定存在拓扑序.拓扑序的特殊顺序性质,能够允许我们在 O(n+m)O(n + m)O( ...
- 基于Spark Grahpx Neo4j 实现用户社群发现
上一篇文章<知识图谱在大数据中的应用>我们介绍了知识图谱的一些概念和应用场景,今天我们就来看一个具体的应用案例了解下知识图谱的应用.用户增长对于一个APP的生存起到了至关重要的作用,没有持 ...
- 只会高中数学运算就能发现算法?Google开源的AutoML-Zero有多厉害
译者 | 刘畅 出品 | AI科技大本营(ID:rgznai100) 机器学习研究,已经在多个方面都取得了进步,包括模型结构和优化方法等.而使此类研究自动化的工作(称为AutoML)也有重大进展.这一 ...
- 只会高中数学运算就能发现算法?Google 开源的 AutoML-Zero 有多厉害
译者 | 刘畅 来源 | AI科技大本营(ID:rgznai100) 机器学习研究,已经在多个方面都取得了进步,包括模型结构和优化方法等.而使此类研究自动化的工作(称为AutoML)也有重大进展.这一 ...
- 用Python中的py2neo库操作neo4j,搭建简单关联图谱—基于家有儿女中的人物关系
我第一次建立关联图谱用的是R语言,通过写代码帮公安挖掘团伙犯罪,并用图形展示团伙之间的关联关系.如有需要请关注 "阿黎逸阳的代码" 公众号的后续文章,会手把手教大家用R搭 ...
- Spark GraphX下强连通子图和社团发现算法在1T TPC-DS数据集下执行方法、优化和性能估算
概述: 下面内容说的是在TPC-DS 1T数据集上用web_sales表ws_bill_customer_sk, ws_ship_customer_sk作为起始点和结束点,以ws_quantity为权 ...
最新文章
- signature=2ee20a16234208d4dd8bbd7fe87bb472,sstk-20200428
- 原 c++中map与unordered_map的区别
- mysql语言定义_MySQL定义语言[DDL]
- 蓝桥杯_算法训练_ALGO12_摆动序列
- 华为手机记事本导出_涨知识!原来华为手机自带的录音转文字这么好用,秒变会议神器...
- spring mvc学习(43):处理静态资源
- Easyui+Spring+Mybatis完整示例(前台)
- Linux系统编程24:基础IO之在Linux下深刻理解C语言中的动静态库以及头文件和库的关系
- 编程时请选择正确的输入法,严格区分中英文
- Pv6报头结构以及与IPv4的比较
- Android系统(245)---SystemServer进程的创建流程
- java 物联网 eclipse_Eclipse物联网
- 技术干货 | SDN controller高可用之路
- 2019安全渗透类工具
- PAT 乙级 Java 合集
- Cellular Automaton UVA - 1386
- 最近在关注浏览器,先转一篇游戏浏览器的评测。
- pubwinol免刷_Pubwin万象OL实名一键自动处理程序
- 【python】二进制与十进制的转换
- C语言:从键盘输入一个整数,分别输出它的个位数、十位数、百位数.....