技术原创|一文读懂图遍历算法以及图计算应用

为解决大规模计算和海量数据处理问题,Google 在 2010 年提出了图计算模型 Pregel。随后又陆续出现了。GraphLab、GraphChi等典型图计算系统。

图计算是人工智能的一个使能技术。

大数据时代,越来越多的数据采用图结构进行表示. 图也是一种能够表达对象之间复杂关系的数据存储方式。

那么,什么是图?

下面是数据类型的结构和图的结构表示对比:

技术原创|一文读懂图遍历算法以及图计算应用

技术原创|一文读懂图遍历算法以及图计算应用

可以看出:图(graph)是一种用于表示对象之间联系的抽象数据结构。

接下来,小普列举几个常见的图计算模式:(这部分比较偏向于技术,想看应用的小伙伴可以往下滑)

目前的图计算框架基本上都遵循BSP(Bulk Synchronous Parallell)计算模式。它将计算分成一系列的超步(superstep)的迭代(iteration)。从纵向上看,它是一个串行模型,而从横向上看,它是一个并行的模型,每两个superstep之间设置一个栅栏(barrier),即整体同步点,确定所有并行的计算都完成后再启动下一轮superstep。

超步可分为三个阶段:

01计算

每一个processor利用上一个superstep传过来的消息和本地的数据进行本地计算;

02消息传递

每一个processor计算完毕后,将消息传递给与之关联的其它processors;

03整体同步

用于整体同步,确定所有的计算和消息传递都进行完毕后,进入下一个superstep。

BSP模型架构

技术原创|一文读懂图遍历算法以及图计算应用

模型基于一个master协调,所有的worker同步(lock-step)执行, 数据从输入的队列中读取。

Pregel模型

Pregel在概念模型上遵循BSP模式。整个计算过程由若干顺序运行的超级步(Super Step)组成,系统从一个”超级步”迈向下一个”超级步”,直到达到算法的终止条件。

超步的组成如下:

01vpro

是节点上的用户定义的计算函数,运行在单个节点之上,在superstep 0,这个函数会在每个节点上以初始的initialMsg为参数运行并生成新的节点值。在随后的超步中只有当节点收到信息,该函数才会运行。

02sendMsg

在当前超步中收到信息的节点用于向相邻节点发送消息,这个消息用于下一个超步的计算。

03mergeMsg

用于聚合发送到同一节点的消息,这个函数的参数为两个A类型的消息,返回值为一个A类型的消息。

技术原创|一文读懂图遍历算法以及图计算应用

Pregel模型的缺陷

01单节点无法并发处理

对于邻居数很多的顶点,它需要处理的消息非常庞大,而且在这个模式下,它们是无法被并发处理的。所以对于符合幂律分布的自然图,这种计算模型下很容易发生假死或者崩溃。

02消息传递开销大

在图的划分上,采用的是简单的hash方式,这样固然能够满足负载均衡,但是hash方式并不能根据图的连通特性进行划分,导致超步之间的消息传递开销可能会是影响性能的最大隐患。

03长时间等待

BSP模型本身有其局限性,整体同步并行对于计算快的worker长期等待的问题无法解决。

04内存不足

由于pregel目前的计算状态都是常驻内存的,对于规模继续增大的图处理可能会导致内存不足。

采用边分割的存储方式,重复存储大量边在内存中

GAS模型

利用分布式图计算中的顶点分割方法来对图数据来进行分割,从而使得一个数据量巨大的图,能够在不同的分布式计算节点中进行平行计算。

但是当图数据被分割后进入不同计算节点进行计算的时候,由于在不同节点中对于同一个节点有可能有多个副本,这个节点副本之间如何进行数据交换协同也成为了一个难题,于是GAS模型就被提出来解决这个难题。

技术原创|一文读懂图遍历算法以及图计算应用

GAS模型主要分为3个阶段:Gather Apply Scatter

技术原创|一文读懂图遍历算法以及图计算应用

01Gather阶段

Gather阶段主要功能是规约(reduce),其上定义了一个sum函数,用于规约当前顶点通过边收集到的信息。用户通过自定义sum函数,指定了每个定点上的规约功能。如挑选出相邻边传递消息的最小值,或最大值。这里的sum不是一个简单求和的意思,更确切地说,是将从周围收集到地一系列信息整合成一个用户想要地结果,并输出给下一个阶段。

02Apply阶段

Apply阶段,主要是针对每个顶点,将Gather阶段地结果应用到当前顶点上,即用户通过自定义策略来根据Gather的结果更新当前顶点地值。

03Scatter阶段

