作者:睡眠女孩在外面的世界_988 | 来源:互联网 | 2023-06-05 10:50
推荐系统中存在大量的数据稀疏的情况。比如有几亿用户,几千万的商品。他们的交互数据可以用一个巨大的矩阵来表示。直接保存这么大的矩阵,是不现实的。在这个大大矩阵中,绝大部分都是零值。而
推荐系统中存在大量的数据稀疏的情况。
比如有几亿用户,几千万的商品。他们的交互数据可以用一个巨大的矩阵来表示。
直接保存这么大的矩阵,是不现实的。
在这个大大矩阵中,绝大部分都是零值。
而我们需要数据为矩阵中的非零值和非零值所在的位置,此时,我们就用到了的矩阵压缩技术。
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]])