1. 前言
在深度學(xué)習(xí)任務(wù),例如推薦系統(tǒng)中,將關(guān)系轉(zhuǎn)換為圖表示,即鄰接矩陣是常用的操作。
通常的做法是先將關(guān)系對(duì)數(shù)據(jù)轉(zhuǎn)換為圖數(shù)據(jù),然后生成該圖的鄰接矩陣,再存儲(chǔ)為稀疏矩陣。但這種方法不適用于大型矩陣的操作,通常會(huì)報(bào)內(nèi)存溢出的錯(cuò)誤。以推薦系統(tǒng)的Amazon的評(píng)級(jí)數(shù)據(jù)為例(Movielens等同理),這里提供一種方法將圖數(shù)據(jù)直接存儲(chǔ)為稀疏矩陣。
數(shù)據(jù)格式示意圖,實(shí)際只要用到user_id和item_id兩列,且不需要表頭:
2. 傳統(tǒng)方法
傳統(tǒng)方法先讀入數(shù)據(jù),然后獲取關(guān)系對(duì),將關(guān)系對(duì)保存為圖,再用networkx.to_numpy_matrix()
提取圖的鄰接矩陣,最后用scipy.sparse.csr_matrix()
保存為稀疏矩陣。代碼如下:
# 導(dǎo)入包
import scipy.sparse as sp
import pandas as pd
import networkx as nx
# 讀取關(guān)系對(duì)數(shù)據(jù)
df = pd.read_table('ratings.txt', sep=' ', header=None) # 讀取數(shù)據(jù)集為 pandas
relation_df = pd.DataFrame(df, columns=[0, 1]) # 取出交互關(guān)系
# pandas 轉(zhuǎn) numpy
relation_list = []
for index, row in relation_df.iterrows():
relation_list.append((row[0], row[1]))
g = nx.Graph(relation_list) # 交互關(guān)系轉(zhuǎn)換為圖
d_A = nx.to_numpy_matrix(g) # 生成圖的鄰接矩陣 numpy
s_A = sp.csr_matrix(d_A) # numpy 轉(zhuǎn)換為 稀疏矩陣
sp.save_npz('adj.npz', s_A) # 保存稀疏矩陣
# csr_matrix_variable = sp.load_npz('adj.npz') # 讀取稀疏矩陣
3. 直接轉(zhuǎn)換為稀疏矩陣
傳統(tǒng)方法只能順利處理小型矩陣,遇到大矩陣時(shí),networkx.to_numpy_matrix()
會(huì)報(bào)內(nèi)存溢出的錯(cuò)誤。解決辦法是不用兩步轉(zhuǎn)換,而是用networkx.to_scipy_sparse_matrix()
方法直接從圖存儲(chǔ)為鄰接矩陣的稀疏矩陣格式。代碼如下:
# 導(dǎo)入包
import scipy.sparse as sp
import pandas as pd
import networkx as nx
# 讀取關(guān)系對(duì)數(shù)據(jù)
df = pd.read_table('ratings.txt', sep=' ', header=None) # 讀取數(shù)據(jù)集為 pandas
relation_df = pd.DataFrame(df, columns=[0, 1]) # 取出交互關(guān)系
# pandas 轉(zhuǎn) numpy
relation_list = []
for index, row in relation_df.iterrows():
relation_list.append((row[0], row[1]))
g = nx.Graph(relation_list) # 交互關(guān)系轉(zhuǎn)換為圖
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 稀疏矩陣返回。
參數(shù):文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-426689.html
-
G:圖
NetworkX 圖,用于構(gòu)造稀疏矩陣。 -
nodelist:列表,可選
行和列根據(jù) nodelist 中的節(jié)點(diǎn)進(jìn)行排序。如果nodelist為None
,則排序由G.nodes()
生成。 -
dtype:NumPy 數(shù)據(jù)類型,可選
用于初始化數(shù)組的有效 NumPy格式的dtype。如果None,則使用 NumPy 默認(rèn)值(np.float64)。 -
weight:字符串或無(wú)可選(default=‘weight’)
保存用于邊權(quán)重的數(shù)值的邊屬性。如果 None 則所有邊權(quán)重為 1。 -
format:{‘bsr’, ‘csr’, ‘csc’, ‘coo’, ‘lil’, ‘dia’, ‘dok’} 中的字符串
要返回的矩陣類型(默認(rèn) ‘csr’)。對(duì)于某些算法,稀疏矩陣的不同實(shí)現(xiàn)可以表現(xiàn)得更好。
返回:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-426689.html
-
A:SciPy 稀疏矩陣
圖的鄰接矩陣的稀疏矩陣。
到了這里,關(guān)于Python 將關(guān)系對(duì)數(shù)據(jù)轉(zhuǎn)換為圖數(shù)據(jù) / 鄰接矩陣的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!