前言
所谓协同过滤, 基本思想是根据用户之前的喜好以及其他兴趣相近的用户的选择来给用户推荐物品(基于对用户历史行为数据的挖掘发现用户的喜好偏向, 并预测用户可能喜好的产品进行推荐),一般是仅仅基于用户的行为数据(评价、购买、下载等), 而不依赖于项的任何附加信息(物品自身特征)或者用户的任何附加信息(年龄, 性别等),是最经典、最常见到的推荐算法。
本文介绍的是基于用户的协同过滤算法及其Python实现,作为推荐算法"鼻祖",关于协同过滤算法的原理,网上一搜一把一把的,这里就不做赘述了,重点以一个网上的公开数据集,介绍一下UserCF的实现思路。
水平有限,不妥之处还希望大佬多多指正。
数据集与完整代码:https://github.com/ziyuan0014/rec_userCF
实现思路
数据
本案例所用数据为用户对物品的评分数据(貌似为movieLen中的数据,但是前期学习找了太多资料,具体数据源我确实无法确定= =!),数据样式如下表所示:
user_id | content_id | score | ts | |
---|---|---|---|---|
0 | 1 | 1 | 5 | 874965758 |
1 | 1 | 2 | 3 | 876893171 |
2 | 1 | 3 | 4 | 878542960 |
3 | 1 | 4 | 3 | 876893119 |
4 | 1 | 5 | 3 | 889751712 |
计算评分矩阵
先放代码
def cirRatMatrix(pd_data,userId,contentId,score):
"""
计算评分矩阵
- param:
pd_data: 原始数据
userId: 用户列名
contentId: 内容列名
score: 评分列名
- return:
pd_data: 新增了两个编码列的数据表
rating: 评分矩阵
"""
pd_data['user_factorize_id'],_ = pd.factorize(pd_data[userId])
pd_data['content_factorize_id'],_ = pd.factorize(pd_data[contentId])
userNo = pd_data['user_factorize_id'].max() + 1
contentNo = pd_data['content_factorize_id'].max() + 1
rating = np.zeros((contentNo,userNo))
#查看矩阵ratings_df的第一维度是多少
for _,row in pd_data.iterrows():
#interrows(),对原始数据进行遍历
rating[int(row[&#