【推荐算法论文阅读】Session-based recommendations with recurrent neural networks

一、背景

基于会话的推荐方法,主要有基于物品的协同过滤和基于马尔可夫决策过程的方法。

基于物品的协同过滤,需要维护一张物品的相似度矩阵,当用户在一个session中点击了某一个物品时,基于相似度矩阵得到相似的物品推荐给用户。这种方法简单有效,并被广泛应用,但是这种方法只把用户上一次的点击考虑进去,而没有把前面多次的点击都考虑进去。

基于马尔可夫决策过程的推荐方法,也就是强化学习方法,其主要学习的是状态转移概率,即点击了物品A之后,下一次点击的物品是B的概率,并基于这个状态转移概率进行推荐。这样的缺陷主要是随着物品的增加,建模所有的可能的点击序列是十分困难的。

二、亮点

  1. 使用RNN建模基于会话的推荐系统,建模多次点击序列;
  2. 使用ranking loss来训练模型
  3. 为了提高训练的效率,采用mini-batch并行训练和负采样的策略

三、模型具体结构

在这里插入图片描述

请添加图片描述

四、ranking loss

本文使用ranking loss,ranking可以是逐点(pointwise)、成对(pairwise)或列表(listwise):

  • 逐点排名独立地估计item的得分或排名,损失的定义方式应确保相关item的排名较低。
  • 成对排名比较一个positive item和negative item的得分或成对排名,损失的定义方式应确保positive item的排名低于negative item的排名。
  • 列表排名使用所有item的得分或排名,并将其与perfect ordering进行比较。由于它包括排序,因此通常计算成本更高,因此不经常使用。

本文中,作者发现逐点排名不稳定,而成对排名的损失表现良好。

1. 贝叶斯个性化排名(Beyesian Personalized Ranking,BPR)

请添加图片描述

2. 本文使用的ranking loss

请添加图片描述

### 基于用户协同过滤(UBCF)的推荐算法实现 #### 1. 数据预处理 在 UBCF 中,数据预处理是一个重要的环节。它涉及将原始用户-物品交互矩阵转换为适合计算的形式。常见的做法是对评分数据进行标准化或归一化处理。 以下是 Python 实现中的数据预处理部分: ```python import pandas as pd import numpy as np def preprocess_data(ratings_df, user_col='user_id', item_col='item_id', rating_col='rating'): """ 将评分数据转换为稀疏矩阵形式。 :param ratings_df: 用户-物品评分 DataFrame :return: 转换后的用户-物品评分矩阵 """ # 构建用户-物品评分矩阵 utility_matrix = ratings_df.pivot(index=user_col, columns=item_col, values=rating_col).fillna(0) # 对每行(即每位用户)进行均值中心化 mean_ratings = utility_matrix.mean(axis=1) normalized_matrix = utility_matrix.sub(mean_ratings, axis=0) return normalized_matrix, mean_ratings ``` 此函数会返回两个对象:一个是经过均值中心化的用户-物品评分矩阵 `normalized_matrix`;另一个是每个用户的平均评分 `mean_ratings`[^1]。 --- #### 2. 计算用户相似度 为了找到与目标用户兴趣最接近的其他用户,可以采用余弦相似度或其他距离度量方法来衡量用户之间的相似程度。 下面是计算用户间相似性的代码片段: ```python from sklearn.metrics.pairwise import cosine_similarity def calculate_user_similarity(normalized_matrix): """ 使用余弦相似度计算用户间的相似性。 :param normalized_matrix: 归一化后的用户-物品评分矩阵 :return: 用户相似度矩阵 """ similarity_matrix = cosine_similarity(normalized_matrix) return pd.DataFrame(similarity_matrix, index=normalized_matrix.index, columns=normalized_matrix.index) ``` 该函数接受规范化后的评分矩阵作为输入,并输出一个对称的用户相似度矩阵 `similarity_matrix`。 --- #### 3. 预测未知评分 预测某个用户未评价过的物品得分时,可以根据与其相似的邻居们的评分为依据加权求和得出估计分值。 具体逻辑如下所示: ```python def predict_ratings(user_id, items_to_predict, normalized_matrix, similarity_matrix, mean_ratings, k_neighbors=5): """ 预测指定用户对某些项目的潜在评分。 :param user_id: 当前要预测的目标用户 ID :param items_to_predict: 待预测项目列表 :param normalized_matrix: 已经标准化的评分表 :param similarity_matrix: 用户之间相似度表格 :param mean_ratings: 各位用户的平均打分数列 :param k_neighbors: 取最近邻的数量,默认取五个近邻 :returns: 返回字典 {item_id -> predicted_rating} """ predictions = {} target_similarities = similarity_matrix[user_id].sort_values(ascending=False)[1:k_neighbors+1] for item in items_to_predict: weighted_sum = 0 total_weight = 0 for neighbor_id, sim_score in target_similarities.items(): if not np.isnan(normalized_matrix.loc[neighbor_id, item]): weight = sim_score * normalized_matrix.loc[neighbor_id, item] weighted_sum += weight total_weight += abs(sim_score) if total_weight != 0: prediction = mean_ratings[user_id] + (weighted_sum / total_weight) predictions[item] = max(min(prediction, 5), 1) # 确保预测范围合理 return predictions ``` 上述代码实现了基于 K 近邻的方法来进行评分预测的功能。 --- #### 4. 整合流程并生成推荐清单 最后一步就是综合前面几步的结果,筛选出那些预计得分会较高的商品呈现给顾客看作最终建议项。 这里给出完整的调用示例以及说明: ```python if __name__ == "__main__": # 加载样本数据集 data = { 'user_id': ['u1','u1','u1','u2','u2','u3'], 'item_id': ['i1','i2','i3','i1','i3','i2'], 'rating' : [5 ,3 ,4 ,4 ,2 ,1 ] } df = pd.DataFrame(data) norm_mat, avg_rts = preprocess_data(df) sim_mat = calculate_user_similarity(norm_mat) test_user = 'u2' unseen_items = set(df['item_id']) - set(df[df['user_id']==test_user]['item_id']) preds = predict_ratings(test_user, list(unseen_items), norm_mat, sim_mat, avg_rts) recommendations = sorted(preds.items(), key=lambda x:x[1], reverse=True)[:3] print(f"Top recommended items for user '{test_user}':", dict(recommendations)) ``` 这段脚本演示了一个简单的端到端工作流,从加载基础资料直至输出个性化提议列表为止。 --- ### 总结 通过以上步骤可以看出,在实际应用过程中需要考虑诸多因素比如冷启动问题、稀疏性和性能瓶颈等问题。尽管如此,User-Based Collaborative Filtering 方法因其直观易懂而被广泛应用于各种场景之中[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值