Tugraph Analytics图计算快速上手之紧密中心度算法

本文涉及的产品
实时计算 Flink 版,1000CU*H 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时数仓Hologres,5000CU*H 100GB 3个月
简介: 紧密中心度(Closeness Centrality)计量了一个节点到其他所有节点的紧密性,即该节点到其他节点的距离的倒数;节点对应的值越高表示紧密性越好,能够在图中传播信息的能力越强,可用以衡量信息流入或流出该节点的能力,多用与社交网络中关键节点发掘等场景。

作者:张武科

概述

紧密中心度(Closeness Centrality)计量了一个节点到其他所有节点的紧密性,即该节点到其他节点的距离的倒数;节点对应的值越高表示紧密性越好,能够在图中传播信息的能力越强,可用以衡量信息流入或流出该节点的能力,多用与社交网络中关键节点发掘等场景。

算法介绍

对于图中一个给定节点,紧密性中心性是该节点到其他所有节点的最小距离和的倒数:
1.jpg

其中,u表示待计算紧密中心度的节点,d(u, v)表示节点u到节点v的最短路径距离;实际场景中,更多地使用归一化后的紧密中心度,即计算目标节点到其他节点的平均距离的倒数:
2.jpg

其中,n表示图中节点数。

算法实现

首先,基于AlgorithmUserFunction接口实现ClosenessCentrality,如下:

@Description(name = "closeness_centrality", description = "built-in udga for ClosenessCentrality")
public class ClosenessCentrality implements AlgorithmUserFunction<Long, Long> {
   
   

    private AlgorithmRuntimeContext context;
    private long sourceId;

    @Override
    public void init(AlgorithmRuntimeContext context, Object[] params) {
   
   
        this.context = context;
        if (params.length != 1) {
   
   
            throw new IllegalArgumentException("Only support one arguments, usage: func(sourceId)");
        }
        this.sourceId = ((Number) params[0]).longValue();
    }

    @Override
    public void process(RowVertex vertex, Iterator<Long> messages) {
   
   
        List<RowEdge> edges = context.loadEdges(EdgeDirection.OUT);
        if (context.getCurrentIterationId() == 1L) {
   
   
            context.sendMessage(vertex.getId(), 1L);
            context.sendMessage(sourceId, 1L);
        } else if (context.getCurrentIterationId() == 2L) {
   
   
            context.updateVertexValue(ObjectRow.create(0L, 0L));
            if (vertex.getId().equals(sourceId)) {
   
   
                long vertexNum = -2L;
                while (messages.hasNext()) {
   
   
                    messages.next();
                    vertexNum++;
                }
                // 统计节点数
                context.updateVertexValue(ObjectRow.create(0L, vertexNum));
                // 向邻接点发送与目标点距离
                sendMessageToNeighbors(edges, 1L);
            }
        } else {
   
   
            if (vertex.getId().equals(sourceId)) {
   
   
                long sum = (long) vertex.getValue().getField(0, LongType.INSTANCE);
                while (messages.hasNext()) {
   
   
                    sum += messages.next();
                }
                long vertexNum = (long) vertex.getValue().getField(1, LongType.INSTANCE);
                // 记录最短距离和
                context.updateVertexValue(ObjectRow.create(sum, vertexNum));
            } else {
   
   
                if (((long) vertex.getValue().getField(1, LongType.INSTANCE)) < 1) {
   
   
                    Long meg = messages.next();
                    context.sendMessage(sourceId, meg);
                    // 向邻接点发送与目标点距离
                    sendMessageToNeighbors(edges, meg + 1);
                    // 标记该点已向目标点发送过消息
                    context.updateVertexValue(ObjectRow.create(0L, 1L));
                }
            }
        }
    }

    private void sendMessageToNeighbors(List<RowEdge> outEdges, Object message) {
   
   
        for (RowEdge rowEdge : outEdges) {
   
   
            context.sendMessage(rowEdge.getTargetId(), message);
        }
    }