Scatter阶段,根据Apply阶段的结果,将当前顶点的最新结果更新到该顶点的边上。

GAS对比Pregel的优势

相比叫Pregel,GAS将Pregel中的每个SuperStep一分为三,每个SubStep上对应一个用户自定义的操作。

一方面使得用户的自由度更大,

另一方面能明显提升个SubStep直接的并行计算性能,特别是当顶点关联的边非常大的时候。GAS计算模式在图计算框架PoweGraph和GraphLab中得到了很好的应用,并且在大规模关系网络或复杂图上取得了非常不错的效果。

接下来,小普再介绍几个常见的图算法:”图算法”就是基于图的算法。

LPA标签传播算法

LPA是一种基于标签传播的局部社区划分。对于网络中的每一个节点,在初始阶段,Label Propagation算法对于每一个节点都会初始化一个唯一的一个标签。每一次迭代都会根据与自己相连的节点所属的标签改变自己的标签,更改的原则是选择与其相连的节点中所属标签最多的社区标签为自己的社区标签,这就是标签传播的含义了。随着社区标签不断传播。最终,连接紧密的节点将有共同的标签:

01同步更新

在t轮迭代中,每个节点依赖的都是邻居节点第t-1轮迭代的结果。

02异步更新

在t轮迭代中,每个节点依赖的是当前邻居节点的社区标签,若邻居已经进行了标签更新,则依赖的是邻居节点t时的标签。

优点:

LPA算法的最大的优点就是算法的 逻辑非常简单,相对于优化模块度算法的过程是非常快的,不用louvain那样的多次迭代优化过程。

LPA算法利用自身的网络的结构指导标签传播,这个过程是无需任何的任何的优化函数,而且算法初始化之前是不需要知道社区的个数的,随着算法迭代最后可以自己知道最终有多少个社区。

缺点:

划分结果不稳定,随机性强;

更新顺序:节点标签更新顺序随机,但是很明显,越重要的节点越早更新会加速收敛过程;

随机选择:如果一个节点的出现次数最大的邻居标签不止一个时,随机选择一个标签作为自己标签。这种随机性可能会带来一个雪崩效应,即刚开始一个小小的聚类错误会不断被放大。不过,如果相似邻居节点出现多个,可能是weight计算的逻辑有问题,需要回过头去优化weight抽象和计算逻辑。

SLPA算法

LPA是一种重叠型社区发现算法,其中涉及一个重要阈值参数r,通过r的适当选取,可将其退化为非重叠型,也就是LPA算法。

计算过程:

  • 初始化所有节点的标签信息,使得每个节点拥有唯一的标签。

  • 最为主要的是标签传播过程。

  • 当前节点作为一个listener。

  • 当前节点的每一个邻居节点根据一定的speaking策略传递标签信息。

  • 当前节点从邻居节点传播的标签信息集中根据一定的listener策略选择一个标签作为本次迭代中的新标签。

  • 算法收敛或遍历达到指定的次数,算法结束。否则,标签在不断的遍历过程中传播。

  • 标签分类过程。后处理阶段根据节点的标签信息进行社区发现。

优点:

算法SLPA 不会像其它算法一样忘记上一次迭代中节点所更新的标签信息,它给每个节点设置了一个标签存储列表来存储每次迭代所更新的标签。最终的节点社区从属关系将由标签存储列表中所观察到的标签的概率决定,当一个节点观察到有非常多一样的标签时,那么,很有可能这个节点属于这个社区,而且在传播过程中也很有可能将这个标签传播给别的节点。更有益处的是,这种标签存储列表的设计可以使得算法可以支持划分重叠社区。

PageRank

PageRank,又称网页排名算法,Google用它来体现网页的相关性和重要性,在搜索引擎优化操作中是经常被用来评估网页优化的成效因素之一。

技术原创|一文读懂图遍历算法以及图计算应用

PR(u): 当前节点的PR值

PR(v): 边指向当前节点的邻居节点PR值

L(v): 边指向当前节点的邻居节点的出度

技术原创|一文读懂图遍历算法以及图计算应用

为了便于计算,我们假设每个页面的PR初始值为1

PR(A) = PR(C) = 1

PR(B) = 0.5PR(A) = 0.5

PR(C) = 0.5PR(A) + PR(B) = 1.5

至此,我们模拟了一个简化的 PageRank 的计算过程,实际情况会比这个复杂,可能会面临两个问题:

01等级泄露(Rank Leak)

如果一个网页没有出链,就像是一个黑洞一样,吸收了其他网页的影响力而不释放,最终会导致其他网页的 PR 值为 0。

02等级沉没(Rank Sink)

