大规模Session-based 数据转化为邻接矩阵

基于图的推荐系统算法,需要得到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 row
        for 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出现次数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值