[Datawhale][CS224W]图机器学习(五)

news2024/11/27 1:38:14

这里写目录标题

    • 一、Deepwalk
      • 1.1 预备知识
      • 1.2 Deepwalk介绍
      • 1.3 Embedding
      • 1.4 word2Vec 词向量,词嵌入
      • 1.5 random Walk随机游走
      • 1.6 DeepWalk 核心代码
        • Random Walk
        • Word2vec
        • DeepWalk应用
      • 1.7 DeepWalk优缺点
    • 二、Node2Vec
      • 2.1 图嵌入
      • 2.2 Node2Vec
        • 优化目标
        • 顶点序列采样策略
      • 2.3 理论上的实现
      • 2.4 Node2Vec代码实现
        • 学习算法
        • node2vec核心代码
        • node2vecWalk
        • 构造采样表
        • node2vec应用
      • 2.5 Node2Vec与DeepWalk相比的优点与特点
      • 2.6 Node2Vec的优缺点
  • 参考文献

一、Deepwalk

1.1 预备知识

机器学习,深度学习基础,语言模型,word2vec

1.2 Deepwalk介绍

DeepWalk的思想类似word2vec,使用图中节点与节点的共现关系来学习节点的向量表示。那么关键的问题就是如何来描述节点与节点的共现关系,DeepWalk给出的方法是使用随机游走(RandomWalk)的方式在图中进行节点采样。

D e e p w a l k Deepwalk Deepwalk g r a p h graph graph的每一个节点编码为一个 D D D维向量(Embedding)(无监督学习)

Embedding中隐式包含了 G r a p h Graph Graph中的社群,连接,结构信息,可用于后续节点分类等下游任务(监督学习)

image-20230222142856728

Deepwalk通过套用随机游走(Random walk generation)将图像转化为D维向量

image-20230222153354939

1.3 Embedding

我们需要将图转化为计算机了解的向量,所以我们需要使用embedding

image-20230222143330826

1.4 word2Vec 词向量,词嵌入

word2vec通过语料库中的句子序列来描述词与词的共现关系,进而学习到词语的向量表示。

主要有两种方法

CBOW:用边缘词去预测中心词

Skip-gram:用输入的中心词去预测周围词

image-20230222143852663

1.5 random Walk随机游走

RandomWalk是一种可重复访问已访问节点的深度优先遍历算法。给定当前访问起始节点,从其邻居中随机采样节点作为下一个访问节点,重复此过程,直到访问序列长度满足预设条件。

获取足够数量的节点访问序列后,使用skip-gram model 进行向量学习。

img

