【Graph Net学习】DeepWalk/Node2Vec实现Graph Embedding

news2025/2/23 17:43:19

一、简介

        本文主要通过代码实战介绍基础的两种图嵌入方式DeepWalk、Node2Vec。

        DeepWalk(KDD 2014)首个影响至今的图的Embedding算法,DeepWalk算法是一种用于学习节点表示的方法,常用于网络图中的节点的嵌入表示。

模型目标输入输出
Word2VecWordSentenceWord Embedding
DeepWalkNodeNode SequenceNode Embedding

        算法流程:

        1.首先,DeepWalk算法会从一个随机的起始节点开始,比如说选择朋友A作为起点。然后,算法会从A的邻居节点中随机选择一个节点,比如说选择了B。接着,算法会再从B的邻居节点中随机选择一个节点,比如说选择了C。这样反复进行直到达到事先设定的步数。

        2.一旦完成了一次类似于“走迷宫”的遍历,DeepWalk算法会将这条路径视为一句话,其中包含了A、B和C三个节点。算法会重复这个过程,多次生成不同的句子。

        3.然后,DeepWalk算法会将这些句子作为文本输入给Word2Vec算法。

        Node2Vec:Node2Vec算法是一种能够学习网络节点表示的算法。它通过优化随机游走过程来最大化网络的邻域节点之间的相似度,从而得到每个节点的有效嵌入。

        算法流程:

  1. 首先,从图中的每个节点开始执行固定长度的随机游走。这个步骤旨在生成每个节点的上下文信息。随机游走的方法包括以一种偏好的方式回到先前访问的节点,或者探索之前未访问的节点。这通过参数p和q来调整,其中p控制返回预先访问节点的可能性,而q控制更偏向于访问较远的节点。

  2. 得到随机游走序列之后,使用Skip-gram模型训练节点嵌入。在Skip-gram模型中,我们试图预测节点的邻居节点。

  3. 在训练过程中,使用梯度下降等优化算法最小化预测错误,进而通过迭代更新嵌入向量,使得越相似的节点其嵌入向量越接近。

     4.最后经过这样的训练后,我们就可以获得每个节点的向量表示,这个向量反映了节点在网络中的位置和角色。