    @Override
    public void finish(RowVertex vertex) {
   
   
        if (vertex.getId().equals(sourceId)) {
   
   
            long len = (long) vertex.getValue().getField(0, LongType.INSTANCE);
            long num = (long) vertex.getValue().getField(1, LongType.INSTANCE);
            context.take(ObjectRow.create(vertex.getId(), (double) num / len));
        }
    }

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

然后,可在 DSL 中引入自定义算法,直接调用使用,语法形式如下:

CREATE Function closeness_centrality AS 'com.antgroup.geaflow.dsl.udf.ClosenessCentrality';

INSERT INTO tbl_result
CALL closeness_centrality(1) YIELD (vid, ccValue)
RETURN vid, ROUND(ccValue, 3)
;

示例表示,计算图中 id = 1节点的紧密中心度。

算法运行

在运行算法之前,要构造算法运行的底图数据。

图定义

首先,进行图定义:

CREATE GRAPH modern (
    Vertex person (
      id bigint ID,
      name varchar,
      age int
    ),
    Vertex software (
      id bigint ID,
      name varchar,
      lang varchar
    ),
    Edge knows (
      srcId bigint SOURCE ID,
      targetId bigint DESTINATION ID,
      weight double
    ),
    Edge created (
      srcId bigint SOURCE ID,
      targetId bigint DESTINATION ID,
      weight double
    )
) WITH (
    storeType='rocksdb',
    shardNum = 1
);

图构建

完成图定义之后,导入点边数据,构造数据底图:

CREATE TABLE modern_vertex (
  id varchar,
  type varchar,
  name varchar,
  other varchar
) WITH (
  type='file',
  geaflow.dsl.file.path = 'resource:///data/modern_vertex.txt'
);

CREATE TABLE modern_edge (
  srcId bigint,
  targetId bigint,
  type varchar,
  weight double
) WITH (
  type='file',
  geaflow.dsl.file.path = 'resource:///data/modern_edge.txt'
);

INSERT INTO modern.person
SELECT cast(id as bigint), name, cast(other as int) as age
FROM modern_vertex WHERE type = 'person'
;

INSERT INTO modern.software
SELECT cast(id as bigint), name, cast(other as varchar) as lang
FROM modern_vertex WHERE type = 'software'
;

INSERT INTO modern.knows
SELECT srcId, targetId, weight
FROM modern_edge WHERE type = 'knows'
;

INSERT INTO modern.created
SELECT srcId, targetId, weight
FROM modern_edge WHERE type = 'created'
;

计算输出

最后,在底图数据上完成算法计算和结果输出;

CREATE TABLE tbl_result (
  vid int,
    ccValue double
) WITH (
    type='file',
    geaflow.dsl.file.path='/tmp/result'
);

CREATE Function closeness_centrality AS 'com.antgroup.geaflow.dsl.udf.ClosenessCentrality';

USE GRAPH modern;

INSERT INTO tbl_result
CALL closeness_centrality(1) YIELD (vid, ccValue)
RETURN vid, ROUND(ccValue, 3)
;

运行示例

  • input
    ```sql
    // vertex
    1,person,marko,29
    2,person,vadas,27
    3,software,lop,java
    4,person,josh,32
    5,software,ripple,java
    6,person,peter,35

// edge
1,3,created,0.4
1,2,knows,0.5
1,4,knows,1.0
4,3,created,0.4
4,5,created,1.0
3,6,created,0.2


- output
```sql
// result
1,0.714

结语

在本篇文章中我们介绍了如何在TuGraph Analytics上实现紧密中心度算法,如果你觉得比较有趣,欢迎关注我们的社区(https://github.com/TuGraph-family/tugraph-analytics)。开源不易,如果你觉得还不错,可以给我们star支持一下~


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的通信效率与资源利用率。预览效果无水印,核心程序部分展示,适合研究频谱感知与优化算法的学者参考。
|
存储 分布式计算 算法
大数据-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
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
|
算法 数据可视化 数据安全/隐私保护
基于LK光流提取算法的图像序列晃动程度计算matlab仿真
该算法基于Lucas-Kanade光流方法,用于计算图像序列的晃动程度。通过计算相邻帧间的光流场并定义晃动程度指标(如RMS),可量化图像晃动。此版本适用于Matlab 2022a,提供详细中文注释与操作视频。完整代码无水印。
|
算法 C++
如何精确计算出一个算法的CPU运行时间?
如何精确计算出一个算法的CPU运行时间?
|
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教程