具体见[[Datawhale][CS224W]图机器学习(四)](https://blog.csdn.net/weixin_45856170/article/details/129070015)

1.6 DeepWalk 核心代码

DeepWalk算法主要包括两个步骤,第一步为随机游走采样节点序列,第二步为使用skip-gram modelword2vec学习表达向量。

①构建同构网络,从网络中的每个节点开始分别进行Random Walk 采样,得到局部相关联的训练数据; ②对采样数据进行SkipGram训练,将离散的网络节点表示成向量化,最大化节点共现,使用Hierarchical Softmax来做超大规模分类的分类器

Random Walk

我们可以通过并行的方式加速路径采样,在采用多进程进行加速时,相比于开一个进程池让每次外层循环启动一个进程,我们采用固定为每个进程分配指定数量的num_walks的方式,这样可以最大限度减少进程频繁创建与销毁的时间开销。

deepwalk_walk方法对应上一节伪代码中第6行,_simulate_walks对应伪代码中第3行开始的外层循环。最后的Parallel为多进程并行时的任务分配操作。

def deepwalk_walk(self, walk_length, start_node):

    walk = [start_node]

    while len(walk) < walk_length:
        cur = walk[-1]
        cur_nbrs = list(self.G.neighbors(cur))
        if len(cur_nbrs) > 0:
            walk.append(random.choice(cur_nbrs))
        else:
            break
    return walk

def _simulate_walks(self, nodes, num_walks, walk_length,):
    walks = []
    for _ in range(num_walks):
        random.shuffle(nodes)
        for v in nodes:           
            walks.append(self.deepwalk_walk(alk_length=walk_length, start_node=v))
    return walks

results = Parallel(n_jobs=workers, verbose=verbose, )(
    delayed(self._simulate_walks)(nodes, num, walk_length) for num in
    partition_num(num_walks, workers))

walks = list(itertools.chain(*results))

Word2vec

这里就偷个懒直接用gensim里的Word2Vec了。

from gensim.models import Word2Vec
w2v_model = Word2Vec(walks,sg=1,hs=1)

DeepWalk应用

G = nx.read_edgelist('../data/wiki/Wiki_edgelist.txt',create_using=nx.DiGraph(),nodetype=None,data=[('weight',int)])

model = DeepWalk(G,walk_length=10,num_walks=80,workers=1)
model.train(window_size=5,iter=3)
embeddings = model.get_embeddings()

evaluate_embeddings(embeddings)
plot_embeddings(embeddings)

1.7 DeepWalk优缺点

  1. 优点
    • 首个将深度学习和自然语言处理的思想用于图机器学习
    • 在系数标注节点分类场景下,嵌入性能卓越
  2. 缺点
    • 均匀随机游走,没有偏向的游走方向(Node2Vec)
    • 需要大量随机游走序列训练
    • 基于随机游走,管中窥豹。距离较远的两个节点无法相互影响。看不到全图信息。(图神经网络)
    • 无监督,仅编码图的连接信息,没有利用节点的属性特征
    • 没有真正用到神经网络和深度学习

二、Node2Vec

2.1 图嵌入

将数据转化为D维连续稠密的向量,包含了原来的节点的多种信息

image-20230222153010863

image-20230222153329769

2.2 Node2Vec

优化目标

f ( u ) f(u) f(u)是将顶点 u u u 映射为embedding向量的映射函数,对于图中每个顶点 u u u,定义 N s ( u ) N_s(u) Ns(u) 为通过采样策略 S S S采样出的顶点 u u u的近邻顶点集合。

node2vec优化的目标是给定每个顶点条件下,令其近邻顶点(如何定义近邻顶点很重要)出现的概率最大。

m a x f ∑ u ∈ V l o g P r ( N s ( U ) ∣ f ( u ) ) max_f\sum_{u\in V}log Pr(N_s(U)|f(u)) maxfuVlogPr(Ns(U)f(u))

为了将上述最优化问题可解,文章提出两个假设:

  • 条件独立性假设

假设给定源顶点下,其近邻顶点出现的概率与近邻集合中其余顶点无关。 P r ( N s ( u ) ∣ f ( u ) ) = ∏ n i ∣ f ( u ) P r ( n i ∣ f ( u ) ) Pr(N_s(u)|f(u))=\prod_{n_i|f(u)}Pr(n_i|f(u)) Pr(Ns(u)f(u))=nif(u)Pr(nif(u))

  • 特征空间对称性假设

这里是说一个顶点作为源顶点和作为近邻顶点的时候共享同一套embedding向量。(对比LINE中的2阶相似度,一个顶点作为源点和近邻点的时候是拥有不同的embedding向量的) 在这个假设下,上述条件概率公式可表示为 P r ( n i ∣ f ( u ) ) = e x p f ( n i ) ⋅ f ( u ) ∑ v ∈ V e x p f ( v ) ⋅ f ( u ) Pr(n_i|f(u))={expf(n_i)\cdot f(u)}\over{\sum_{v\in V}expf(v)\cdot f(u)} vVexpf(v)f(u)Pr(nif(u))=expf(ni)f(u)

根据以上两个假设条件,最终的目标函数表示为image-20230222163604126

由于归一化因子 image-20230222163615301的计算代价高,所以采用负采样技术优化。

顶点序列采样策略

node2vec依然采用随机游走的方式获取顶点的近邻序列,不同的是node2vec采用的是一种有偏的随机游走。

给定当前顶点 v ,访问下一个顶点 x 的概率为

img

π v x \pi_{vx} πvx 是顶点 v 和顶点 x 之间的未归一化转移概率, Z 是归一化常数。

node2vec引入两个超参数 p 和 q 来控制随机游走的策略,假设当前随机游走经过边 (t,v) 到达顶点 �v设 image-20230222163711950 ω v x \omega_{vx} ωvx 是顶点 v 和 x 之间的边权,

img

d t x d_{tx} dtx为顶点 t 和顶点 x 之间的最短路径距离。

下面讨论超参数 p 和 q 对游走策略的影响

  • Return parameter,p

参数p控制重复访问刚刚访问过的顶点的概率。 注意到p仅作用于 d t x d_{tx} dtx=0 的情况,而 d t x d_{tx} dtx=0 表示顶点 x 就是访问当前顶点 v 之前刚刚访问过的顶点。 那么若 p 较高,则访问刚刚访问过的顶点的概率会变低,反之变高。

  • In-out papameter,q

q 控制着游走是向外还是向内,若 q>1 ,随机游走倾向于访问和 t 接近的顶点(偏向BFS)。若 q<1 ,倾向于访问远离 t 的顶点(偏向DFS)。

下面的图描述的是当从 t 访问到 v 时,决定下一个访问顶点时每个顶点对应的 α \alpha α

设定p,q进行有偏随机游走

image-20230222153738097

q节点小时更愿意进行BFS,p节点小时更愿意进行DFS

image-20230222153919325

2.3 理论上的实现

image-20230222154012450

2.4 Node2Vec代码实现

学习算法

采样完顶点序列后,剩下的步骤就和deepwalk一样了,用word2vec去学习顶点的embedding向量。 值得注意的是node2vecWalk中不再是随机抽取邻接点,而是按概率抽取,node2vec采用了Alias算法进行顶点采样。

Alias Method:时间复杂度O(1)的离散采样方法125 赞同 · 23 评论文章img

node2vec核心代码

img

node2vecWalk

通过上面的伪代码可以看到,node2vec和deepwalk非常类似,主要区别在于顶点序列的采样策略不同,所以这里我们主要关注node2vecWalk的实现。

由于采样时需要考虑前面2步访问过的顶点,所以当访问序列中只有1个顶点时,直接使用当前顶点和邻居顶点之间的边权作为采样依据。 当序列多余2个顶点时,使用文章提到的有偏采样。

def node2vec_walk(self, walk_length, start_node):
    G = self.G    
    alias_nodes = self.alias_nodes    
    alias_edges = self.alias_edges
    walk = [start_node]
    while len(walk) < walk_length:        
        cur = walk[-1]        
        cur_nbrs = list(G.neighbors(cur))        
        if len(cur_nbrs) > 0:            
            if len(walk) == 1:                
                walk.append(cur_nbrs[alias_sample(alias_nodes[cur][0], alias_nodes[cur][1])])            
            else:                
                prev = walk[-2]                
                edge = (prev, cur)                
                next_node = cur_nbrs[alias_sample(alias_edges[edge][0],alias_edges[edge][1])]                
                walk.append(next_node)        
        else:            
            break
    return walk

构造采样表

preprocess_transition_probs分别生成alias_nodesalias_edgesalias_nodes存储着在每个顶点时决定下一次访问其邻接点时需要的alias表(不考虑当前顶点之前访问的顶点)。alias_edges存储着在前一个访问顶点为 t ,当前顶点为 v 时决定下一次访问哪个邻接点时需要的alias表。

get_alias_edge方法返回的是在上一次访问顶点 t ,当前访问顶点为 v 时到下一个顶点 x 的未归一化转移概率 image-20230222164222830

def get_alias_edge(self, t, v):
    G = self.G    
    p = self.p    
    q = self.q
    unnormalized_probs = []    
    for x in G.neighbors(v):        
        weight = G[v][x].get('weight', 1.0)# w_vx        
        if x == t:# d_tx == 0            
            unnormalized_probs.append(weight/p)        
        elif G.has_edge(x, t):# d_tx == 1            
            unnormalized_probs.append(weight)        
        else:# d_tx == 2            
            unnormalized_probs.append(weight/q)    
    norm_const = sum(unnormalized_probs)    
    normalized_probs = [float(u_prob)/norm_const for u_prob in unnormalized_probs]
    return create_alias_table(normalized_probs)

def preprocess_transition_probs(self):
    G = self.G
    alias_nodes = {}    
    for node in G.nodes():        
        unnormalized_probs = [G[node][nbr].get('weight', 1.0) for nbr in G.neighbors(node)]        
        norm_const = sum(unnormalized_probs)        
        normalized_probs = [float(u_prob)/norm_const for u_prob in unnormalized_probs]                 
        alias_nodes[node] = create_alias_table(normalized_probs)
    alias_edges = {}
    for edge in G.edges():        
        alias_edges[edge] = self.get_alias_edge(edge[0], edge[1])
    self.alias_nodes = alias_nodes    
    self.alias_edges = alias_edges
    return

node2vec应用

使用node2vec在wiki数据集上进行节点分类任务和可视化任务。 wiki数据集包含 2,405 个网页和17,981条网页之间的链接关系,以及每个网页的所属类别。 通过简单的超参搜索,这里使用p=0.25,q=4的设置。

G = nx.read_edgelist('../data/wiki/Wiki_edgelist.txt',create_using=nx.DiGraph(),nodetype=None,data=[('weight',int)])

model = Node2Vec(G,walk_length=10,num_walks=80,p=0.25,q=4,workers=1)
model.train(window_size=5,iter=3)    
embeddings = model.get_embeddings()

evaluate_embeddings(embeddings)
plot_embeddings(embeddings)

2.5 Node2Vec与DeepWalk相比的优点与特点

  1. 优点
    • Node2Vec解决图嵌入问题,将图中的每个节点映射为一个向量(嵌入)
    • 向量(嵌入)包含了节点的语义信息(相邻社群和功能角色)
    • 语义相似的节点,向量(嵌入)的距离也近。
    • 向量(嵌入)用于后续的分类,聚类,link Predictin,推荐等任务。
  2. 特点
    • 在DeepWalk完全随机游走的基础上,Node2Vec增加p,q参数,实现有偏随机游走。不同的p,q组合,对应了不同的探索范围和节点语义。
    • DFS深度优先探索,相邻的节点,向量(嵌入)距离相近
    • BFS广度优先探索,相同功能角色的节点,向量(嵌入)距离相近。
    • DeepWalk时Node2Vec在p=1,q=1的特例

2.6 Node2Vec的优缺点

  1. 优点
    • 首次通过调节p,q值,实现了有偏随机游走,探索节点社群,功能等不同属性
    • 首次将节点分类用于Link Prediction
    • 可解释性,可扩展性好,性能卓越
  2. 缺点
    • 需要大量随机游走序列训练
    • 距离较远的两个界定啊无法直接相互影响。看不到全图信息。(图神经网络)
    • 无监督,仅编码图的连接信息,没有利用节点的属性特征(图卷积)
    • 没有真正用到神经网络和深度学习

参考文献

[1] 斯坦福CS224W图机器学习、图神经网络、知识图谱【同济子豪兄】

[2] 【Graph Embedding】DeepWalk:算法原理,实现和应用

[3] 【Graph Embedding】node2vec:算法原理,实现和应用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/364761.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

固态继电器控制电路

固态继电器控制电路 固态继电器&#xff08;SSR&#xff09;的种类和型号很多&#xff0c;因此其输入控制方法和控制电路也相应众多。固态继电器&#xff08;SSR&#xff09;的共同特点在于驱动电流或驱动电压小&#xff0c;即只需输入一个小信号即可控制SSR的开关。 如果需要…

瞎更新,container_cpu_usage_seconds_total{job=“cadvisor“} 怎么没有啦

一、 基本介绍 1.1 概论 1.1.1 故事背景 今天在同步其他团队的 grafana 监控大盘时&#xff0c;Prometheus 服务报告说不能找到名为 container_cpu_usage_seconds_total{job“cadvisor”} 的指标&#xff0c;一般来说可能有几个原因。 可能是 Prometheus 服务没开启prometh…

leaflet 实现极地标线地图,加载tileLayer.wms数据(088)

第088个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中实现极地标线地图,加载tileLayer.wms数据。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共93行)安装插件专栏目标相关API参考:示例效果…

