6.如何用CSV文件生成异构图数据集

       我们将使用GroupLens研究小组收集的MovieLens数据集
       这个数据集描述了MovieLens的五星评级和标记活动。该数据集包含来自600多名用户的9000多部电影的约10万个评分。我们将使用该数据集生成两种节点类型,分别保存电影和用户的数据,以及一种连接用户和电影的边类型,表示用户对特定电影的评分关系。
       首先,我们将数据集下载到任意文件夹(在本例中为当前目录):

from torch_geometric.data import download_url, extract_zip

url = 'https://files.grouplens.org/datasets/movielens/ml-latest-small.zip'
extract_zip(download_url(url, '.'), '.')

movies_path = './ml-latest-small/movies.csv'
ratings_path = './ml-latest-small/ratings.csv'

打开数据集,就可以看到以下一些文件:
在这里插入图片描述

import pandas as pd

print(pd.read_csv(movies_path).head()) # DataFrame对象,默认显示前5行
print(pd.read_csv(ratings_path).head())

在这里插入图片描述
       为了用PyG数据格式表示这些数据,我们首先定义了一个方法load_node_csv(),该方法读取*.csv文件并返回形状为[num_nodes,num_features]的节点级特征表示x:

import torch

def load_node_csv(path, index_col, encoders=None, **kwargs): # **kwargs用于在函数定义中接收任意数量的关键字参数,是一个字典
    df = pd.read_csv(path, index_col=index_col, **kwargs) # 读取*.csv
    mapping = {index: i for i, index in enumerate(df.index.unique())} # 将索引映射成连续值

    x = None
    if encoders is not None:
        xs = [encoder(df[col]) for col, encoder in encoders.items()]
        x = torch.cat(xs, dim=-1)

    return x, mapping

在这里插入图片描述
       这里,load_node_csv()从路径读取*.csv文件,并创建一个字典映射,将其索引列映射到范围{0,…,num_rows-1}中的连续值。这是必要的,因为我们希望我们的最终数据表示尽可能紧凑,例如,第一行中的电影表示应该可以通过x[0]访问。

from sentence_transformers import SentenceTransformer
class SequenceEncoder:
    def __init__(self, model_name='all-MiniLM-L6-v2', device=None):
        self.device = device
        self.model = SentenceTransformer(model_name, device=device)

    @torch.no_grad()
    def __call__(self, df):
        x = self.model.encode(df.values, show_progress_bar=True,
                              convert_to_tensor=True, device=self.device)
        print(x.shape)
        return x.cpu()

       SequenceEncoder类加载一个由model_name给定的预先训练的NLP模型,并使用它将字符串列表编码为形状为[num_strings,embedding_dim]的PyTorch张量。我们可以使用此SequenceEncodermovies.csv文件的标题进行编码。

       以类似的方式,我们可以创建另一个编码器,将电影类型转换为分类标签。为此,我们首先需要找到数据中存在的所有电影类型,创建shape[num_movies,num_genres]的特征表示x,并在类型j存在于电影i中的情况下将1分配给x[i,j]:

class GenresEncoder:
    def __init__(self, sep='|'):
        self.sep = sep

    def __call__(self, df):
        genres = set(g for col in df.values for g in col.split(self.sep))
        mapping = {genre: i for i, genre in enumerate(genres)}

        x = torch.zeros(len(df), len(mapping))
        for i, col in enumerate(df.values):
            for genre in col.split(self.sep):
                x[i, mapping[genre]] = 1
                
        print(x.shape)
        return x

       有了这个,我们可以通过以下方式获得我们对电影的最终呈现:
在这里插入图片描述
       类似地,我们也可以使用load_node_csv()来获得从userId到连续值的用户映射。但是,此数据集中没有用户的其他特征信息。因此,我们没有定义任何编码器:
在这里插入图片描述

       这样,我们就可以初始化HeteroData对象,并将两种节点类型传递给它:

from torch_geometric.data import HeteroData

data = HeteroData()

data['user'].num_nodes = len(user_mapping)  # Users do not have any features.
data['movie'].x = movie_x

print(data)
print(movie_x.shape)

在这里插入图片描述
       由于用户没有任何节点级别的信息,我们只定义其节点数。因此,在异构图模型的训练过程中,我们可能需要通过torch.nn.Embedding以端到端的方式学习不同的用户嵌入。

       接下来,我们来看看根据用户的评分将他们与电影联系起来。为此,我们定义了一个方法load_edge_csv(),该方法从ratings.csv返回shape[2,num_ratings]的最终edge_index表示,以及原始*.csv文件中存在的任何其他功能:

