GeaFlow图计算快速上手之PageRank算法

简介: GeaFlow图计算快速上手之PageRank算法

GeaFlow(品牌名TuGraph-Analytics) 已正式开源,欢迎大家关注!!! 欢迎给我们 Star 哦! GitHub👉https://github.com/TuGraph-family/tugraph-analytics
更多精彩内容,关注我们的博客 https://geaflow.github.io/


GeaFlow介绍

GeaFlow(品牌名TuGraph-Analytics)是蚂蚁集团开源的分布式实时图计算引擎,目前广泛应用于金融风控、社交网络、知识图谱以及数据应用等场景。GeaFlow的核心能力是流式图计算,流式图计算相比离线图计算提供了一种高时效性低延迟的图计算模式,更多详细内容参考GeaFlow GitHub介绍(https://github.com/TuGraph-family/tugraph-analytics).

GeaFlow整体架构如下所示:
geaflow_arch.png

  • GeaFlow DSL GeaFlow对用户提供图表融合分析语言,采用SQL + ISO/GQL方式.用户可以通过类似SQL编程的方式编写实时图计算任务.
  • GraphView API GeaFlow以GraphView为核心定义的一套图计算的编程接口,包含图构建、图计算以及Stream API接口.
  • GeaFlow Runtime GeaFlow运行时,包含GeaFlow图表算子、task调度、failover以及shuffle等核心功能.
  • GeaFlow State GeaFlow的图状态存储,用于存储图的点边数据.同时流式计算的状态如聚合状态也存放在State中.
  • K8S Deployment GeaFlow支持K8S的方式进行部署运行.
  • GeaFlow Console GeaFlow的管控平台,包含作业管理、元数据管理等功能.

PageRank算法介绍

PageRank是图计算领域一个应用广泛的算法,由Google公司创始人之一拉里·佩奇与谢尔盖·布林在1998年发明,主要用于网页的排序。该算法基于网页之间相互引用的关系,将网页评分的思想引入到搜索引擎中,用于计算网页的重要度和排名。

PageRank算法的核心思想是:一个网页的重要度是由其他网页对它的引用数量和质量决定的。如果一个网页被其他网页引用得多,那么它的重要度就越高。同时,如果一个网页的引用来源也很重要,那么它对被引用网页的贡献也会更大。

实现PageRank算法的具体步骤包括:首先构建网页之间的链接关系图,然后对图进行迭代计算,直到收敛为止。在每一次迭代中,每个网页的得分都会被重新计算,并更新到下一次迭代中。最后,按照网页得分的大小对搜索结果进行排序,输出排名前几位的网页。如下有4个页面,A, B, C, D:

pr1.png

以A点为例,其每一轮的PageRank值计算方法如下:

PR(A) = d * (PR(D)/ 2 + PR(B)/1 + PR(C)/2) + (1- d)

每一个点的PageRank值等于其入点的PageRank值除以入点出边数的加权和, 其中d为0~1之间的修正系数.

PageRank算法在搜索引擎中广泛应用,成为搜索引擎排名的重要算法之一。除此之外,PageRank算法的思想也在社交网络、推荐系统等领域得到了应用。

TuGraph-Analytics实现PageRank

接口与实现

TuGraph-Analytics支持在图查询里调用图算法,语法形式如下:

INSERT INTO tbl_result
CALL page_rank() YIELD (vid, prValue)
RETURN vid, prValue;

我们通过CALL语句调用具体的算法,通过YIELD定义算法的返回字段,比如page_rank算法返回点id和page rank值两个字段,则可以通过YIELD(vid, prValue)来表示。

DSL里面实现一个图算法需要实现AlgorithmUserFunction接口,其定义如下:

/**
 * Interface for the User Defined Graph Algorithm.
 * @param <K> The id type for vertex.
 * @param <M> The message type for message send between vertices.
 */
public interface AlgorithmUserFunction<K, M> extends Serializable {
   
   

    /**
     * Init method for the function
     * @param context The runtime context.
     * @param params  The parameters for the function.
     */
    void init(AlgorithmRuntimeContext<K, M> context, Object[] params);

    /**
     * Processing method for each vertex and the messages it received.
     */
    void process(RowVertex vertex, Iterator<M> messages);

    /**
     * Returns the output type for the function.
     */
    StructType getOutputType();
}
  • init

算法的初始化接口,主要完成算法的一些初始化操作. PageRank的init方法实现如下:

    @Override
    public void init(AlgorithmRuntimeContext context, Object[] parameters) {
   
   
        this.context = context;
        if (parameters.length > 3) {
   
   
            throw new IllegalArgumentException(
                "Only support zero or more arguments, false arguments "
                    + "usage: func([alpha, [convergence, [max_iteration]]])");
        }
        // 修正系数,即前面介绍的参数d.
        if (parameters.length > 0) {
   
   
            alpha = Double.parseDouble(String.valueOf(parameters[0]));
        }
        // PR值更新阀值,当点的pr差值小于该值时,不再更新pr值.
        if (parameters.length > 1) {
   
   
            convergence = Double.parseDouble(String.valueOf(parameters[1]));
        }
        // 迭代次数
        if (parameters.length > 2) {
   
   
            iteration = Integer.parseInt(String.valueOf(parameters[2]));
        }
    }
  • process

算法的主要处理逻辑,入参为当前Active点和要处理的消息,PageRank主要实现如下:

    @Override
    public void process(RowVertex vertex, Iterator messages) {
   
   
       ....

        if (context.getCurrentIterationId() == 1L) {
   
   
            // 首轮迭代设置pr初始值,并发送给出边,同时更新当前点的pr值。
            double initValue = 1.0;
            sendMessageToNeighbors(outEdges, initValue / outEdges.size());
            ...
            context.updateVertexValue(ObjectRow.create(initValue));
        } else if (context.getCurrentIterationId() < iteration) {
   
   
            double sum = 0.0;
            while (messages.hasNext()) {
   
   
                double input = (double) messages.next();
                input = input > 0 ? input : 0.0;
                sum += input;
            }
            // 计算当前迭代的pr值
            double pr = (1 - alpha) + (sum * alpha);
            double currentPr = (double) vertex.getValue().getField(0, DoubleType.INSTANCE);
            if (Math.abs(currentPr - pr) > convergence) {
   
   
                // pr值发送给出边目标点.
                sendMessageToNeighbors(outEdges, pr / outEdges.size());
            } 
            context.updateVertexValue(ObjectRow.create(pr));
        } else {
   
    // 到达最大迭代次数,结束本轮迭代,take最终计算结果.
            double currentPr = (double) vertex.getValue().getField(0, DoubleType.INSTANCE);
            context.take(ObjectRow.create(vertex.getId(), currentPr));
            return;
        }
    }
  • getOutputType

定义算法返回类型,PageRank实现如下:

 @Override
    public StructType getOutputType() {
   
   
        return new StructType(
            // id
            new TableField("id", LongType.INSTANCE, false),
            // pr值
            new TableField("pr", DoubleType.INSTANCE, false)
        );
    }

算法注册

算法实现通过注解来定义算法名称,如下所示:

@Description(name = "page_rank", description = "built-in udga for PageRank")
public class PageRank implements AlgorithmUserFunction {
   
   
}

算法和UDF一样,需要注册或者创建后才能使用. DSL内置算法或者UDF在BuildInSqlFunctionTable中进行注册.对于非内置算法,可以通过create function语句来创建.

Create funciton page_rank as 'com.antgroup.geaflow.dsl.udf.graph.PageRank';

总结

本文主要介绍实时图计算引擎GeaFlow的基本架构,然后介绍了图算法PageRank的基本原理以及在GeaFlow中的实现细节和使用方式.


GeaFlow(品牌名TuGraph-Analytics) 已正式开源,欢迎大家关注!!!

欢迎给我们 Star 哦!

Welcome to give us a Star!

GitHub👉https://github.com/TuGraph-family/tugraph-analytics

更多精彩内容,关注我们的博客 https://geaflow.github.io/

相关文章
|
1月前
|
算法 机器人
基于SOA海鸥优化算法的PID控制器最优控制参数计算matlab仿真
本课题研究基于海鸥优化算法(SOA)优化PID控制器参数的方法,通过MATLAB仿真对比传统PID控制效果。利用SOA算法优化PID的kp、ki、kd参数,以积分绝对误差(IAE)为适应度函数,提升系统响应速度与稳定性。仿真结果表明,SOA优化的PID控制器在阶跃响应和误差控制方面均优于传统方法,具有更快的收敛速度和更强的全局寻优能力,适用于复杂系统的参数整定。
|
5月前
|
算法 JavaScript 数据安全/隐私保护
基于GA遗传优化的最优阈值计算认知异构网络(CHN)能量检测算法matlab仿真
本内容介绍了一种基于GA遗传优化的阈值计算方法在认知异构网络(CHN)中的应用。通过Matlab2022a实现算法,完整代码含中文注释与操作视频。能量检测算法用于感知主用户信号,其性能依赖检测阈值。传统固定阈值方法易受噪声影响,而GA算法通过模拟生物进化,在复杂环境中自动优化阈值,提高频谱感知准确性,增强CHN的通信效率与资源利用率。预览效果无水印,核心程序部分展示,适合研究频谱感知与优化算法的学者参考。
|
7月前
|
分布式计算 并行计算 算法
MapReduce在实现PageRank算法中的应用
总结来说,在实现PageRank算法时使用MapReduce能够有效地进行大规模并行计算,并且具有良好的容错性和可扩展性。
232 76
|
存储 分布式计算 算法
大数据-106 Spark Graph X 计算学习 案例:1图的基本计算、2连通图算法、3寻找相同的用户
大数据-106 Spark Graph X 计算学习 案例:1图的基本计算、2连通图算法、3寻找相同的用户
205 0
|
7月前
|
算法 数据安全/隐私保护
基于Big-Bang-Big-Crunch(BBBC)算法的目标函数最小值计算matlab仿真
该程序基于Big-Bang-Big-Crunch (BBBC)算法,在MATLAB2022A中实现目标函数最小值的计算与仿真。通过模拟宇宙大爆炸和大收缩过程,算法在解空间中搜索最优解。程序初始化随机解集,经过扩张和收缩阶段逐步逼近全局最优解,并记录每次迭代的最佳适应度。最终输出最佳解及其对应的目标函数最小值,并绘制收敛曲线展示优化过程。 核心代码实现了主循环、粒子位置更新、适应度评估及最优解更新等功能。程序运行后无水印,提供清晰的结果展示。
156 14
|
12月前
|
JSON 算法 数据可视化
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
这篇文章是关于如何通过算法接口返回的目标检测结果来计算性能指标的笔记。它涵盖了任务描述、指标分析(包括TP、FP、FN、TN、精准率和召回率),接口处理,数据集处理,以及如何使用实用工具进行文件操作和数据可视化。文章还提供了一些Python代码示例,用于处理图像文件、转换数据格式以及计算目标检测的性能指标。
270 0
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
|
11月前
|
JSON 算法 数据挖掘
基于图论算法有向图PageRank与无向图Louvain算法构建指令的方式方法 用于支撑qwen agent中的统计相关组件
利用图序列进行数据解读,主要包括节点序列分析、边序列分析以及结合节点和边序列的综合分析。节点序列分析涉及节点度分析(如入度、出度、度中心性)、节点属性分析(如品牌、价格等属性的分布与聚类)、节点标签分析(如不同标签的分布及标签间的关联)。边序列分析则关注边的权重分析(如关联强度)、边的类型分析(如管理、协作等关系)及路径分析(如最短路径计算)。结合节点和边序列的分析,如子图挖掘和图的动态分析,可以帮助深入理解图的结构和功能。例如,通过子图挖掘可以发现具有特定结构的子图,而图的动态分析则能揭示图随时间的变化趋势。这些分析方法结合使用,能够从多个角度全面解读图谱数据,为决策提供有力支持。
445 0
|
17天前
|
传感器 机器学习/深度学习 编解码
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
127 3
|
22天前
|
存储 编解码 算法
【多光谱滤波器阵列设计的最优球体填充】使用MSFA设计方法进行各种重建算法时,图像质量可以提高至多2 dB,并在光谱相似性方面实现了显著提升(Matlab代码实现)
【多光谱滤波器阵列设计的最优球体填充】使用MSFA设计方法进行各种重建算法时,图像质量可以提高至多2 dB,并在光谱相似性方面实现了显著提升(Matlab代码实现)
|
11天前
|
机器学习/深度学习 算法 数据可视化
基于MVO多元宇宙优化的DBSCAN聚类算法matlab仿真
本程序基于MATLAB实现MVO优化的DBSCAN聚类算法,通过多元宇宙优化自动搜索最优参数Eps与MinPts,提升聚类精度。对比传统DBSCAN,MVO-DBSCAN有效克服参数依赖问题,适应复杂数据分布,增强鲁棒性,适用于非均匀密度数据集的高效聚类分析。

热门文章

最新文章

下一篇
oss教程