计算稀疏矩阵和稀疏向量的中心化余弦相似度(centered cosine sim for sparse matrices and sparse vectors)

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值