如果一个网页只有出链,没有入链(如下图所示),计算的过程迭代下来,会导致这个网页的 PR 值为 0。

针对等级泄露的情况,我们可以把没有出链的节点,先从图中去掉,等计算完所有节点的 PR 值之后,再加上该节点进行计算。不过这种方法会导致新的等级泄露的节点的产生,所以工作量还是很大的。

PageRank随机浏览模型

为了解决简化模型中存在的等级泄露和等级沉没的问题,拉里·佩奇提出了 PageRank 的随机浏览模型。他假设了这样一个场景:用户并不都是按照跳转链接的方式来上网,还有一种可能是不论当前处于哪个页面,都有概率访问到其他任意的页面,比如说用户就是要直接输入网址访问其他页面,虽然这个概率比较小。

所以他定义了阻尼因子 d,这个因子代表了用户按照跳转链接来上网的概率,通常可以取一个固定值 0.85,而 1-d=0.15 则代表了用户不是通过跳转链接的方式来访问网页的,比如直接输入网址。

技术原创|一文读懂图遍历算法以及图计算应用

其中 N 为网页总数,这样我们又可以重新迭代网页的权重计算了,因为加入了阻尼因子 d,一定程度上解决了等级泄露和等级沉没的问题。

Louvain社区切分算法

Louvain算法是一种基于多层次(逐轮启发式迭代)优化模块度(Modularity)的算法。模块度函数最初被用于衡量社区发现算法结果的质量,它能够刻画发现的社区的紧密程度。

同时,模块度函数既然能刻画社区的紧密程度,也就能够被用来当作一个优化函数(目标函数),即将结点加入它的某个邻居所在的社区中,如果能够提升当前社区结构的模块度。则说明这次迭代优化是可接受的。

计算过程:

  1. 不断地遍历网络中的结点,尝试将单个结点加入能够使modularity提升最大的社区中,直到所有结点都不再变化

  2. 处理第一阶段的结果,将一个个小的社区归并为一个超结点来重新构造网络,这时边的权重为两个结点内所有原始结点的边权重之和

  3. 迭代以上两个步骤直至算法稳定或达到最大迭代次数

Louvain社区切分算法—模块度增益

模块度增益是针对单个节点定义的,当某个节点合并到某个社区中时,我们计算形成的全图的modularity,然后和合并之前的全图的modularity做对比即可得到该次节点合并时,模块度的增益。

技术原创|一文读懂图遍历算法以及图计算应用

上式中ki,in是节点i与i要移入社区中所有节点之间边权重和,∑tot是节点i要移入的社区内所有节点的边的权重和,上式可以理解为括号内第一项ki,in表示实际节点i与要移入社区之间的连接边的权重之和, 第二项∑tot/m为其它节点与该社区连接一条边的概率,∑tot/m * ki则为基于平均情况下节点i在加权度为k的情况下与该社区连接的边的权重. 第一项若比第二项大则说明节点i与该社区连接程度超过平均预测, 则加入到该社区, 反之保持不变

图计算应用

为了快速处理图数据和应对不断增长的图数据,图计算应用被广泛部署于各大数据中心,成为数据中心的典型应用。用于表示 人际关系、分子拓扑结构、大脑神经元链接等.图数据中蕴含着丰富的信息, 图计算应用是一种挖掘图数据中隐含价值的重要应用.

接下来小普列举一些图计算应用在数据挖掘中的应用案例:

银行图计算应用:利用关系的延展提升事后失联催收的成功率

传统催收系统以一度直接关系寻找逾期违约人员的联系方式,往往因为信息失效导致失联。

构建统一数据视图后的关系图谱,可以通过其关系延展能力以及间接关系、隐藏关系的发现能力,帮助催收人员扩展更多与失信人相关的重要干系人和联系方式,提升催收的效率和覆盖率。

技术原创|一文读懂图遍历算法以及图计算应用
  • *金融行业精准营销:通过高AUM客户的关系延展唤醒沉睡客户和挖掘潜在客户

技术原创|一文读懂图遍历算法以及图计算应用

技术原创|一文读懂图遍历算法以及图计算应用

经过大数据分析,对低值客户和潜在客户推荐理财产品,容易出成效。购买理财产品的客群具有基数大,人均综合AUM超过50万,流失率低于10%,复购率高等特点,对优化资产结构和客户结构都有很好的优化作用。

今天的分享就到这里啦,希望你有所收获,觉得好记得给小普点个赞。

Original: https://blog.csdn.net/PUSHIAI/article/details/122998335
Author: 极客小普冲呀
Title: 技术原创|一文读懂图遍历算法以及图计算应用

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/556601/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球