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

这篇具有很好参考价值的文章主要介绍了Python 将关系对数据转换为图数据 / 邻接矩阵。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 前言

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

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

数据格式示意图,实际只要用到user_id和item_id两列,且不需要表头:
Python 将关系对数据转换为图数据 / 邻接矩阵

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’)。对于某些算法,稀疏矩阵的不同实现可以表现得更好。

返回:文章来源地址https://www.toymoban.com/news/detail-426689.html

  • A:SciPy 稀疏矩阵
    图的邻接矩阵的稀疏矩阵。

到了这里,关于Python 将关系对数据转换为图数据 / 邻接矩阵的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • [数据结构]:25-图深度优先遍历(邻接矩阵)(C语言实现)

    [数据结构]:25-图深度优先遍历(邻接矩阵)(C语言实现)

    目录 前言 已完成内容 图深度优先遍历实现 01-开发环境 02-文件布局 03-代码 01-主函数 02-头文件 03-AdjMatrixFunction.cpp 04-DFS.cpp 结语         此专栏包含408考研数据结构全部内容,除其中使用到C++引用外,全为C语言代码。使用C++引用主要是为了简化指针的使用,避免二重指针的

    2023年04月10日
    浏览(10)
  • 转换矩阵、平移矩阵、旋转矩阵关系以及python实现旋转矩阵、四元数、欧拉角之间转换

    转换矩阵、平移矩阵、旋转矩阵关系以及python实现旋转矩阵、四元数、欧拉角之间转换

    由于在平时总是或多或少的遇到平移旋转的问题,每次都是现查资料,然后查了忘,忘了继续查,这次弄明白之后干脆写一篇文章,给人方便同时于己方便,后续如有扩充或变动也方便添加。 假设有两个向量 a 1 = ( x 1 , y 1 , z 1 ) a_1 = (x_1, y_1, z_1) a 1 ​ = ( x 1 ​ , y 1 ​ , z 1 ​

    2024年02月03日
    浏览(29)
  • 数据结构实验6 :图的存储与遍历(邻接矩阵的深度优先遍历DFS和邻接表的广度优先遍历BFS)

    数据结构实验6 :图的存储与遍历(邻接矩阵的深度优先遍历DFS和邻接表的广度优先遍历BFS)

    利用邻接矩阵存储无向图,并从0号顶点开始进行深度优先遍历。 输入第一行是两个整数n1 n2,其中n1表示顶点数(则顶点编号为0至n1-1),n2表示图中的边数。 之后有n2行输入,每行输入表示一条边,格式是“顶点1 顶点2”,把边插入图中。 例如: 4 4 0 1 1 3 0 3 0 2 先输出存储

    2024年02月09日
    浏览(17)
  • 邻接表与邻接矩阵的相互转换

    邻接表与邻接矩阵的相互转换

    邻接表转邻接矩阵的算法思想:首先初始化邻接矩阵。遍历邻接表,在依次遍历顶点vertices[i]的边链表时,修改邻接矩阵的第i行的元素值。若链表边结点的值为 j,则置邻接矩阵的edge[i][j]=1。遍历完邻接表时,整个转换过程结束。此算法对于无向图有向图均适用。 邻接矩阵转

    2024年02月12日
    浏览(6)
  • 邻接矩阵与邻接表的输出及其相互转换

    邻接矩阵与邻接表的输出及其相互转换

    (1) 文件 1 :  pubuse.h 是公共使用的常量定义和系统函数调用声明。 2)文件GraphDef.h定义了图的邻接矩阵表示类型和邻接表表示类型,该头文件在下面的程序中都会使用到,其代码如下: (3)头文件GraphAlgo4-1.h包含若干图的操作函数 1.将邻接矩阵转化为邻接表 2.将邻接表转化

    2024年02月11日
    浏览(8)
  • 【C语言\数据结构】图dijkstra最短路径 邻接矩阵(无项、有权)代码简单实现深度解析

    【C语言\数据结构】图dijkstra最短路径 邻接矩阵(无项、有权)代码简单实现深度解析

    这个代码是在图的邻接矩阵(无项、有权)的代码的基础上,添加了dijkstra最短路径函数,并且修改测试用例和主函数代码,图的邻接矩阵(无项、有权)的代码具体请查看 【C语言数据结构】图之邻接矩阵(无向、有权)代码简单实现,这里就不过多赘述。 我们用一个案例

    2024年02月03日
    浏览(14)
  • 图的数据结构,系统学习图的基本概念、定义和建立,学会邻接矩阵、邻接表以及实现六度空间案例,遍历图的方式——广度、深度访问

    图的数据结构,系统学习图的基本概念、定义和建立,学会邻接矩阵、邻接表以及实现六度空间案例,遍历图的方式——广度、深度访问

    图 :G = (V,E) Graph = (Vertex, Edge) V:顶点(数据元素)的有穷非空集合; E:边的有穷集合。 有向图 :每条边都是有方向的     无向图 :每条边都是无方向的   完全图 :任意两点之间都有一条边相连    无向完全图:n个顶点,n(n-1)/2条边 无向完全图:n个顶点,n(n-1)条边 稀疏

    2023年04月22日
    浏览(10)
  • 深度优先遍历(邻接矩阵,邻接表)

    深度优先遍历(邻接矩阵,邻接表)

        深度优先遍历也称为深度优先搜索,简称为DFS。     深度优先遍历的思路是从图中某个顶点V出发,访问此顶点,然后从V的未被访问过的邻接点出发深度优先遍历图,直到图中所有与V路径相通的顶点都被访问到     该遍历过程用到递归。     深度优先遍历用到了一个辅

    2024年02月08日
    浏览(8)
  • C++实现图—邻接矩阵,邻接表,深度遍历,广度遍历

    C++实现图—邻接矩阵,邻接表,深度遍历,广度遍历

    目录 1.图的基本概念 2.图的存储结构 2.1邻接矩阵 2.2 邻接表 3.图的遍历 3.1广度优先遍历 3.2图的深度遍历  总结: 图是由顶点集合以及顶点之间的关系组成的一种数据结构:G = (V,E),其中顶点集合V={x|x属于某个对象集}是有穷非空集合; E = {(x,y)|x,y属于V}或者E = {x, y|x,y属于V Pa

    2024年02月06日
    浏览(12)
  • python | 复杂网络:将关系对转换为邻接矩阵(常规方法以及pivot函数)

    python | 复杂网络:将关系对转换为邻接矩阵(常规方法以及pivot函数)

    复杂网络中常常需要将得到的关系对(图一)转换为邻接矩阵,并存储为csv格式。本文将介绍两方法来进行处理:方法一是构建数据框赋予值。方法二是利用pivot () 函数将一维表转换为二维表。本文所采用的例子为 有向加权网络 。 首先我们的原始数据为关系对(图一):

    2023年04月08日
    浏览(9)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包