• 大规模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]
        ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    计算item数量

    n_node = len(set([item for session in all_sessions for item in session]))
    # n_node: 5
    
    • 1
    • 2

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    转为邻接矩阵

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    0,1代表item1和item2共现次数,对角线(i,i)代表 i t e m i item_{i} itemi出现次数

  • 相关阅读:
    vscode类似GitHub Copilot的插件推荐
    yolov5 C3改进|深度可分离卷积轻量化主干
    数据结构(十一) -- 树(三) -- 堆排序
    Java设计模式七大原则-里氏替换原则
    阿里云oss上传视频测试,出现了413错误
    【微信小程序授权】获取用户手机号,昵称
    k8s部署nacos集群(外接mysql数据库)
    支持JDK19虚拟线程的web框架,之五(终篇):兴风作浪的ThreadLocal
    ant-design-pro的可编辑表格editprotable的遇到的一些小问题
    Tcp三次握手和四次挥手
  • 原文地址:https://blog.csdn.net/weixin_43718786/article/details/133949778