什么是API?(详细解说)

编程资料时经常会看到API这个名词&#xff0c;网上各种高大上的解释估计放倒了一批初学者。初学者看到下面这一段话可能就有点头痛了。 API&#xff08;Application Programming Interface,应用程序编程接口&#xff09;是一些预先定义的函数&#xff0c;目的是提供应用程序与开…

超详细的阿里java岗社招知识点整理,常考知识点全在这里了

常考知识点 1、java的基本数据类型与包装类&#xff1b; 2、final修饰变量类方法&#xff1b; 3、String为什么是不可变的&#xff0c;以及new String(“abc”)创建了几个对象&#xff1b; 4、String、StringBuffer、以及StringBuilder的区别&#xff1b; 5、static修饰变…

金融BI分析的价值

众所周知&#xff0c;金融行业从信息化时代起&#xff0c;就是对IT依赖程度非常高的&#xff0c;也是最严苛的。进入到数字化时代&#xff0c;金融机构越来越注重技术创新&#xff0c;BI工具也越来越受到重视。利用BI工具&#xff0c;金融机构可以更快、更准确地获得有关市场信…

2023年1月用户体验GX评测:商业银行抢抓新春营销旺季,多措并举持续提升用户体验

易观&#xff1a;2023年1月正值中国传统春节营销旺季&#xff0c;各家银行充分发挥手机银行的优势&#xff0c;积极探索新春营销新模式&#xff0c;为客户提供极富特色的“开门红”线上营销活动&#xff0c;提升用户参与积极性&#xff0c;在用户体验上积极探索&#xff0c;增强…

