知识图谱(4)图算法

2023-09-20 16:56:17

基于图有很多任务,比如:

  • 节点分类:预测哪些网站是诈骗网站;
  • 关系预测:判断图中两个节点的关系;
  • 图分类:分子性质预测;
  • 聚类:社交网络分析,将相似用户聚类在一起,再推荐适合该簇的商品;
  • 图生成:药物分子生成,药物发现;

图基础内容

节点的度:节点的边的数量。对于有向图,度还可以分为入度和出度。
fig1
其中,C节点的度为3,入度为2,出度为1。对于上面的图,有7个节点,可以得到一个度矩阵,度矩阵只在对角线上有值,分别为7个节点的度。

邻接矩阵用于表示整个图的权重连接关系。度矩阵通常用 D D D表示,邻接矩阵通常用 A A A表示。无向图的邻接矩阵是沿着对角线对称的。

图遍历

深度优先

  • 从图中某个初始顶点 v v v出发,首先访问初始顶点 v v v
  • 选择一个与顶点 v v v相邻且没有被访问过的顶点 w w w,再从 w w w出发进行深度优先搜索,直到图中与当前顶点 v v v相邻的所有顶点都被访问过为止。

广度优先

  • 从图中某个初始顶点 v v v出发,首先访问初始顶点 v v v
  • 接着访问 v v v的所有未被访问过的相邻顶点 v 1 , . . . , v t v_1,...,v_t v1,...,vt;按照 v 1 , . . . , v t v_1,...,v_t v1,...,vt的次序,访问每一个顶点的所有未被访问过的相邻顶点;
  • 直到访问过所有顶点为止。

DFS和BFS的举例如下:
fig2

Dijkstra是一种求解最短路径的算法,其本质是一个贪心算法,因此可能无法求得全局最优解,时间复杂度为 O ( n 2 ) O(n^2) O(n2)。详细见其他算法-Dijkstra

初始化一个数组dis来保存源点到各个顶点的最短距离,和一个保存已经找到了最短路径的顶点的集合T,初始时,原点s的路径权重被赋为 0 ,若对于顶点s存在能直接到达的边(s,m),则把dis[m]设为w(s,m),同时把所有其他顶点的路径长度设为无穷大。初始时,集合T只有顶点s。然后,从dis数组选择最小值,则该值就是源点s到该值对应的顶点的最短路径,并且把该点加入到T中,然后,我们需要看看新加入的顶点是否可以到达其他顶点并且看看通过该顶点到达其他点的路径长度是否比源点直接到达短,如果是,那么就替换这些顶点在dis中的值。然后,又从dis中找出最小值,重复上述动作,直到T中包含了图的所有顶点。

Floyd也是一种最短路径算法。首先,根据节点的边的权重,初始化一个矩阵,用于记录初始情况下的最短路径,然后分别计算允许通过其他节点时的最短路径,直到遍历完所有的情况。

图聚类

模块度Modularily用于衡量一个社区的紧密度,一个节点如果加入某个社区让模块度变大,则该节点属于这个社区。 M = 1 2 m ∑ i j [ A i j − k i k j 2 m ] U ( c i , c j ) M=\frac{1}{2m}\sum_{ij}[A_{ij}-\frac{k_{i}k_{j}}{2m}]U(c_i,c_j) M=2m1ij[Aij2mkikj]U(ci,cj)其中,如果 c i = c j c_i=c_j ci=cj,则 U ( c i , c j ) = 1 U(c_i,c_j)=1 U(ci,cj)=1,如果 c i ≠ c j c_i\neq c_j ci=cj,则 U ( c i , c j ) = 0 U(c_i,c_j)=0 U(ci,cj)=0 m m m表示边的总数, A A A表示边的权重, k i k_i ki表示所有指向节点 i i i的边的权重和。

Louvain是基于模块度的社区算法,该算法在效率和效果都比较好,算法过程如下:

  • 每个点作为一个社区,然后考虑每个社区的邻居节点,再合并到社区,然后看模块度是否改变,选择模块度增益最大的邻居节点进行合并,直到社区不再改变;

