构建偏好矩阵的最优方法咨询——19.3万用户与1.6万电影场景
高效构建用户-电影偏好矩阵的最优方案
你当前先创建全0大矩阵再填充的做法,对于193000用户×16000电影的规模,不仅内存开销大(即使是int8类型也接近3GB),填充500万行数据的效率也很低。以下是两种更优的实现方式:
1. 用pandas透视表直接生成(简洁高效)
利用pandas内置的pivot_table,通过向量化操作直接从交互数据生成偏好矩阵,底层经过优化,速度远快于手动填充:
# 假设交互数据的列是user_id、item_id、score(你的交互分数列) preference_matrix = interactions.pivot_table( index='user_id', columns='item_id', values='score', fill_value=0, dtype='int8' ) # 如果需要和submission中的用户ID完全对齐,执行索引重排 preference_matrix = preference_matrix.reindex(index=submission['user_id'].unique(), fill_value=0)
这种方式不需要预先创建全0矩阵,直接从交互数据聚合生成,避免了不必要的内存占用,同时填充效率提升显著。
2. 稀疏矩阵存储(内存紧张时首选)
用户-电影交互通常是高度稀疏的(500万行仅占总格子数的1.6%),用scipy的稀疏矩阵可以大幅压缩内存占用:
from scipy.sparse import csr_matrix # 建立用户、电影ID到整数索引的映射(稀疏矩阵要求整数下标) user_unique = submission['user_id'].unique() item_unique = interactions['item_id'].unique() user_map = {user: idx for idx, user in enumerate(user_unique)} item_map = {item: idx for idx, item in enumerate(item_unique)} # 转换为稀疏矩阵的输入格式 row_indices = interactions['user_id'].map(user_map).values col_indices = interactions['item_id'].map(item_map).values score_data = interactions['score'].values.astype('int8') # 创建CSR格式的稀疏矩阵 sparse_preference = csr_matrix( (score_data, (row_indices, col_indices)), shape=(len(user_unique), len(item_unique)), dtype='int8' ) # 若需转为DataFrame(内存足够时) # preference_matrix = pd.DataFrame.sparse.from_spmatrix(sparse_preference, index=user_unique, columns=item_unique)
CSR稀疏矩阵仅存储有交互的位置,内存占用仅约5MB,后续多数推荐算法(如协同过滤)也支持直接使用稀疏矩阵计算,无需转为稠密矩阵。
内容的提问来源于stack exchange,提问作者KlimShaman
相关产品推荐
相关产品推荐