真香!Linux 原来是这么管理内存的

Linux 内存管理模型非常直接明了&#xff0c;因为 Linux 的这种机制使其具有可移植性并且能够在内存管理单元相差不大的机器下实现 Linux&#xff0c;下面我们就来认识一下 Linux 内存管理是如何实现的。 一&#xff0c;基本概念 每个 Linux 进程都会有地址空间&#xff0c;这…

基于莱维飞行改进粒子群优化的长短期神经网络ispso-lstm的客流量预测,ISPSO-LSTM,神经网络1000案例之16

目录 摘要 背影 改进思路 shubett测试函数 函数代码 函数图像 测试ispso算法性能 测试代码 测试效果图像 ispso-lstm客流量预测 代码 测试效果 分析 展望 摘要 针对基本粒子群算法容易发生早熟收敛,陷入局部最优,等缺点,提出了基于莱维飞行的改进粒子群算法.在粒子位置更新公…

《计算机网络:自顶向下方法》实验5:TCP

Q1 包含HTTP POST消息的TCP报文段的序号是多少?注意:为了发现POST 命令, 你需要在wireshark底部的报文内容域窗口中去查找,查找数据中包含 “POST”的段。 如图所示,由报文中的POST 和 HTTP/1.1可知,其包含HTTP POST消息; TCP报文段的序号可见TCP报文: Sequence Number:…