谱聚类的思想是将带权无向图划分为子图,子图的内部尽可能相似,子图之间尽量远离,谱聚类分为以下步骤:

  • 计算相似度矩阵 W W W:一共 n n n个样本,计算任意两个样本之间的距离,在相似度矩阵中,两个距离近的样本相似度较高,根据相似度矩阵构建图,图的边仅保留相似度高的节点对;
  • 计算度矩阵:根据相似度矩阵构建的图计算度矩阵 D D D
  • 计算拉普拉斯矩阵: L = D − W L=D-W L=DW
  • 计算 L L L的特征值,将特征值从小到大排序,取前 k k k个特征值,并计算前 k k k个特征值的特征向量;
  • k k k个特征向量组成矩阵 U U U,维度为 n × k n\times k n×k
  • 使用K-means对 n n n个特征向量进行聚类;

谱聚类算法的主要优点有:

  • 谱聚类只需要数据之间的相似度矩阵,因此对于处理稀疏数据的聚类很有效。这点传统聚类算法比如K-Means很难做到。
  • 由于使用了降维,因此在处理高维数据聚类时的复杂度比传统聚类算法好。

谱聚类算法的主要缺点有:

  • 聚类效果依赖于相似矩阵,不同的相似矩阵得到的最终聚类效果可能很不同。

Node2Vec

Node2Vec是指对节点的embedding学习。一种直接的想法是采用和Word2Vec一样的字典式方式。

从图的结构直观看,两个节点的embedding相似应该出现在以下情况:节点相连,两节点具有同样的邻居,两个节点处在相似结构的子图中。

随机游走(RandomWalk)是自监督学习embedding的方法,不需要利用节点标签,也不需要利用节点特征,训练好的embedding也不依赖于特定任务,如同Word2Vec。

首先随机选择一个节点,走到该处后再随机选择一个邻居,重复length次。length是指随机游走的长度。使用随机游走从起始节点到终止节点的概率值,实际上可以用来表示相似度,即从 u u u节点到 v v v节点的概率值,正比于 u u u节点和 v v v节点embedding点乘的结果: z v T z u ∝ P ( v ∣ u ) z_{v}^{T}z_{u}\propto P(v|u) zvTzuP(vu)给定图 G = ( V , E ) G=(V,E) G=(V,E),定义 N R ( u ) N_{R}(u) NR(u)表示用策略 R R R得到 u u u的邻居节点,目标是学习一个映射关系 z : u → R d z:u\rightarrow R^{d} z:uRd,优化目标为: m a x ∑ u ∈ V l o g P ( N R ( u ) ∣ z u ) max\sum_{u\in V}log P(N_{R}(u)|z_{u}) maxuVlogP(NR(u)zu)给定 u u u的embedding z u z_{u} zu,我们希望其邻居节点出现的概率最大,最终损失函数表示为: L = − ∑ u ∈ V ∑ v ∈ N R ( u ) l o g P ( v ∣ z u ) L=-\sum_{u\in V}\sum_{v\in N_{R}(u)}logP(v|z_{u}) L=uVvNR(u)logP(vzu) P ( v ∣ z u ) = e x p ( z u T z v ) ∑ n ∈ V e x p ( z u T z n ) P(v|z_{u})=\frac{exp(z_{u}^{T}z_{v})}{\sum_{n\in V}exp(z_{u}^{T}z_{n})} P(vzu)=nVexp(zuTzn)exp(zuTzv)随机游走的每一步都是无偏游走,即走到下一个邻居节点的概率都相同,游走的结果可能会只关注局部信息类似BFS(甚至两个节点来回跳),或者只关注最深的一条路类似DFS。为了优化游走的策略,Node2Vec做出改进,这里有两个参数:

  • p p p用来控制返回上一个节点;
  • q q q用来控制远离上一个节点;
  • 参数的调整相当于是调整BFS或DFS的比例;

fig3
对于这个例子,假设已经穿过了边(S1,W)走到节点W,下一步的路径概率如下:

  • 如果是返回原节点,则概率为 1 / p 1/p 1/p
  • 如果是远离原节点,则概率为 1 / q 1/q 1/q
  • 如果下一步节点和原节点距离与(S1,W)一样,则概率为1;

显然,如果我们想采用BFS,那么只需要调低 p p p的值,如果想采取DFS,只需要调低 q q q的值。这样游走的过程中,我们就可以自由的控制是想得到更多的局部信息还是全局信息。

更多推荐

