• 大规模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出现次数

  • 相关阅读:
    英语词汇篇 - 常见词根词缀
    这份好用视频拼接的软件干货分享,值得收藏
    【职场必备知识】毕业留蓉政策与发展前景分析
    Java8 为什么在接口中引入default方法,以及default方法的使用
    fluent使用DPM模型计算出的颗粒沉积(trap)数据(.dpm格式)后处理python实现
    VB6.0研发五金厂信息管理系统,研发适合小企业小工厂的信息系统
    监控数据的采集方式及原理
    照片批量处理 7000张
    Mini-dashboard 和meilisearch配合使用
    如何正确卸载和重新安装 ESLint
  • 原文地址:https://blog.csdn.net/weixin_43718786/article/details/133949778