You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何强制sklearn使用float32而非float64?解决余弦相似度内存问题

商品推荐系统内存优化方案(针对余弦相似度计算)

一、强制使用float32计算余弦相似度

sklearn的cosine_similarity默认输出float64类型矩阵,但可以通过手动控制计算流程实现float32计算,将内存占用减半:

  1. 将计数矩阵转为float32稀疏矩阵:
    import numpy as np
    count_matrix = count_matrix.astype(np.float32)
    
  2. 对矩阵做L2归一化(余弦相似度的核心前提),指定dtype为float32:
    from sklearn.preprocessing import normalize
    norm_matrix = normalize(count_matrix, norm='l2', axis=1, dtype=np.float32)
    
  3. 通过稀疏矩阵乘法计算相似度,结果保持float32:
    similarity_matrix = norm_matrix.dot(norm_matrix.T).astype(np.float32)
    

二、其他内存优化方法

1. 替换特征提取方式

  • 改用HashingVectorizer:无需存储词汇表,通过哈希映射特征,内存占用极低,适合大规模数据集。可调整n_features参数降低哈希碰撞概率:
    from sklearn.feature_extraction.text import HashingVectorizer
    vectorizer = HashingVectorizer(n_features=2**18, alternate_sign=False)
    count_matrix = vectorizer.fit_transform(descriptions)
    
  • 使用TfidfVectorizer替代CountVectorizer:TF-IDF能过滤低权重无效特征,减少非零元素存储量,同时语义相似性计算效果更优。

2. 避免计算完整相似度矩阵

不需要生成47046×47046的全量矩阵,只需获取每个样本的Top-N相似商品:

  • 分批处理:每次取1000个样本,计算它们与全量样本的相似度,提取Top-N结果后释放内存,循环完成所有样本计算。
  • 使用近似最近邻库:如FAISS、Annoy,通过构建索引快速检索相似项,无需计算完整矩阵,内存占用和计算效率远优于全量余弦相似度计算。

3. 特征降维

用TruncatedSVD压缩特征维度后再计算相似度:

from sklearn.decomposition import TruncatedSVD
svd = TruncatedSVD(n_components=200, random_state=42)
reduced_matrix = svd.fit_transform(count_matrix)
# 计算降维后的余弦相似度
from sklearn.metrics.pairwise import cosine_similarity
similarity_matrix = cosine_similarity(reduced_matrix, dtype=np.float32)

降维后矩阵规模从47046×3607变为47046×200,内存占用大幅降低,精度损失在推荐场景下通常可接受。

4. 稀疏矩阵格式优化

当前矩阵为CSR格式,若需频繁执行转置乘法操作,可转为CSC格式提升计算效率:

count_matrix = count_matrix.tocsc()

内容的提问来源于stack exchange,提问作者JLd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 16:03:16