用 Python 实现一个简单的推荐系统

04-02 10阅读

在当今信息爆炸的时代,推荐系统已成为我们日常生活中不可或缺的一部分。从电商网站的商品推荐,到视频平台的影片推荐,再到新闻网站的资讯推荐,推荐系统都在默默地为我们筛选信息,提升用户体验。本文将介绍如何使用 Python 实现一个简单的基于用户的协同过滤推荐系统。

协同过滤简介

协同过滤(Collaborative Filtering)是推荐系统中应用最广泛的技术之一。其核心思想是利用用户的历史行为数据(例如评分、购买记录等)来发现用户之间的相似性,然后根据相似用户的喜好来为目标用户推荐物品。

协同过滤主要分为两种类型:

基于用户的协同过滤(User-based Collaborative Filtering): 找到与目标用户兴趣相似的其他用户,然后将这些用户喜欢的物品推荐给目标用户。基于物品的协同过滤(Item-based Collaborative Filtering): 找到与目标物品相似的其他物品,然后将这些物品推荐给喜欢目标物品的用户。

本文将重点介绍基于用户的协同过滤。

数据准备

为了实现推荐系统,我们首先需要准备一些数据。假设我们有一个包含用户对电影评分的数据集,数据格式如下:

UserIDMovieIDRating
11015
11023
21014
21035
.........

我们可以使用 Python 的 Pandas 库来读取和处理数据:

import pandas as pd# 读取数据data = pd.read_csv('ratings.csv')# 查看数据print(data.head())

计算用户相似度

为了找到与目标用户兴趣相似的其他用户,我们需要计算用户之间的相似度。常用的相似度度量方法包括:

余弦相似度(Cosine Similarity): 计算两个用户评分向量的夹角余弦值,值越大表示相似度越高。皮尔逊相关系数(Pearson Correlation Coefficient): 计算两个用户评分向量的线性相关程度,值介于 -1 和 1 之间,值越大表示相似度越高。

本文使用余弦相似度来计算用户相似度。我们可以使用 Python 的 SciPy 库来计算余弦相似度:

from scipy.spatial.distance import cosine# 构建用户-电影评分矩阵user_movie_matrix = data.pivot_table(index='UserID', columns='MovieID', values='Rating')# 计算用户相似度矩阵user_similarity_matrix = 1 - user_movie_matrix.apply(lambda x: user_movie_matrix.apply(lambda y: cosine(x, y), axis=1), axis=1)# 查看用户相似度矩阵print(user_similarity_matrix.head())

预测用户评分

找到与目标用户相似的用户后,我们可以根据这些用户的评分来预测目标用户对未评分电影的评分。常用的预测方法包括:

加权平均法: 根据相似用户的评分进行加权平均,权重为用户相似度。基于用户的 K 近邻算法(KNN): 找到与目标用户最相似的 K 个用户,然后根据这 K 个用户的评分进行预测。

本文使用加权平均法来预测用户评分:

def predict_rating(user_id, movie_id):    # 找到与目标用户相似的用户    similar_users = user_similarity_matrix[user_id].sort_values(ascending=False)[1:]    # 计算加权平均评分    weighted_sum = 0    similarity_sum = 0    for other_user_id, similarity in similar_users.items():        if not pd.isna(user_movie_matrix.loc[other_user_id, movie_id]):            weighted_sum += similarity * user_movie_matrix.loc[other_user_id, movie_id]            similarity_sum += similarity    if similarity_sum == 0:        return 0    else:        return weighted_sum / similarity_sum# 预测用户 1 对电影 103 的评分predicted_rating = predict_rating(1, 103)print(f"预测用户 1 对电影 103 的评分为: {predicted_rating}")

生成推荐列表

最后,我们可以根据预测的评分来为目标用户生成推荐列表。我们可以选择预测评分最高的 N 个电影作为推荐结果:

def recommend_movies(user_id, n=5):    # 找到用户未评分的电影    unrated_movies = user_movie_matrix.loc[user_id][user_movie_matrix.loc[user_id].isna()].index    # 预测用户对未评分电影的评分    predicted_ratings = {}    for movie_id in unrated_movies:        predicted_ratings[movie_id] = predict_rating(user_id, movie_id)    # 根据预测评分排序,推荐前 N 个电影    recommended_movies = sorted(predicted_ratings.items(), key=lambda x: x[1], reverse=True)[:n]    return recommended_movies# 为用户 1 推荐 5 部电影recommended_movies = recommend_movies(1)print(f"为用户 1 推荐的电影: {recommended_movies}")

总结

本文介绍了如何使用 Python 实现一个简单的基于用户的协同过滤推荐系统。我们首先介绍了协同过滤的基本概念,然后详细讲解了如何计算用户相似度、预测用户评分以及生成推荐列表。最后,我们使用 Python 代码实现了整个推荐流程。

需要注意的是,本文介绍的只是一个简单的推荐系统示例,实际应用中还需要考虑很多因素,例如数据稀疏性、冷启动问题、推荐结果的多样性等。希望本文能够帮助读者理解推荐系统的基本原理,并为进一步学习和研究打下基础。

免责声明:本文来自网站作者,不代表CIUIC的观点和立场,本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。客服邮箱:ciuic@ciuic.com

目录[+]

您是本站第269名访客 今日有33篇新文章

微信号复制成功

打开微信,点击右上角"+"号,添加朋友,粘贴微信号,搜索即可!