win10输入法设置在哪里?对于输入法设置的图文教程

使用电脑打字&#xff0c;那么我们就会用到输入法。对于Windows电脑输入法的设置&#xff0c;很多用户都不知道如何调整。实际上&#xff0c;输入法设置就在“语言”选项里面&#xff0c;想要知道win10输入法设置的操作步骤&#xff0c;那就跟着小编的步伐来看看吧&#xff01;…

win10下 WSL2安装及配置

目录 一. Windows中WSL2&#xff08;子系统&#xff09;安装前提条件 二. Windows中WSL2&#xff08;子系统&#xff09;安装步骤&#xff08;默认安装C盘&#xff09; 选择包安装模式(选择到其他盘安装) 三. Windows中WSL2&#xff08;子系统&#xff09;设置默认root用户登…

数据结构——复杂度的详解(空间复杂度和时间复杂度)

1.程序算法效率 1.1什么是算法&#xff1f; 算法&#xff08;Algorithm&#xff09;是指解题方案的准确而完整的描述&#xff0c;是一系列解决问题的清晰指令&#xff0c;算法代表着用系统的方法描述解决问题的策略机制。 1.2衡量算法好坏的标准 这是一个通过函数递归算法实…

轻量级权限框架之-Sa-ToKen

轻量级的权限认证框架 Sa-Token 目前主要五大功能模块&#xff1a;登录认证、权限认证、单点登录、OAuth2.0、微服务鉴权 登录认证 —— 单端登录、多端登录、同端互斥登录、七天内免登录 权限认证 —— 权限认证、角色认证、会话二级认证 Session会话 —— 全端共享Session、…

