文章目录
背景
推荐系统处理中常会遇到稀疏矩阵的生成、转换等需求,将常用方法进行汇总
以下是三种常见的稀疏矩阵存储格式:COO(坐标格式)、CSR(压缩稀疏行格式)和CSC(压缩稀疏列格式)
COO:适合构建稀疏矩阵,但在矩阵操作方面效率较低。
CSR:适合行向量操作,如推荐系统中的用户-物品评分矩阵。
CSC:适合列向量操作,在某些线性代数计算中更有优势。
COO-坐标格式
定义
COO(Coordinate Format)是一种简单的稀疏矩阵存储格式,它通过三个一维数组来存储非零元素的位置和值。 这三个数组分别是:
data:存储非零元素的值。
row:存储每个非零元素所在的行索引。
col:存储每个非零元素所在的列索引。
特点
- 简单直观,易于构建和理解。
- 不适合频繁的矩阵操作,如切片或索引,因为它需要遍历所有非零元素。
- 适用于矩阵构建阶段,特别是当需要逐个元素填充矩阵时。
CSR-压缩稀疏行格式
定义
CSR(Compressed Sparse Row)是一种用于存储稀疏矩阵的格式,它通过三个一维数组来存储非零元素的位置和值。
这三个数组分别是:
- data:存储非零元素的值。
- indices:存储每个非零元素所在的列索引。
- indptr:存储每一行非零元素的起始位置的索引,以及矩阵末尾的一个额外元素,表示所有非零元素的总数。
特点
支持高效的行访问,适合行向量操作,如矩阵-向量乘法。
不支持高效的列访问。
适用于需要频繁执行行向量操作的情况,例如在推荐系统中进行用户-物品评分矩阵的操作。
CSC-压缩稀疏列格式
定义
与CSR类似,但它是以列为基础进行存储的。
同样使用三个一维数组:
- data:存储非零元素的值。
- indices:存储每个非零元素所在的行索引。
- indptr:存储每一列非零元素的起始位置的索引,以及矩阵末尾的一个额外元素,表示所有非零元素的总数。
特点
支持高效的列访问,适合列向量操作,如转置矩阵-向量乘法。
不支持高效的行访问。
适用于需要频繁执行列向量操作的情况,例如在某些线性代数计算中。
转换
在SciPy库中,稀疏矩阵之间可以很容易地相互转换。COO、CSR和CSC格式的稀疏矩阵可以相互转换,这使得在不同的应用场景下可以根据需要选择最合适的格式
函数
从COO转换为CSR:
使用to_csr()方法直接转换。
从COO转换为CSC:
使用to_csc()方法直接转换。
从CSR转换为COO:
使用tocoo()方法直接转换。
从CSR转换为CSC:
使用tocsc()方法直接转换。
从CSC转换为COO:
使用to_coo()方法直接转换。
从CSC转换为CSR:
使用to_csr()方法直接转换。
测试代码
import numpy as np
from scipy.sparse import coo_matrix, csr_matrix, csc_matrix
# 创建一个COO格式的稀疏矩阵
data = np.array([1, 2, 3, 4])
row = np.array([0, 1, 2, 0])
col = np.array([0, 1, 2, 3])
coo_matrix = coo_matrix((data, (row, col)), shape=(3, 4))
print(coo_matrix )
# 从COO转换为CSR
csr_matrix = coo_matrix.tocsr()
# 从COO转换为CSC
csc_matrix = coo_matrix.tocsc()
# 创建一个CSR格式的稀疏矩阵
data = np.array([1, 2, 3, 4])
indices = np.array([0, 1, 2, 3])
indptr = np.array([0, 2, 3, 4])
csr_matrix = csr_matrix((data, indices, indptr), shape=(3, 4))
# 从CSR转换为COO
coo_matrix = csr_matrix.tocoo()
# 从CSR转换为CSC
csc_matrix = csr_matrix.tocsc()
# 创建一个CSC格式的稀疏矩阵
data = np.array([1, 2, 3, 4])
indices = np.array([0, 1, 2, 3])
indptr = np.array([0, 2, 3, 4])
csc_matrix = csc_matrix((data, indices, indptr), shape=(3, 4))
# 从CSC转换为COO
coo_matrix = csc_matrix.tocoo()
# 从CSC转换为CSR
csr_matrix = csc_matrix.tocsr()
# 输出稀疏矩阵
print("COO Matrix:")
print(coo_matrix.toarray())
print("CSR Matrix:")
print(csr_matrix.toarray())
print("CSC Matrix:")
print(csc_matrix.toarray())