def load_edge_csv(path, src_index_col, src_mapping, dst_index_col, dst_mapping,
                  encoders=None, **kwargs):
    df = pd.read_csv(path, **kwargs)

    src = [src_mapping[index] for index in df[src_index_col]]
    dst = [dst_mapping[index] for index in df[dst_index_col]]
    #print(len(src))
    #print(len(dst))
    edge_index = torch.tensor([src, dst])

    edge_attr = None
    if encoders is not None:
        edge_attrs = [encoder(df[col]) for col, encoder in encoders.items()]
        edge_attr = torch.cat(edge_attrs, dim=-1)
        
    #print(edge_attr.shape)

    return edge_index, edge_attr

       这里,src_index_coldst_index_col分别定义源节点和目标节点的索引列。我们进一步利用节点级映射src_mappingdst_mapping来确保原始索引在我们的最终表示中被映射到正确的连续索引。

       对于文件中定义的每条边,它会在src_mappingdst_mapping中查找正向索引,并适当地移动数据。

       load_node_csv()类似,编码器用于返回额外的边特征信息。例如,为了从ratings.csv中的rating列加载ratings,我们可以定义一个IdentityEncoder,它只需将浮点值列表转换为PyTorch张量:

class IdentityEncoder:
    def __init__(self, dtype=None):
        self.dtype = dtype

    def __call__(self, df):
        return torch.from_numpy(df.values).view(-1, 1).to(self.dtype)

       这样,我们就可以完成我们的HeteroData对象了:

edge_index, edge_label = load_edge_csv(
    ratings_path,
    src_index_col='userId',
    src_mapping=user_mapping,
    dst_index_col='movieId',
    dst_mapping=movie_mapping,
    encoders={'rating': IdentityEncoder(dtype=torch.long)},
)

data['user', 'rates', 'movie'].edge_index = edge_index
data['user', 'rates', 'movie'].edge_label = edge_label

print(data)

在这里插入图片描述
       该HeteroData对象是PyG中异构图的原生格式,可以用作异构图模型的输入。

本文内容参考:PyG官网
视频讲解:4.如何用CSV文件生成异构图数据集

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

两个镜头、视野、分辨率不同的相机(rgb、红外)的视野校正

文章目录 背景实际效果查找资料资料1资料2 解决方案最终结果 背景 目前在做的项目用到两个摄像头,一个是热成像摄像头、另一个是普通的rgb摄像头。 一开始的目标是让他们像素级重合,使得点击rgb图像时,即可知道其像素对应的温度。但是在尝试…

spark history网络流量占用高问题记录

