Python 将关系对数据转换为图数据 / 邻接矩阵

简介: Python 将关系对数据转换为图数据 / 邻接矩阵

1. 前言


在深度学习任务,例如推荐系统中,将关系转换为图表示,即邻接矩阵是常用的操作。


通常的做法是先将关系对数据转换为图数据,然后生成该图的邻接矩阵,再存储为稀疏矩阵。但这种方法不适用于大型矩阵的操作,通常会报内存溢出的错误。以推荐系统的Amazon的评级数据为例(Movielens等同理),这里提供一种方法将图数据直接存储为稀疏矩阵。


2. 传统方法


传统方法先读入数据,然后获取关系对,将关系对保存为图,再用networkx.to_numpy_matrix()提取图的邻接矩阵,最后用scipy.sparse.csr_matrix()保存为稀疏矩阵。代码如下:


# 导入包
import scipy.sparse as sp
import pandas as pd
import networkx as nx
# 读取关系对数据
df = pd.read_table('ratings.txt', sep=' ', header=None) # 读取数据集为 pandas
relation_df = pd.DataFrame(df, columns=[0, 1]) # 取出交互关系
# pandas 转 numpy
relation_list = []
for index, row in relation_df.iterrows(): 
    relation_list.append((row[0], row[1]))
g = nx.Graph(relation_list) # 交互关系转换为图
d_A = nx.to_numpy_matrix(g) # 生成图的邻接矩阵 numpy
s_A = sp.csr_matrix(d_A) # numpy 转换为 稀疏矩阵
sp.save_npz('adj.npz', s_A)  # 保存稀疏矩阵
# csr_matrix_variable = sp.load_npz('adj.npz') # 读取稀疏矩阵


3. 直接转换为稀疏矩阵


传统方法只能顺利处理小型矩阵,遇到大矩阵时,networkx.to_numpy_matrix()会报内存溢出的错误。解决办法是不用两步转换,而是用networkx.to_scipy_sparse_matrix()方法直接从图存储为邻接矩阵的稀疏矩阵格式。代码如下:


# 导入包
import scipy.sparse as sp
import pandas as pd
import networkx as nx
# 读取关系对数据
df = pd.read_table('ratings.txt', sep=' ', header=None) # 读取数据集为 pandas
relation_df = pd.DataFrame(df, columns=[0, 1]) # 取出交互关系
# pandas 转 numpy
relation_list = []
for index, row in relation_df.iterrows(): 
    relation_list.append((row[0], row[1]))
g = nx.Graph(relation_list) # 交互关系转换为图
s_A = nx.to_scipy_sparse_matrix(g, dtype=int, format='csr') # 生成图的邻接矩阵的稀疏矩阵
sp.save_npz('adj.npz', s_A)  # 保存稀疏矩阵
# csr_matrix_variable = sp.load_npz('adj.npz') # 读取稀疏矩阵


4. networkx.to_scipy_sparse_matrix()的用法


摘自 to_scipy_sparse_matrix — NetworkX 2.8.8 documentation


用法:


to_scipy_sparse_matrix(G, nodelist=None, dtype=None, weight='weight', format='csr')


将图形邻接矩阵作为SciPy 稀疏矩阵返回。


参数:


G:图

NetworkX 图,用于构造稀疏矩阵。

nodelist:列表,可选

行和列根据 nodelist 中的节点进行排序。如果nodelist为None,则排序由 G.nodes() 生成。

dtype:NumPy 数据类型,可选

用于初始化数组的有效 NumPy格式的dtype。如果None,则使用 NumPy 默认值(np.float64)。

weight:字符串或无可选(default=‘weight’)

保存用于边权重的数值的边属性。如果 None 则所有边权重为 1。

format:{‘bsr’, ‘csr’, ‘csc’, ‘coo’, ‘lil’, ‘dia’, ‘dok’} 中的字符串

要返回的矩阵类型(默认 ‘csr’)。对于某些算法,稀疏矩阵的不同实现可以表现得更好。

返回:


A:SciPy 稀疏矩阵

图的邻接矩阵的稀疏矩阵。


相关文章
|
1月前
|
数据采集 数据可视化 数据挖掘
利用Python自动化处理Excel数据:从基础到进阶####
本文旨在为读者提供一个全面的指南,通过Python编程语言实现Excel数据的自动化处理。无论你是初学者还是有经验的开发者,本文都将帮助你掌握Pandas和openpyxl这两个强大的库,从而提升数据处理的效率和准确性。我们将从环境设置开始,逐步深入到数据读取、清洗、分析和可视化等各个环节,最终实现一个实际的自动化项目案例。 ####
112 10
|
3月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
使用Python实现深度学习模型:智能数据隐私保护
使用Python实现深度学习模型:智能数据隐私保护 【10月更文挑战第3天】
208 0
|
12天前
|
数据采集 Web App开发 监控
Python爬虫:爱奇艺榜单数据的实时监控
Python爬虫:爱奇艺榜单数据的实时监控
|
1月前
|
数据采集 分布式计算 大数据
构建高效的数据管道:使用Python进行ETL任务
在数据驱动的世界中,高效地处理和移动数据是至关重要的。本文将引导你通过一个实际的Python ETL(提取、转换、加载)项目,从概念到实现。我们将探索如何设计一个灵活且可扩展的数据管道,确保数据的准确性和完整性。无论你是数据工程师、分析师还是任何对数据处理感兴趣的人,这篇文章都将成为你工具箱中的宝贵资源。
|
2月前
|
传感器 物联网 开发者
使用Python读取串行设备的温度数据
本文介绍了如何使用Python通过串行接口(如UART、RS-232或RS-485)读取温度传感器的数据。详细步骤包括硬件连接、安装`pyserial`库、配置串行端口、发送请求及解析响应等。适合嵌入式系统和物联网应用开发者参考。
64 3
|
3月前
|
数据采集 JSON 数据处理
抓取和分析JSON数据:使用Python构建数据处理管道
在大数据时代,电商网站如亚马逊、京东等成为数据采集的重要来源。本文介绍如何使用Python结合代理IP、多线程等技术,高效、隐秘地抓取并处理电商网站的JSON数据。通过爬虫代理服务,模拟真实用户行为,提升抓取效率和稳定性。示例代码展示了如何抓取亚马逊商品信息并进行解析。
抓取和分析JSON数据:使用Python构建数据处理管道
|
2月前
|
图形学 Python
SciPy 空间数据2
凸包(Convex Hull)是计算几何中的概念,指包含给定点集的所有凸集的交集。可以通过 `ConvexHull()` 方法创建凸包。示例代码展示了如何使用 `scipy` 库和 `matplotlib` 绘制给定点集的凸包。
38 1
|
3月前
|
数据处理 Python
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
这篇文章介绍了如何使用Python读取Excel文件中的数据,处理后将其保存为txt、xlsx和csv格式的文件。
164 3
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
|
3月前
|
计算机视觉 Python
Python实用记录(九):将不同的图绘制在一起、将不同txt文档中的数据绘制多条折线图
这篇文章介绍了如何使用Python的OpenCV库将多张图片合并为一张图片显示,以及如何使用matplotlib库从不同txt文档中读取数据并绘制多条折线图。
56 3
Python实用记录(九):将不同的图绘制在一起、将不同txt文档中的数据绘制多条折线图
|
2月前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。