推荐系统–基于用户的协同过滤算法(UserCF)
基本概念
基本思想:向用户 u u u 推荐时,我们可以先找到和 u u u 相似的用户集合 N u N_u Nu,然后把这些用户喜欢的物品,但 u u u 没有看过的物品推荐给他。
步骤:
- 找到和目标用户相似的用户集合。
- 找到这个集合中的用户喜欢的,且目标用户还没有听说过的物品,然后推荐给目标用户。
步骤1 - - 找相似用户
为了找到目标用户的相似用户,我们需要计算不同用户之间的相似度。协同过滤算法主要利用行为的相似度计算兴趣的相似度。对于用户 u u u 和 v v v, N u , N v N_u, N_v Nu,Nv 分别表示他们有交互的物品集合。我们通过 Jaccard 公式计算用户之间的相似度:
s i m ( u , v ) = ∣ N u ∩ N v ∣ ∣ N u ∪ N v ∣ sim_{(u,v)}=\frac{\vert N_u \cap N_v \vert}{\vert N_u \cup N_v \vert} sim(u,v)=∣Nu∪Nv∣∣Nu∩Nv∣
同样,我们也可以利用余弦相似度、皮尔逊系数来计算用户之间的相似度。具体可见 推荐系统–协同过滤(Collaborative Filtering)
具体案例
我们以电影评分预测为例,数据集为 MovieLens-1M,有关数据集详情,可见 推荐系统–MovieLens数据集。
读取数据集
def get_data(data_path):
# 重新定义列名
col_names = ["user_id", "movie_id", "rating", "timestamp"]
# 加载评分数据
ratings = pd.read_csv(os.path.join(data_path, "ratings.dat"), sep="::", engine="python", names=col_names)
"""
ratings 的格式为
user_id movie_id rating timestamp
0 1 1193 5 978300760
1 1 661 3 978302109
2 1 914 3 978301968
3 1 3408 4 978300275
4 1 2355 5 978824291
"""
# 划分训练集和测试集
train_data, val_data, _, _ = train_test_split(ratings, ratings, test_size=0.2)
# 将数据按照用户进行分组
train_data = train_data.groupby("user_id")["movie_id"].apply(list).reset_index()
"""
train_data 的格式为
user_id movie_id
0 1 [1097, 1566, 3114, 2797, 4