1. 稀疏矩阵
稀疏矩阵 是一种大部分元素都是 零 的矩阵。与之相对的是 稠密矩阵,其中大多数元素都不是零。效用矩阵utility matrix通常是稀疏的,因为大部分用户仅会对小部分物品进行评分,也就是说矩阵中大部分值都是NaN值。
特点:
- 零元素占主导地位:非零元素很少。
- 存储效率高:可以使用特殊的存储方式(如压缩存储)来节省空间。
- 计算效率高:在数学运算中,忽略零元素可以加速计算。
2. 应用稀疏矩阵
2.1 中心余弦相似度
在python中,我们可以利用library scipy.sparse来构建稀疏矩阵并进行相关计算。
下面的代码以计算中心化余弦相似度为一个例子。
center() 函数:
- 对稀疏矩阵或向量进行 中心化。中心化是将数据中非零元素减去它们的均值,使数据居中于0。
- 通过
.data和.nonzero()提取非零值并进行操作,避免对零值进行冗余计算。
centered_cosine_sim() 函数:
- 计算两个稀疏向量的 中心化余弦相似度。
- 使用
power和sum方法计算稀疏向量的范数,避免对零值进行无意义计算。 - 点积通过
.dot()完成。
fast_centered_cosine_sim() 函数:
- 针对矩阵和向量进行快速中心化余弦相似度计算,特别适用于大型矩阵。
- 利用矩阵操作的并行计算能力,快速计算多个向量之间的余弦相似度。
# 文件名为centers.py
import numpy as np
from scipy.sparse import csr_matrix
def center(matrix):
""" Centralized the matrix """
if not isinstance(matrix, csr_matrix):
raise TypeError("It's not a sparse matrix. Change it.")
matrix = matrix.astype(float)
# For vector
if matrix.shape[0] == 1 or matrix.shape[1] == 1:
# compute the mean of nonzero values
mean_value = matrix.data.mean().astype(float)
# print(f"mean is {mean_value}")
if matrix.nnz == 0:
return matrix
centered_data = matrix.copy()
nonzero_indices = centered_data.nonzero()[1] if matrix.shape[0] == 1 else centered_data.nonzero()[0]
dense_values = centered_data[0, nonzero_indices].toarray().flatten().astype(float) if matrix.shape[0] == 1 else centered_data[nonzero_indices, 0].toarray().flatten().astype(float)
# subtract
dense_values -= mean_value
# Assign the updated value back to the sparse matrix
if matrix.shape[0] == 1:
cent

3万+

被折叠的 条评论
为什么被折叠?



