可通过以下步骤来实现协同过滤推荐系统, 首先是数据准备, 要获取用户与物品的评分数据, 就像等等这样的数据;接着构建用户与物品矩阵, 运用所使用的pivot方法去转换数据结构;然后计算相似度, 这是基于用户或者物品来进行的, 常用的是余弦相似度或者皮尔逊相关系数;再之后预测评分并生成推荐, 借助加权平均相似用户评分据此得出候选列表;除此之外注意事项包含冷启动问题、评分标准化、稀疏性优化以及性能优化。另外强调的是每一步都需要结合代码去实现, 并且要依据实际场景调整策略以此来提升效果。
把现在好多平台之中作为核心功能之一的推荐系统, 比如电商平台, 视频网站, 音乐平台呀等等列举一下, 作为数据处理的主力语言以及算法开发的主力语言, 在构建推荐系统这件事上面是极为合适的, 而协同过滤这种算法呢是那类其中最经典的推荐算法里面的一种, 达成操作起来也并非是特别艰难的那种有标点句号。
下面我要开始一步步地讲述, 如何去使一个简单的协同过滤推荐系统得以实现。
1. 数据准备:用户-物品评分矩阵
用户对物品进行评分所产生的数据, 乃是协同过滤的根基所在。最为常见的情形是, 呈现出“用户 - 物品 - 评分”这样的三列结构, 举例来说。
user_id | item_id | rating --------|---------|------- 1 | A | 5 1 | B | 3 2 | A | 4 ...公开的数据集你能够加以使用, 举例来说, 格式与之类似的数据凭借自我整理也是可行的。
常常出现问题: 碰到评分缺失过多该如何去做呢? 答案是极为简单: 并无啥关系, 协同过滤原本就确实是被用来处置稀疏矩阵的。二、去构建用户与物品之间的评分矩阵。
在拥有原始数据以后, 首先要做的是将其转变为一个二维矩阵, 其中行用来表示用户, 而其列担当表示物品的角色,并且该二维矩阵的值是评分。
可以用 轻松完成这一步:
import pandas as pd # 假设你已经加载了数据到 df,包含 user_id, item_id, rating ratings_matrix = df.pivot(index='user_id', columns='item_id', values='rating')这时候你会得到一个看起来像这样的矩阵:
item_id A B C user_id 1 5.0 3.0 NaN 2 4.0 NaN 2.0 3 NaN 4.0 5.03. 计算相似度:用户之间 or 物品之间?
协同过滤分为两种:
3.14.3
微软官方所拥有的扩展, 乃是VS Code之中安装量处于最高水平的扩展工具(其大小为209M加以上), 该扩展集成了多种功能, 包括凭借特定方式实现的某种操作、借助特定途径达成的调试功能, 还有代码检查功能、格式化功能、重构功能以及单元测试功能等, 并且它还支持另外一些内容, 诸如虚拟环境管理以及多种版本的切换。
下载
在这里, 拿User - CF当作例子, 计算用户相互之间相似度的常用办法是皮尔逊相关系数再者是余弦相似度。
from sklearn.metrics.pairwise import cosine_similarity # 填充 NaN 为 0,方便计算相似度 similarity_matrix = cosine_similarity(ratings_matrix.fillna(0))这样你就得到了一个用户之间的相似度矩阵。
4. 预测评分并生成推荐
接续而来的便是预估某一个用户对于尚未进行评分的物品的兴致程度。公式大体如下:
对于\(\hat{r}_{ui}\)的值, 它等于\(\bar{r}u\)。再加上, 分子是对所有属于\(N(u)\)的\(v\)进行求和, 求和项为\(\text{sim}(u,v)\)与\((r_{vi} - \bar{r}v)\)的乘积。那么其分母呢, 是对所有属于\(N(u)\)的\(v\)进行求和, 求和项为\(|\text{sim}(u,v)|\)。
然而, 于实际的代码当中, 能够进行简化处理, 比如说, 先去找出那几个最为相似的用户噻, 然后, 依据他们的评分来进行加权平均。
举个例子:
# 找出与用户1最相似的前3个用户 similar_users = similarity_df[1].sort_values(ascending=False)[1:4].index # 收集这些用户评价过的电影,但用户1没有看过的 candidate_items = ratings_matrix.loc[similar_users].mean(axis=0).sort_values(ascending=False) # 排除用户1已经评过分的项目 user_rated = ratings_matrix.loc[1].dropna().index recommendations = candidate_items.drop(user_rated, errors='ignore')最终 就是你想推荐的内容。
5. 注意事项 & 小技巧
大体上就是这些流程了。协同过滤虽简易, 然而成效颇佳, 特别适宜于入门荐系统。要是你能将某些内容特性或者上下文讯息相结合, 成效还可更进一步。