金融风控建模常用指标介绍(WOE, IV, KS, PSI)

金融风控建模常用指标介绍(WOE,IV,KS,PSI)近期在做金融风控相关项目,有必要把特征和模型的衡量指标总结下,以备不时之需。这次主要介绍4个指标(WOE,IV,KS,PSI)。WOE(WeightofEvidence,用于特征变换,衡量变量某个取值的预测能力)WOE算法已在我的另一篇文章数据预处理-分箱(Binn

准备我们心爱的IDEA写Jsp

JSP学习一、准备我们心爱的IDEAnew一个项目:NewProject-->Next-->Next-->Finsh二、配置好服务器Tomcat-9.0.301.>在WEB-INF下创建一个Lib包将jsp-api.jar复制进去,并使其生效未生效前:生效过程:2.>用锤子配置汤姆猫TomCat点击+号选择本地的汤姆猫

idea中dataBase模板生成

controller.java.vm##定义初始变量#set($tableName=$tool.append($tableInfo.name,"Controller"))##设置回调$!callback.setFileName($tool.append($tableName,".java"))$!callback.se

基于ssm扶贫产品和扶贫物资捐赠系统033

大家好✌!我是CZ淡陌。一名专注以理论为基础实战为主的技术博主,将再这里为大家分享优质的实战项目,本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目,希望你能有所收获,少走一些弯路,向着优秀程序员前行!🍅更多优质项目👇🏻👇🏻可点击下方获取🍅文章底部或评论区获取🍅Java项目精品实

ELFK之zookeeper+kafka

目录kafka+zookeeper的系统架构Zookeeper一、zookeeper概述二、zookeeper特点三、zookeeper选举机制四、应用场景五、zookeeper实验实例Kafka一、概述为什么需要消息队列(MQ)使用消息队列的好处消息队列的两种模式Kafka定义二、Kafka的特性三、Kafka系统架

【云原生】kubernetes中pod(最小的资源管理组件)

目录前言一、pod1.1pause容器使得Pod中的所有容器可以共享两种资源:1.2通常把Pod分为两类1.2.1自主式Pod1.2.2控制器管理的Pod1.3Pod容器的分类1.3.1基础容器(infrastructurecontainer)1.3.2初始化容器(initcontainers)1.3.3应用容器(Ma

【C/C++】指针常量、常量指针、指向常量的常指针

目录1.概念2.constpointer3.pointertoaconstant3.1(pointertoaconstant)-constant3.2poiner-constant3.3(pointertoaconstant)-variable3.4poiner-variable3.5多层级关系时的兼容3.6用处4.a

3.docker仓库(Nexus、Harbor)的安装

本文目录前言1.Aliyun镜像仓库2.Nexus1.Nexus私服搭建2.登录控制台3.配置nexus仓库4.配置nexus仓库地址为安全的镜像地址5.镜像推送至nexus仓库6.拉取nexus仓库镜像3.Harbor1.DockerCompose安装2.Harbor安装3.配置Harbor仓库地址为安全的镜像地址4

MySQL数据库管理

目录一、数据库1.1数据1.2表1.3数据库1.4数据库分类1.41关系型数据库1.42非关系型数据库1.5MySQL介绍二、SQL语句查看数据库创建数据库切换数据库创建数据表查看库中的表删除表删除库在表中插入数据查询数据表中的数据更改表中数据删除表中字段克隆表创建临时表创建主表创建从表为主表profession添加一

用 Python实现Python解释器

介绍Byterun是一个用Python实现的Python解释器。随着我对Byterun的开发,我惊喜地的发现,这个Python解释器的基础结构用500行代码就能实现。在这一章我们会搞清楚这个解释器的结构,给你足够探索下去的背景知识。我们的目标不是向你展示解释器的每个细节---像编程和计算机科学其他有趣的领域一样,你可能

LeetCode 42. 接雨水

题目链接力扣(LeetCode)官网-全球极客挚爱的技术成长平台题目解析先算出每个位置的面积,然后把每个位置的面积相加就得到了最终可以接多少雨水!每个位置的面积等于(该位置左边包括自己最大的高度)与(该位置右边包括自己最大的高度)中最小的那个数,然后减去当前位置的高度,就是当前位置可以存放的雨水。首先定义两个数组lef

热文推荐