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 稀疏矩阵

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


相关文章
|
3天前
|
数据处理 Python
如何使用Python的Pandas库进行数据排序和排名
【4月更文挑战第22天】Pandas Python库提供数据排序和排名功能。使用`sort_values()`按列进行升序或降序排序,如`df.sort_values(by='A', ascending=False)`。`rank()`函数用于计算排名,如`df['A'].rank(ascending=False)`。多列操作可传入列名列表,如`df.sort_values(by=['A', 'B'], ascending=[True, False])`和分别对'A'、'B'列排名。
13 2
|
2天前
|
机器学习/深度学习 算法 数据挖掘
PYTHON银行机器学习:回归、随机森林、KNN近邻、决策树、高斯朴素贝叶斯、支持向量机SVM分析营销活动数据|数据分享-2
PYTHON银行机器学习:回归、随机森林、KNN近邻、决策树、高斯朴素贝叶斯、支持向量机SVM分析营销活动数据|数据分享
24 1
|
1天前
|
机器学习/深度学习 算法 Python
数据分享|Python决策树、随机森林、朴素贝叶斯、KNN(K-最近邻居)分类分析银行拉新活动挖掘潜在贷款客户
数据分享|Python决策树、随机森林、朴素贝叶斯、KNN(K-最近邻居)分类分析银行拉新活动挖掘潜在贷款客户
20 4
|
2天前
|
机器学习/深度学习 算法 算法框架/工具
数据分享|PYTHON用KERAS的LSTM神经网络进行时间序列预测天然气价格例子
数据分享|PYTHON用KERAS的LSTM神经网络进行时间序列预测天然气价格例子
21 0
|
2天前
|
机器学习/深度学习 数据挖掘 网络架构
Python对商店数据进行lstm和xgboost销售量时间序列建模预测分析
Python对商店数据进行lstm和xgboost销售量时间序列建模预测分析
12 0
|
2天前
|
数据挖掘 数据处理 索引
如何使用Python的Pandas库进行数据筛选和过滤?
Pandas是Python数据分析的核心库,提供DataFrame数据结构。基本步骤包括导入库、创建DataFrame及进行数据筛选。示例代码展示了如何通过布尔索引、`query()`和`loc[]`方法筛选`Age`大于19的记录。
10 0
|
4天前
|
Python
如何使用Python的Pandas库进行数据缺失值处理?
Pandas在Python中提供多种处理缺失值的方法:1) 使用`isnull()`检查;2) `dropna()`删除含缺失值的行或列;3) `fillna()`用常数、前后值填充;4) `interpolate()`进行插值填充。根据需求选择合适的方法处理数据缺失。
37 9
|
6天前
|
索引 Python
如何使用Python的Pandas库进行数据透视表(pivot table)操作?
使用Pandas在Python中创建数据透视表的步骤包括:安装Pandas库,导入它,创建或读取数据(如DataFrame),使用`pd.pivot_table()`指定数据框、行索引、列索引和值,计算聚合函数(如平均分),并可打印或保存结果到文件。这允许对数据进行高效汇总和分析。
10 2
|
6天前
|
JSON 关系型数据库 数据库
《Python 简易速速上手小册》第6章:Python 文件和数据持久化(2024 最新版)
《Python 简易速速上手小册》第6章:Python 文件和数据持久化(2024 最新版)
33 0
|
7天前
|
机器学习/深度学习 Python 数据处理
Python中利用长短期记忆模型LSTM进行时间序列预测分析 - 预测电力负荷数据
Python中利用长短期记忆模型LSTM进行时间序列预测分析 - 预测电力负荷数据
32 0
Python中利用长短期记忆模型LSTM进行时间序列预测分析 - 预测电力负荷数据

热门文章

最新文章