本文介绍社群发现算法在关联图谱中的应用。社群发现算法是图算法中的一种,图算法是图分析的工具之一。 图算法提供了一种最有效的分析连接数据的方法,它们描述了如何处理图以发现一些定性或者定量的结论。图算法基于图论,利用节点之间的关系来推断复杂系统的结构和变化。我们可以使用这些算法来发现隐藏的信息,验证业务假设,并对行为进行预测。
  
  

文章目录

  • 一、图论中基本名词
  • 二、导入数据
  • 三、强连通算法
    • 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和建模知识,让你的学习和工作更出彩。

社群发现算法--强连通和连通在关联图谱中的应用相关推荐

  1. 网络社群发现算法挖掘bilibili视频流量数据可视化

    原文链接:tecdat.cn/?p=19006 最新研究表明,中国有超过7亿人在观看在线视频内容.Bilibili,被称为哔哩哔哩或简称为B站,是中国大陆第二个弹幕视频网站,最大的年轻人潮流文化娱乐社 ...

  2. 深度学习核心技术精讲100篇(二)-图网络中的社群及社群发现算法

    前言 本篇博文主要讲解Graph中社群的概念,然后介绍了一种简单的社群发现算法Louvain Algorithm,最后提供可重叠的社群发现,提出BigCLAM算法,用来识别节点从属关系. 01 Gra ...

  3. 图网络中的社群及社群发现算法

    导读:本文来自作者的学习笔记.主要讲解Graph中社群的概念,然后介绍了一种简单的社群发现算法Louvain Algorithm,最后提供可重叠的社群发现,提出BigCLAM算法,用来识别节点从属关系 ...

  4. Tarjan算法 —— 强连通双连通缩点 模板

    TP 强连通缩点模板 双连通缩点模板 边双连通 点双连通 有向图 我们知道在一张 有向无环 图(也叫 DAG)中,肯定存在拓扑序.拓扑序的特殊顺序性质,能够允许我们在 O(n+m)O(n + m)O( ...

  5. 基于Spark Grahpx Neo4j 实现用户社群发现

    上一篇文章<知识图谱在大数据中的应用>我们介绍了知识图谱的一些概念和应用场景,今天我们就来看一个具体的应用案例了解下知识图谱的应用.用户增长对于一个APP的生存起到了至关重要的作用,没有持 ...

  6. 只会高中数学运算就能发现算法?Google开源的AutoML-Zero有多厉害

    译者 | 刘畅 出品 | AI科技大本营(ID:rgznai100) 机器学习研究,已经在多个方面都取得了进步,包括模型结构和优化方法等.而使此类研究自动化的工作(称为AutoML)也有重大进展.这一 ...

  7. 只会高中数学运算就能发现算法?Google 开源的 AutoML-Zero 有多厉害

    译者 | 刘畅 来源 | AI科技大本营(ID:rgznai100) 机器学习研究,已经在多个方面都取得了进步,包括模型结构和优化方法等.而使此类研究自动化的工作(称为AutoML)也有重大进展.这一 ...

  8. 用Python中的py2neo库操作neo4j,搭建简单关联图谱—基于家有儿女中的人物关系

         我第一次建立关联图谱用的是R语言,通过写代码帮公安挖掘团伙犯罪,并用图形展示团伙之间的关联关系.如有需要请关注 "阿黎逸阳的代码" 公众号的后续文章,会手把手教大家用R搭 ...

  9. Spark GraphX下强连通子图和社团发现算法在1T TPC-DS数据集下执行方法、优化和性能估算

    概述: 下面内容说的是在TPC-DS 1T数据集上用web_sales表ws_bill_customer_sk, ws_ship_customer_sk作为起始点和结束点,以ws_quantity为权 ...

最新文章

  1. signature=2ee20a16234208d4dd8bbd7fe87bb472,sstk-20200428
  2. 原 c++中map与unordered_map的区别
  3. mysql语言定义_MySQL定义语言[DDL]
  4. 蓝桥杯_算法训练_ALGO12_摆动序列
  5. 华为手机记事本导出_涨知识!原来华为手机自带的录音转文字这么好用,秒变会议神器...
  6. spring mvc学习(43):处理静态资源
  7. Easyui+Spring+Mybatis完整示例(前台)
  8. Linux系统编程24:基础IO之在Linux下深刻理解C语言中的动静态库以及头文件和库的关系
  9. 编程时请选择正确的输入法,严格区分中英文
  10. Pv6报头结构以及与IPv4的比较
  11. Android系统(245)---SystemServer进程的创建流程
  12. java 物联网 eclipse_Eclipse物联网
  13. 技术干货 | SDN controller高可用之路
  14. 2019安全渗透类工具
  15. PAT 乙级 Java 合集
  16. Cellular Automaton UVA - 1386
  17. 最近在关注浏览器,先转一篇游戏浏览器的评测。
  18. pubwinol免刷_Pubwin万象OL实名一键自动处理程序
  19. 【python】二进制与十进制的转换
  20. C语言:从键盘输入一个整数,分别输出它的个位数、十位数、百位数.....

热门文章

  1. java调用默认打印机打印发货标签
  2. pytorch分布式训练 DistributedSampler、DistributedDataParallel
  3. 认证的政府与媒体类订阅号可取得网页授权接口了
  4. mysql执行存储过程报错1366_花花蘑菇
  5. ChatGPT教程之 01 什么是ChatGPT革命性的对话生成新工具
  6. Matplotlib基础02:散点图、折线图与柱状图
  7. 苹果怎么清理隐藏内存?全新手机技巧,还不会的亏大了!
  8. Linux下线程池源码实现
  9. window用户切换
  10. SQL SERVER(32)Transact-SQL概述