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

如何使用LightFM为仅持有评分数据的新用户生成推荐

LightFM新用户冷启动推荐实现方案

你遇到的ValueError核心原因是predict()和predict_rank()方法仅支持处理训练交互矩阵中已存在的用户ID,未收录的新用户没有预计算好的嵌入向量,无法直接调用原生接口。可按照以下步骤实现:

  • 构造新用户嵌入向量
    新用户嵌入可以通过其已交互物品的嵌入加权平均得到,权重使用用户给出的评分即可,也可以根据业务调整权重逻辑(比如仅取评分>3的正反馈物品计算平均)。参考代码:
import numpy as np

# 从训练好的模型中取出物品嵌入、物品偏置
item_embeddings = model.item_embeddings.weight.detach().numpy()
item_biases = model.item_biases.weight.detach().numpy()

# 处理新用户的<book_id, 评分>配对数据
rated_book_ids = [pair[0] for pair in new_user_ratings]
ratings = np.array([pair[1] for pair in new_user_ratings])

# 归一化权重,这里用评分减去全局平均评分做示例,可自行调整逻辑
normalized_weights = ratings - ratings.mean()

# 加权平均得到新用户嵌入
new_user_emb = np.dot(normalized_weights, item_embeddings[rated_book_ids]) / len(rated_book_ids)
  • 计算全量物品推荐得分
    直接按照LightFM的预测逻辑自行计算得分,不需要调用原生predict接口:
# 得分计算公式:用户嵌入 · 物品嵌入 + 物品偏置
all_item_scores = np.dot(item_embeddings, new_user_emb) + item_biases.flatten()
  • 过滤排序得到推荐结果
    过滤掉新用户已经评分过的书籍,按得分倒序取TopN即可:
# 过滤已评分物品
mask = np.ones(all_item_scores.shape[0], dtype=bool)
mask[rated_book_ids] = False
filtered_scores = all_item_scores[mask]
candidate_book_ids = np.arange(all_item_scores.shape[0])[mask]

# 取Top10推荐
top10_book_ids = candidate_book_ids[np.argsort(-filtered_scores)[:10]]

若你训练模型时使用了用户特征矩阵,也可以直接构造新用户的特征向量,调用get_user_representations()方法直接获取嵌入,无需手动加权计算:

new_user_emb, _ = model.get_user_representations(features=new_user_feature_vec)

内容的提问来源于stack exchange,提问作者Serious

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 14:27:01