推荐系统中的矩阵压缩

推荐系统存在数据稀疏问题,其交互数据构成的巨大矩阵大部分为零值,直接保存不现实。此时可采用矩阵压缩技术,scipy提供了相应API。矩阵压缩大致分为三类,分别是直接保存行、列和数据,按行压缩以及按列压缩,并给出了具体示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

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

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

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]])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值