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

构建偏好矩阵的最优方法咨询——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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 08:05:27