热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

推荐系统中的矩阵压缩

推荐系统中存在大量的数据稀疏的情况。比如有几亿用户,几千万的商品。他们的交互数据可以用一个巨大的矩阵来表示。直接保存这么大的矩阵,是不现实的。在这个大大矩阵中,绝大部分都是零值。而

推荐系统中存在大量的数据稀疏的情况。

比如有几亿用户,几千万的商品。他们的交互数据可以用一个巨大的矩阵来表示。

直接保存这么大的矩阵,是不现实的。

在这个大大矩阵中,绝大部分都是零值。

而我们需要数据为矩阵中的非零值和非零值所在的位置,此时,我们就用到了的矩阵压缩技术。

scipy提供相应的api。

矩阵压缩可以大致分为三类:

1. 直接保存行,列,data


   

coo_matrix:    #稀疏矩阵存储方法一

row = np.array([0, 3, 1, 0])

col = np.array([0, 3, 1, 2])

data = np.array([4, 5, 7, 9])

coo_matrix((data, (row, col)), shape=(4, 4)).toarray()

array([[4, 0, 9, 0],        

        [0, 7, 0, 0],        

        [0, 0, 0, 0],        

        [0, 0, 0, 5]])

最容易理解的稀疏矩阵压缩方式,row保存数据所在行,col 保存数据所在列。data为数据


2. 按行压缩


csr_matrix:    #矩阵压缩之二

indptr = np.array([0, 2, 3, 6])

indices = np.array([0, 2, 2, 0, 1, 2])

data = np.array([1, 2, 3, 4, 5, 6])

sparse.csr_matrix((data, indices, indptr), shape=(3, 3)).toarray()

array([[1, 0, 2],

       [0, 0, 3],

       [4, 5, 6]])

# 按row行来压缩

# 对于第i行,非0数据列是indices[indptr[i]:indptr[i+1]] 数据是data[indptr[i]:indptr[i+1]]

# 在本例中

# 第0行,有非0的数据列是indices[indptr[0]:indptr[1]] = indices[0:2] = [0,2]

# 数据是data[indptr[0]:indptr[1]] = data[0:2] = [1,2],所以在第0行第0列是1,第2列是2

# 第1行,有非0的数据列是indices[indptr[1]:indptr[2]] = indices[2:3] = [2]

# 数据是data[indptr[1]:indptr[2] = data[2:3] = [3],所以在第1行第2列是3

# 第2行,有非0的数据列是indices[indptr[2]:indptr[3]] = indices[3:6] = [0,1,2]

# 数据是data[indptr[2]:indptr[3]] = data[3:6] = [4,5,6],所以在第2行第0列是4,第1列是5,第2列是6


3. 按列压缩


csc_matrix:  #稀疏矩阵存储方法三

indices = np.array([0, 2, 2, 0, 1, 2])

data = np.array([1, 2, 3, 4, 5, 6])

csc_matrix((data, indices, indptr), shape=(3, 3)).toarray()

array([[1, 0, 4],

       [0, 0, 5],

       [2, 3, 6]])




推荐阅读
author-avatar
睡眠女孩在外面的世界_988
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有