Hadoop3 集群搭建

测试环境 信息内容主机版本centos7机器数量3台Hadoop版本3.3.4安装包解压路径/home/tools/hadoop/ hosts配置 主机ip地址对应主机host192.168.57.188node1192.168.57.189node2192.168.57.190node3 一. 前置环境准备 安装JDK1.8(Hadoop支持1.8)创建非root用户(这里用的myuser…

关于企业文档能力开放,你想知道的都在这里了

最近一个朋友向我请教关于企业文档能力开放的事&#xff0c;说了一大堆的问题&#xff0c;我是做技术的&#xff0c;有很多基础知识和理论要向同行学习&#xff0c;所以给他解答了一通&#xff0c;但是朋友觉得解释的没啥实际用处。。。其实这个能力对很多人来说可能都不太明白…

MYBatis-Plus常用注解@TableName、@TableId、@TableField、@TableLogic

1-1&#xff1a;TableName 注解作用&#xff1a;设置实体类对应的表明 value作用&#xff1a;value指定数据库中的表名 如果我们不设置这个注解&#xff0c;我们操作的数据库的表就由BaseMapper 泛型决定&#xff08;SysLog&#xff09; TableName(value "sys_Log&qu…

学习动漫插画的网络班排行榜

很多小伙伴不知道动漫插画培训机构哪个好&#xff0c;找不到靠谱的插画班&#xff0c;今天给大家整理了国内动漫插画培训机构排名&#xff01; 一&#xff1a;动漫插画培训机构排名 1、轻微课&#xff08;五颗星&#xff09; 主打课程有日系插画、游戏原画、古风插画、动漫漫画…

python基于vue个人家庭理财记账管理系统

近年来在计算机的迅速发展的背景下&#xff0c;家庭理财领域与传统手工记账相比&#xff0c;使用计算机系统来管理不仅克服了地域上的局限性&#xff0c;而且增强了用户在时间和空间上的体验&#xff0c;以及能够让用户随时随地进行需要的操作&#xff0c;可以很好的规避传统的…

【建议收藏】Jenkins+postman+newman之API全自动化测试

1 背景 本文要介绍的环境在我司已经投入使用&#xff0c;举个简单的真实使用场景&#xff0c;开发提供了300多个API&#xff0c;每个API都有各种参数&#xff0c;所以我们会先在postman中为这300多个API编写300*n个testcase&#xff0c;然后在jenkins上跑&#xff1b;到此有人…