推荐项目中如何将电影ID数据转为指定CSR格式稀疏矩阵?
生成对角CSR稀疏矩阵的解决方案
嘿,我来帮你搞定这个推荐系统里的稀疏矩阵问题!你想要的是行和列都对应电影ID、仅对角线位置为1的CSR格式稀疏矩阵对吧?之前用np.diag和直接转csr_matrix没成功,主要是没抓住稀疏对角矩阵的正确生成逻辑,我给你一步步拆解:
问题分析
你需要的是对角稀疏矩阵:只有行ID与列ID相等的位置值为1,其余为0。直接用np.diag会生成稠密矩阵(电影数量多的话会占用大量内存),而csr_matrix(items.values)只是把ID列转成了普通列矩阵,完全不是对角结构,所以达不到要求。
正确实现步骤
我们可以用scipy.sparse里的diags函数直接生成稀疏对角矩阵,再指定为CSR格式,完美匹配你的需求:
- 先提取所有唯一的电影ID并排序(保证矩阵行列的ID顺序完全对应)
- 用
diags创建对角线全为1的稀疏矩阵,指定格式为CSR、数据类型为int32 - 可选:给矩阵绑定ID标签,方便后续关联电影ID
代码示例
假设你的DataFrame名为movie_df,代码如下:
import pandas as pd from scipy.sparse import diags, csr_matrix # 示例数据(替换成你的真实DataFrame) movie_df = pd.DataFrame({'ID': [1, 2, 3, 4], 'Movie': ['A', 'B', 'C', 'D']}) # 获取唯一电影ID并排序,确保行列顺序对应 unique_movie_ids = movie_df['ID'].unique() unique_movie_ids.sort() # 生成对角CSR稀疏矩阵,对角线全为1, dtype指定为int32 diag_sparse_matrix = diags( diagonals=[1] * len(unique_movie_ids), format='csr', dtype='numpy.int32' ) # 可选:给矩阵设置行列名称,方便关联电影ID diag_sparse_matrix.index = unique_movie_ids diag_sparse_matrix.columns = unique_movie_ids # 查看结果 print(diag_sparse_matrix)
输出效果
运行后你会得到类似这样的输出:
<sparse matrix of type '<class 'numpy.int32'>' with 4 stored elements in Compressed Sparse Row format>
完全符合你想要的稀疏格式,而且内存效率极高——只存储对角线的1元素,不会浪费空间在大量的0上。
额外说明
如果你的电影ID不是连续的(比如存在ID=1,3,5这样的情况),这个方法依然有效:矩阵的行列会按唯一ID的排序结果排列,每个ID对应的对角线位置都会被设为1,完美适配你的需求。
内容的提问来源于stack exchange,提问作者Kshitij Yadav
相关产品推荐
相关产品推荐

