Google Colab RAM不足无法计算电影TF-IDF矩阵余弦相似度求解决方案
问题核心原因
你遇到的内存溢出是因为全量计算45466部电影的两两余弦相似度时,会生成大小约16GB的稠密矩阵,直接超出了Colab免费实例的内存上限,DataCamp的教程可正常运行大概率是因为其使用了裁剪后的小规模数据集,或是运行环境内存配置更高。你尝试的网传RAM扩容死循环代码早已失效,请勿继续使用。
可行解决方案
方案1:按需计算相似度(最优,零额外内存开销)
你不需要提前生成全量相似度矩阵,仅在查询某部电影的相似结果时,单独计算该电影与全量数据的相似度即可,内存占用可忽略,代码如下:
- 先构建电影标题到索引的映射
indices = pd.Series(metadata.index, index=metadata['original_title']).drop_duplicates()
- 改写推荐函数,仅计算单部电影的相似度
def get_recommendations(title): # 获取目标电影的索引 idx = indices[title] # 仅计算目标电影与所有电影的余弦相似度,不存储全量矩阵 single_cosine_sim = linear_kernel(tfidf_matrix[idx], tfidf_matrix).flatten() # 排序取Top10相似结果(排除自身) sim_scores = sorted(enumerate(single_cosine_sim), key=lambda x: x[1], reverse=True)[1:11] movie_indices = [i[0] for i in sim_scores] return metadata['original_title'].iloc[movie_indices]
调用时直接传入电影名即可,比如get_recommendations("The Dark Knight")
方案2:压缩TF-IDF矩阵维度
如果确实需要批量计算全量相似度,可先降低TF-IDF矩阵的维度,减小后续计算的内存开销:
- 限制TF-IDF的最大特征数,仅保留高频词汇:
# 仅保留出现频率最高的20000个词汇,可根据需求调整数值 tfidf = TfidfVectorizer(stop_words="english", max_features=20000) metadata["overview"] = metadata["overview"].fillna("") tfidf_matrix = tfidf.fit_transform(metadata["overview"])
- 还可搭配SVD进一步降维:
from sklearn.decomposition import TruncatedSVD # 压缩到100维,可根据需求调整维度 svd = TruncatedSVD(n_components=100, random_state=42) reduced_tfidf = svd.fit_transform(tfidf_matrix) # 此时再计算全量相似度矩阵的内存开销会降低70%以上 cosine_sim = linear_kernel(reduced_tfidf, reduced_tfidf)
方案3:分批计算全量相似度矩阵
如果必须保留原始TF-IDF维度且需要全量矩阵,可分批计算后拼接结果:
import numpy as np batch_size = 1000 cosine_sim = np.zeros((tfidf_matrix.shape[0], tfidf_matrix.shape[0]), dtype=np.float32) for i in range(0, tfidf_matrix.shape[0], batch_size): end = min(i + batch_size, tfidf_matrix.shape[0]) cosine_sim[i:end] = linear_kernel(tfidf_matrix[i:end], tfidf_matrix)
使用float32替代默认的float64可直接将矩阵内存占用减半。
内容的提问来源于stack exchange,提问作者Elena Herrero
相关产品推荐
相关产品推荐

