如何强制sklearn使用float32而非float64?解决余弦相似度内存问题
商品推荐系统内存优化方案(针对余弦相似度计算)
一、强制使用float32计算余弦相似度
sklearn的cosine_similarity默认输出float64类型矩阵,但可以通过手动控制计算流程实现float32计算,将内存占用减半:
- 将计数矩阵转为float32稀疏矩阵:
import numpy as np count_matrix = count_matrix.astype(np.float32) - 对矩阵做L2归一化(余弦相似度的核心前提),指定dtype为float32:
from sklearn.preprocessing import normalize norm_matrix = normalize(count_matrix, norm='l2', axis=1, dtype=np.float32) - 通过稀疏矩阵乘法计算相似度,结果保持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
相关产品推荐
相关产品推荐