```

        直接刚代码,开箱即用。

二、代码

import torch
import numpy as np
import os
import random
import pandas as pd
import scipy.sparse as sp
from torch_geometric.data import Data
from sklearn.preprocessing import LabelEncoder
from node2vec import Node2Vec
import networkx as nx
from gensim.models import Word2Vec

def seed_everything(seed=2023):
    random.seed(seed)
    os.environ['PYTHONHASHSEED']=str(seed)
    np.random.seed(seed)
    torch.manual_seed(seed)

seed_everything()

def load_cora_data(data_path = './data/cora'):

    content_df = pd.read_csv(os.path.join(data_path,"cora.content"), delimiter="\t", header=None)
    content_df.set_index(0, inplace=True)
    index = content_df.index.tolist()
    features = sp.csr_matrix(content_df.values[:,:-1], dtype=np.float32)

    # 处理标签
    labels = content_df.values[:,-1]
    class_encoder = LabelEncoder()
    labels = class_encoder.fit_transform(labels)

    # 读取引用关系
    cites_df = pd.read_csv(os.path.join(data_path,"cora.cites"), delimiter="\t", header=None)
    cites_df[0] = cites_df[0].astype(str)
    cites_df[1] = cites_df[1].astype(str)
    cites = [tuple(x) for x in cites_df.values]
    edges = [(index.index(int(cite[0])), index.index(int(cite[1]))) for cite in cites]
    edges = np.array(edges).T

    # 构造Data对象
    data = Data(x=torch.from_numpy(np.array(features.todense())),
                edge_index=torch.LongTensor(edges),
                y=torch.from_numpy(labels))

    idx_train = range(140)
    idx_val = range(200, 500)
    idx_test = range(500, 1500)

    # 读取Cora数据集 return geometric Data格式
    def index_to_mask(index, size):
        mask = np.zeros(size, dtype=bool)
        mask[index] = True
        return mask

    data.train_mask = index_to_mask(idx_train, size=labels.shape[0])
    data.val_mask = index_to_mask(idx_val, size=labels.shape[0])
    data.test_mask = index_to_mask(idx_test, size=labels.shape[0])

    def to_networkx(data):
        edge_index = data.edge_index.to(torch.device('cpu')).numpy()
        G = nx.DiGraph()
        for src, tar in edge_index.T:
            G.add_edge(src, tar)
        return G

    networkx_data = to_networkx(data)

    return data,networkx_data

#获取数据:pyg_data:torch_geometric格式;networkx_data:networkx格式
pyg_data,networkx_data = load_cora_data()

#Node2Vec_Embedding方法
def Node2Vec_run(networkx_data, dimensions=128, walk_length=30, num_walks=200):
    # 创建一个Node2Vec对象 #dimensions=64 embedding维度, walk_length=30 游走步长, num_walks=200 游走次数, workers=4 线程数
    node2vec = Node2Vec(networkx_data, dimensions=dimensions, walk_length=walk_length, num_walks=num_walks, workers=4)

    # 训练Node2Vec模型
    model = node2vec.fit(window=10, min_count=1, batch_words=4) #获得node2vec的所有内容
    nodes = model.wv.index_to_key  # 得到所有节点的名字
    embeddings = model.wv[nodes]  # 得到所有节点的嵌入向量
    return model,nodes,embeddings

def DeepWalk_run(networkx_data,dimensions = 128, walk_length = 30, num_walks = 200):
    # 使用deepwalk算法进行graph embedding
    # DeepWalk算法
    def deepwalk(graph, num_walks, walk_length):
        walks = []
        for node in graph.nodes():
            if graph.degree(node) == 0:
                continue
            for _ in range(num_walks):
                walk = [node]
                target = node
                for _ in range(walk_length - 1):
                    if len(list(graph.neighbors(target))) == 0:  # 判断当前节点是否有邻居,如果为空邻居,则跳过当前节点
                        continue
                    target = random.choice(list(graph.neighbors(target)))
                    walk.append(target)
                walks.append(walk)
        return walks
    walks = deepwalk(networkx_data, num_walks = num_walks, walk_length = walk_length)
    # 用Word2Vec训练节点向量
    model = Word2Vec(walks, vector_size=dimensions, window=5, min_count=0, sg=1) #参数sg=1表示选择Skip-Gram模型  window 影响着Word2Vec中词和其上下文词的最大距离
    nodes = model.wv.index_to_key  # 得到所有节点的名字
    embeddings = model.wv[nodes]  # 得到所有节点的嵌入向量
    return model,nodes,embeddings

_,_,node2vec_embeddings = Node2Vec_run(networkx_data,num_walks=1)
print("node2vec_embeddings :",np.array(node2vec_embeddings).shape) # print : "node2vec_embeddings : (2708, 64)"

_,_,DeepWalk_embeddings = DeepWalk_run(networkx_data,num_walks=1)
print("DeepWalk_embeddings :",np.array(DeepWalk_embeddings).shape) # print : "node2vec_embeddings : (2708, 64)"

三、结果及展望

       上述是针对Cora的数据集做的Node Embedding输出,输出为:node2vec_embeddings : (2708, 128);DeepWalk_embeddings : (2708, 128)

        接下来大家就可拿到 (2708, 128)这个Embedding做各种下游了,如聚类、Net Feature等

        P.S.这些都是18年以前,NN不发达的Embedding产物,并未挖掘深层feature的embedding,接下来玩一玩NN的Graph Embedding

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

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

相关文章

桌面版Teams,打开后一直卡在“正在加载Microsoft Teams”界面

清除Teams缓存的解决办法: 1.完全退出Teams桌面客户端。您可以通过右击桌面右下角的Teams图标并选择“退出”;或在任务管理器中完全结束Teams进程。 2.请至文件浏览器,并输入%appdata%\Microsoft\teams;或前往System (C:) > Us…

解锁前端Vue3宝藏级资料 第五章 Vue 组件应用 2 ( Emit )

本章带领大家理解组件、props、emits、slots、providers/injects,Vue 插件 等Vue组件使用的基础知识。 第一章 Vue3项目创建 1 Vue CLI 创建vue项目 第一章 Vue3项目创建 2 使用 Webpack 5 搭建 vue项目 第一章 Vue3项目创建 3 Vite 创建 vue项目 第二章 Vue3 基础语…

Denoising diffusion implicit models 阅读笔记

Denoising diffusion probabilistic models (DDPMs)从马尔科夫链中采样生成样本,需要迭代多次,速度较慢。Denoising diffusion implicit models (DDIMs)的提出是为了加速采样过程,减少迭代的次数,并且要求DDIM可以复用DDPM训练的网…

浅谈xss

XSS 简介 XSS,全称Cross Site Scripting,即跨站脚本攻击,是最普遍的Web应用安全漏洞。这类漏洞能够使得攻击者嵌入恶意脚本代码到正常用户会访问到的页面中,当正常用户访问该页面时,则可导致嵌入的恶意脚本代码的执行,从而达到恶意攻击用户的目的。需要强调的是,XSS不仅…

vue项目嵌套安卓壳子打包apk

1.确保你的项目可以正常运行 2.vue.config.js publicPath 添加一个 publicPath:./, 3.需要下载一个HBuilder X编辑器 下载地址:HBuilderX-高效极客技巧 4.新建一个项目 选择5App 创建完成之后删除掉红框内的文件 只保留一个manifest.json 5.把自己要变成ap…

iTOP-RK3588开发板更新RKNN模型

RKNN 是 Rockchip NPU 平台(也就是开发板)使用的模型类型,是以.rknn 结尾的模型文件。 RKNN SDK 提 供 的 demo 程 序 中 默 认 自 带 了 RKNN 模 型 , 在 RKNN SDK 的 examples/rknn_yolov5_demo/model/RK3588/目录下,如下图所示&#xff…

远程拷贝Windows上的文件到Linux指定的文件夹

Linux系统电脑之间使用scp命令拷贝十分方便,但是对于windows和Linux之间的远程拷贝就没那么方便,特别是对于车载嵌入式的开发人员,很多软件或者license没有对应的Linux版本,需要远程刷写软件来回切换十分不方便,今天介…

C++ Primer Plus第八章笔记

内联函数 编译过程的目标是可执行程序(由一组机器语言指令组成)。运行程序时,操作系统将指令载入到计算机内存中,则每条指令都有其特定的内存地址。 内联函数的编译代码与其它程序代码内联,编译器就使用相应的函数代…

亚运之城:杭州的搞钱之王 首富都得靠边站

作者:积溪 简评:这届亚运会,杭州成了显眼包,也卷成了蚊香,这背后杭州的搞钱实力,究竟有多牛?#杭州亚运会 #马云 #阿里 手机可以“打”公交 10分钟就能到 还只要1块钱? 这届亚运…

数据分析方法-对比分析和用户画像(文末送书)

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

App Store上线规范及流程

上线一个应用到 App Store 需要遵循苹果的规范和流程,以确保应用的质量和安全性。以下是上线应用到 App Store 的一般规范和流程,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 1. 开发和…

基于微信小程序的学生签到系统设计与实现(源码+lw+部署文档+讲解等)

前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 👇🏻…

ETHERCAT转ETHERCAT协议网关

JM-ECAT-ECAT 产品介绍 JM-ECAT-ECAT是自主研发的一款ETHERCAT从站功能的通讯网关。该产品主要功能是将2个ETHERCAT网络连接起来。 本网关连接到ETHERCAT总线中做为从站使用。 产品参数 技术参数 l 网关做为ETHERCAT网络的从站,可以连接倍福、欧姆龙、基恩士等厂…

带你深入学习Redis主从复制,学习心跳包、主从结构,全量复制、部分复制等

目录 1、单点问题 2、理解主从复制 3、配置Redis主从结构 3.1、在一个云服务器上如何启动多个Redis服务器: 3.2、配置主从复制 3.3、查看是否配置成功 3.4、补充:redis服务器启动和停止的命令,需要搭配使用 3.5、查看主从结构信息 3…

源码级揭秘Linux内核启动流程

哈喽,我是子牙,一个很卷的硬核男人。深入研究计算机底层、Windows内核、Linux内核、Hotspot源码……聚焦做那些大家想学没地方学的课程 今天这篇文章给大家分享一下Linux内核的启动流程。为什么要分享这个话题呢?所谓万丈高楼平地起&#xf…

可口可乐用新的“Y3000”口味拥抱有争议的人工智能图像生成器

可口可乐公司已经迈出了一大步,用它的释放;排放;发布据报道,可口可乐Y3000零糖“限量版”饮料是与人工智能共同创造的。它未来的名字让人想起3000年的味道(还有977年),但它的营销依赖于人工智能从2023年产生的图像——…

Vue之路由及Node.js环境搭建(一起探索新事物)

目录 ​编辑 前言 一、Vue之路由 1.路由简介 1.1 什么是路由 1.2 什么是SPA 1.3 SPA的实现思路 1.4 使用路由的优势 2. 案例演示 2.1 导入所需的js文件 2.2 编写案例代码(模拟页面跳转) 二、Vue之node.js 1. node.js简介 1.1 什么是node.j…

玫瑰代码||逐字打印字体||中秋快乐

关注微信公众号「ClassmateJie」 更多惊喜等待你的发掘 直接看实现效果 电脑端 手机端 使用场景 发给女神告白~ 提供一些文案 “自从遇见你,我的世界变得不一样了。每一天都因为你而变得特别。我想告诉你,我喜欢你,不仅仅是因为你的美丽&am…

使用 PyTorch 的计算机视觉简介 (2/6)

一、说明 在本单元中,我们从最简单的图像分类方法开始——一个全连接的神经网络,也称为感知器。我们将回顾一下 PyTorch 中定义神经网络的方式,以及训练算法的工作原理。 二、数据加载的实践 首先,我们使用 pytorchcv 助手来加载…

民安智库(第三方市场调查公司)开展景区游客满意度调查

为什么要开展景区游客满意度调查 景区的经营管理是一个动态的过程,需要不定期的地进行调查,让管理者了解景区管理的不足之处,并不断地改善和提高管理水平,以保证经营目标的顺利完成。 景区旅游要想真正地成为可持续发展的经济产…