使用Python实现基于机器学习的电影推荐系统

昨天 11阅读

在当今数字化时代,个性化推荐系统已经成为许多在线平台不可或缺的一部分。从社交媒体到电子商务网站,再到流媒体服务,推荐系统通过分析用户行为和偏好来提供个性化的建议。本文将介绍如何使用Python构建一个基于机器学习的电影推荐系统,并详细解释其工作原理。

数据集

我们将使用MovieLens数据集(https://grouplens.org/datasets/movielens/),这是一个广泛用于推荐系统研究的数据集。它包含用户对电影的评分、电影信息以及用户的基本信息。为了简化问题,我们选择较小规模的MovieLens 100K数据集,其中包含约10万条评分记录、943个用户和1682部电影。

导入必要的库

首先,我们需要导入一些常用的Python库:

import pandas as pdimport numpy as npfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics.pairwise import cosine_similarityfrom scipy.sparse.linalg import svds

加载数据

接下来,我们加载并预处理数据:

# 加载数据ratings = pd.read_csv('ml-100k/u.data', sep='\t', names=['user_id', 'item_id', 'rating', 'timestamp'])movies = pd.read_csv('ml-100k/u.item', sep='|', encoding='latin-1', header=None, usecols=[0, 1], names=['movie_id', 'title'])# 合并数据data = pd.merge(ratings, movies, left_on='item_id', right_on='movie_id').drop(['item_id', 'timestamp'], axis=1)# 创建用户-物品矩阵user_movie_matrix = data.pivot_table(index='user_id', columns='title', values='rating')

基于内容的推荐算法

基于内容的推荐算法主要依赖于物品本身的特征,而不是用户之间的相似性。对于电影推荐系统来说,我们可以根据电影的类型、导演、演员等信息来进行推荐。然而,在这个例子中,我们只考虑基于电影标题的简单实现。

计算余弦相似度

余弦相似度是一种衡量两个向量之间夹角的方法,常用于文本挖掘领域。在这里,我们将用它来计算电影之间的相似度。

# 计算电影之间的相似度cosine_sim = cosine_similarity(user_movie_matrix.T.fillna(0))# 将结果转换为DataFrame格式cosine_sim_df = pd.DataFrame(cosine_sim, index=user_movie_matrix.columns, columns=user_movie_matrix.columns)

推荐电影

给定一部电影后,我们可以找到与之最相似的其他电影作为推荐。

def get_recommendations_based_on_content(movie_title, cosine_sim_df):    # 获取输入电影的相似度得分    sim_scores = list(enumerate(cosine_sim_df[movie_title]))    # 按相似度排序    sim_scores = sorted(sim_scores, key=lambda x: x[1], reverse=True)    # 获取前10个最相似的电影    sim_scores = sim_scores[1:11]    # 获取电影名称    movie_indices = [i[0] for i in sim_scores]    return cosine_sim_df.index[movie_indices]# 示例:为《玩具总动员》推荐电影print(get_recommendations_based_on_content('Toy Story (1995)', cosine_sim_df))

协同过滤推荐算法

与基于内容的方法不同,协同过滤不关心物品的具体属性,而是关注用户的行为模式。它假设如果两个人对同一组物品有相似的评价,那么他们可能也会对其他未评价过的物品给出相似的评价。

用户-物品评分矩阵分解

为了减少维度并提取潜在特征,我们可以使用奇异值分解(SVD)技术对用户-物品评分矩阵进行分解。

# 对用户-物品矩阵进行填充以去除NaN值user_movie_matrix_filled = user_movie_matrix.fillna(0)# 执行SVD分解U, sigma, Vt = svds(user_movie_matrix_filled, k=50)# 将sigma转换为对角矩阵sigma = np.diag(sigma)# 重构预测评分矩阵predicted_ratings = np.dot(np.dot(U, sigma), Vt)# 将预测评分矩阵转换回DataFrame格式preds_df = pd.DataFrame(predicted_ratings, columns=user_movie_matrix.columns)

根据用户ID推荐电影

有了预测评分矩阵后,我们可以为特定用户推荐他尚未观看但可能感兴趣的电影。

def recommend_movies_for_user(user_id, preds_df, original_ratings_df, num_recommendations=5):    # 获取该用户的原始评分数据    user_data = original_ratings_df[original_ratings_df.user_id == user_id]    # 获取该用户的预测评分数据    user_profile = preds_df.iloc[user_id - 1].sort_values(ascending=False)    # 排除已经看过的电影    recommendations = user_profile.drop(user_data.title.unique())    # 返回前num_recommendations个推荐结果    return recommendations.head(num_recommendations)# 示例:为用户1推荐电影print(recommend_movies_for_user(1, preds_df, data))

本文介绍了两种常见的电影推荐算法——基于内容的推荐和协同过滤,并给出了相应的Python代码实现。实际应用中,可以根据具体需求选择合适的算法或组合多种方法以提高推荐效果。此外,还可以进一步优化模型性能,如引入更复杂的特征工程、调整超参数等。希望这篇文章能够帮助你理解电影推荐系统的构建过程,并激发你在该领域的探索兴趣。

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

微信号复制成功

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