Session"/>
大规模Session
基于图的推荐系统算法,需要得到item的临近矩阵或者邻接表才能进行进一步计算。
思路梗概:
1.把session记录(行为session,列为item)转化为一个矩阵,方便运算
2.使用转置矩阵和矩阵自身相乘,得到邻接矩阵
Session based 数据例子
假设有五条sessions,5个items
import numpy as np
all_sessions = [[1, 3, 5],[4, 5],[1,2],[1, 4, 5],[1, 5]]
计算item数量
n_node = len(set([item for session in all_sessions for item in session]))
# n_node: 5
session记录转为一个稀疏矩阵
稀疏矩阵大多数元素为0,占用空间太大,借助scipy包中csr_matrix函数进行处理。
csr_matrix的三个输入:
data:一个包含非零元素值的一维数组(或列表)。这个数组表示稀疏矩阵中非零元素的数值。数组的长度应该与 indices 数组的长度相同,它决定了稀疏矩阵中非零元素的个数。
indices:一个包含非零元素在矩阵中的列索引的一维数组(或列表)。这个数组定义了每个非零元素所在的列位置。indices 数组的长度应与 data 数组的长度相同。
indptr:一个包含每行中非零元素的起始和结束位置的一维数组(或列表)。这个数组指示了每行的非零元素在 data 和 indices 数组中的索引范围。通常,indptr 的长度为行数加1,最后一个元素通常是 data 和 indices 数组的总长度。
from scipy.sparse import csr_matrix
def data_masks(all_sessions, n_node):indptr, indices, data = [], [], []indptr.append(0)for j in range(len(all_sessions)):session = np.unique(all_sessions[j])length = len(session)s = indptr[-1]indptr.append((s + length)) # map data&indices to rowfor i in range(length):indices.append(session[i]-1) #列位置data.append(1) # 1表示在同一个session中出现matrix = csr_matrix((data, indices, indptr), shape=(len(all_sessions), n_node))return matrix
# print(data_masks(all_sessions,n_node))
# (0, 0) 1
# (0, 2) 1
# (0, 4) 1
# (1, 3) 1
# (1, 4) 1
# (2, 0) 1
# (2, 1) 1
# (3, 0) 1
# (3, 3) 1
# (3, 4) 1
# (4, 0) 1
# (4, 4) 1
转为邻接矩阵
H_T = data_masks(all_sessions, n_node)
DH = H_T.T
BH_T = H_T
DHBH_T = np.dot(DH,BH_T)
print(DHBH_T)
# (3, 0) 1
# (1, 0) 1
# (4, 0) 3
# (2, 0) 1
# (0, 0) 4
# (1, 1) 1
# (0, 1) 1
# (4, 2) 1
# (2, 2) 1
# (0, 2) 1
# (0, 3) 1
# (4, 3) 2
# (3, 3) 2
# (3, 4) 2
# (4, 4) 4
# (2, 4) 1
# (0, 4) 3
0,1代表item1和item2共现次数,对角线(i,i)代表 i t e m i item_{i} itemi出现次数
更多推荐
大规模Session
发布评论