生产环境遇到一台机器网络流量占用高告警 由于监控只有机器总的网络流量,没有具体进程的 于是只能登陆服务器,安装nethogs:yum install nethogs 然后执行nethogs命令查看进程流量 观察到主要是spark history server这个进程占用流量高(最高…

【树】 二叉树 堆与堆排序 平衡(AVL)树 红黑(RB)树

目录 1 树1.1 认识树1.2 树的相关概念1.3 树的表示孩子兄弟表示法 2 二叉树2.1 概念2. 2 特殊二叉树2.3 二叉树的性质2.4 二叉树的存储结构 3 堆 — 完全二叉树的顺序结构实现3.1 堆的概念3.2 核心代码3.3 堆应用1 堆排序2 TOP-K问题 4 二叉树的链式存储4.1 二叉链结构与初始化…

4G WWAN设备类型

WWAN设备类型 USB dongle是设备接入互联网的重要方式之一,典型的通过USB接口与主设备连接,然后主设备通过4G/5G接入互联网,作为移动宽带设备,它有那些设备类型及暴露方式呢? 移动宽带设备类型:ModemManage…

vue-cli3项目优化

首先添加两个量化的插件,方便对项目目前的情况进行分析: 1.添加speed-measure-webpack-plugin插件 —量化的指标可以看出前后对比 使用步骤: 安装speed-measure-webpack-plugin依赖 npm install speed-measure-webpack-plugin -D配置vue.c…

【微信小程序】van-uploader实现文件上传

使用van-uploader和wx.uploadFile实现文件上传,后端使用ThinkPHP。 1、前端代码 json:引入van-uploader {"usingComponents": {"van-uploader": "vant/weapp/uploader/index"} }wxml:deletedFile是删除文件函…

【Linux 网络】 传输层协议之TCP协议 TCP的三次握手和四次挥手

TCP协议 TCP协议段格式谈谈什么是 “可靠” 和 “不可靠”TCP协议段——序号与确认序号TCP协议段——窗口大小TCP协议段 —— 六个标志位确认应答机制(ACK)超时重传机制连接管理机制TCP 的三次握手四次挥手TCP三次握手四次挥手总结图 滑动窗口流量控制拥…

HCIP中期实验

1、该拓扑为公司网络,其中包括公司总部、公司分部以及公司骨干网,不包含运营商公网部分。 2、设备名称均使用拓扑上名称改名,并且区分大小写。 3、整张拓扑均使用私网地址进行配置。 4、整张网络中,运行OSPF协议或者BGP协议的设备…

LabVIEW深度相机与三维定位实战(下)

‍‍🏡博客主页: virobotics的CSDN博客:LabVIEW深度学习、人工智能博主 🎄所属专栏:『LabVIEW深度学习实战』 🍻上期文章:『LabVIEW深度相机与三维定位实战(上)』 &#…

Chrome 75不支持保存成mhtml的解决方法

在Chrome 75之前,可以设置chrome://flags -> save as mhtml来保存网页为mhtml。 升级新版,发现无法另存为/保存网页为MHTML了。 参考https://jingyan.baidu.com/article/a3761b2b7e39ec5576f9aad9.html 在网上搜索无果后,只得从chromium项…

npm i 报错项目启动不了解决方法

1.场景 在另一台电脑低版本node环境跑的react项目,换到另一台电脑node18环境执行npm i时候报错 2.解决方法 脚本前加上set NODE_OPTIONS--openssl-legacy-provider

医学影像PACS系统源码:多功能服务器和阅片系统

PACS系统是以最新的IT技术为基础,遵循医疗卫生行业IHE/DICOM3.0和HL7标准,开发的多功能服务器和阅片系统。通过简单高性能的阅片功能,支持繁忙时的影像诊断业务,拥有保存影像的院内Web传输及离线影像等功能,同时具有备…

echarts实现立体柱状图

实现效果图如下&#xff1a; 上面除了立体图之外还增加了背景图。注意&#xff0c;可以发现这个图的右下角是是和x轴平齐的&#xff0c;如果右下角也要折角&#xff0c;可以根据代码修改下描点的点位就可以了。 完整代码如下&#xff1a; <template><div id"ba…

基于C#的窗体阴影效果方案 - 开源研究系列文章

最近在研究C#的Winform窗体的效果&#xff0c;上次介绍了窗体动画效果的博文( 基于C#的无边框窗体动画效果的完美解决方案 - 开源研究系列文章 )&#xff0c;这次将窗体阴影效果的方案进行一个介绍。 找了一下度娘&#xff0c;具体窗体阴影效果就两种方法&#xff1a;直接绘制和…

前端Vue入门-day08-vant组件库

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 vant 组件库 安装 导入 全部导入 按需导入 浏览器配饰 Viewport 布局 Rem 布局适配 vant 组件库 …

ssh安全远程管理

目录 1、什么是ssh 2、ssh登陆 3、ssh文件传输 1、什么是ssh ssh是 Secure Shell 的缩写&#xff0c;是一个建立在应用层上的安全远程管理协议。ssh 是目前较为可靠的传输协议&#xff0c;专为远程登录会话和其他网络服务提供安全性。利用ssh 协议可以有效防止远程管理过程中…

MySQL常见问题处理(三)

MySQL 常见问题解决 夕阳留恋的不是黄昏&#xff0c;而是朝阳 上一章简单介绍了MySQL数据库安装(二), 如果没有看过, 请观看上一章 一. root 用户密码忘记&#xff0c;进行重置操作 复制内容来源链接: https://blog.csdn.net/weixin_48927364/article/details/123556927 一.…

谷粒商城第八天-商品服务之品牌管理的整体实现(直接使用逆向生成的代码;含oss文件上传)

目录 一、总述 二、前端部分 2.1 创建好品牌管理菜单 2.2 复制组件 ​编辑2.3 复制api ​​​编辑 2.4 查看效果 ​编辑2.5 需要优化的地方 2.6 具体优化实现 2.6.1 优化一&#xff1a;将表格的状态列&#xff08;这里是是否显示列&#xff09;修改为开关&#xff…

JS解析JSON

在 JavaScript 中解析 JSON 数据 在 JavaScript 中&#xff0c;您可以使用 JSON.parse() 方法来解析 JSON 数据&#xff0c;示例代码如下&#xff1a; var json {"course": {"name": "JavaScript","author": "http://c.bianch…

【2023.8】docker一键部署wvp-GB28181-pro和ZLMediaKit过程全记录

安装docker 使用的操作系统是ubuntu20.04 如何在 Ubuntu 20.04 上安装和使用 Docker https://developer.aliyun.com/article/762674 docker拉取配置好的ZLMediaKIt和wvp-GB28181-pro docker pull 648540858/wvp_pro第一次运行 docker一键运行ZLMediaKIt和wvp-GB28181-pro …