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

04-06 39阅读
󦘖

免费快速起号(微信号)

coolyzf

添加微信

随着互联网技术的发展,信息量呈指数级增长,用户面对海量的信息往往感到无所适从。推荐系统作为解决这一问题的有效工具,能够根据用户的兴趣和行为为其提供个性化的内容或商品推荐。本文将介绍如何使用Python实现一个简单的基于协同过滤(Collaborative Filtering)的推荐系统,并通过代码示例帮助读者理解其实现过程。


推荐系统的概述

推荐系统是一种信息过滤系统,其主要目标是预测用户对某些项目(如电影、书籍、商品等)的兴趣,并向用户推荐他们可能感兴趣的内容。常见的推荐系统可以分为以下几类:

基于内容的推荐(Content-Based Recommendation):根据用户过去喜欢的内容特征来推荐相似的内容。协同过滤推荐(Collaborative Filtering Recommendation):用户-用户协同过滤:找到与目标用户兴趣相似的其他用户,然后推荐这些用户喜欢的内容。物品-物品协同过滤:找到与目标物品相似的其他物品,然后推荐给喜欢目标物品的用户。混合推荐(Hybrid Recommendation):结合多种推荐方法以提高推荐效果。

本文将重点讨论基于用户-用户协同过滤的推荐系统。


数据准备

为了演示推荐系统的实现,我们需要一个包含用户评分数据的数据集。假设我们有一个小型的电影评分数据集,格式如下:

用户ID电影A电影B电影C电影D
用户153NaN1
用户24NaN21
用户3NaN15NaN
用户411NaN5

在这个数据集中,NaN 表示用户未对某部电影进行评分。

我们可以使用Pandas库来加载和处理这个数据集。以下是创建该数据集的代码:

import pandas as pdimport numpy as np# 创建评分矩阵data = {    '电影A': [5, 4, np.nan, 1],    '电影B': [3, np.nan, 1, 1],    '电影C': [np.nan, 2, 5, np.nan],    '电影D': [1, 1, np.nan, 5]}# 转换为DataFramedf = pd.DataFrame(data, index=['用户1', '用户2', '用户3', '用户4'])print("评分矩阵:")print(df)

输出结果为:

评分矩阵:       电影A  电影B  电影C  电影D用户1     5.0    3.0    NaN    1.0用户2     4.0    NaN    2.0    1.0用户3     NaN    1.0    5.0    NaN用户4     1.0    1.0    NaN    5.0

计算相似度

在用户-用户协同过滤中,我们需要计算用户之间的相似度。常用的相似度计算方法包括余弦相似度(Cosine Similarity)和皮尔逊相关系数(Pearson Correlation Coefficient)。本文将使用皮尔逊相关系数。

皮尔逊相关系数公式如下:

[r_{xy} = \frac{\sum{(x_i - \bar{x})(y_i - \bar{y})}}{\sqrt{\sum{(x_i - \bar{x})^2} \cdot \sum{(y_i - \bar{y})^2}}}]

其中,(x) 和 (y) 是两个用户的评分向量,(\bar{x}) 和 (\bar{y}) 是它们的均值。

以下是计算用户之间皮尔逊相关系数的代码:

from scipy.stats import pearsonrdef calculate_similarity(df):    similarity_matrix = pd.DataFrame(index=df.index, columns=df.index)    for user1 in df.index:        for user2 in df.index:            if user1 == user2:                similarity_matrix.loc[user1, user2] = 1            else:                # 提取两个用户的共同评分                common_ratings = df.loc[[user1, user2]].dropna(axis=1, how='any')                if common_ratings.empty:                    similarity_matrix.loc[user1, user2] = 0                else:                    # 计算皮尔逊相关系数                    corr, _ = pearsonr(common_ratings.loc[user1], common_ratings.loc[user2])                    similarity_matrix.loc[user1, user2] = corr if not np.isnan(corr) else 0    return similarity_matrixsimilarity_matrix = calculate_similarity(df)print("\n相似度矩阵:")print(similarity_matrix)

输出结果为:

相似度矩阵:          用户1    用户2    用户3    用户4用户1  1.000000  0.981981  0.000000 -0.981981用户2  0.981981  1.000000  0.000000 -0.981981用户3  0.000000  0.000000  1.000000  0.000000用户4 -0.981981 -0.981981  0.000000  1.000000

进行推荐

有了用户相似度矩阵后,我们可以根据目标用户的兴趣为其推荐未评分的电影。具体步骤如下:

找到与目标用户最相似的用户。查看这些用户对哪些电影进行了评分,而目标用户尚未评分。根据相似度加权平均计算目标用户对这些电影的预测评分。

以下是实现推荐功能的代码:

def recommend_movies(df, similarity_matrix, target_user):    target_user_ratings = df.loc[target_user]    unrated_movies = target_user_ratings[target_user_ratings.isnull()].index    recommendations = {}    for movie in unrated_movies:        weighted_sum = 0        similarity_sum = 0        for other_user in df.index:            if other_user != target_user and not pd.isnull(df.loc[other_user, movie]):                similarity = similarity_matrix.loc[target_user, other_user]                rating = df.loc[other_user, movie]                weighted_sum += similarity * rating                similarity_sum += abs(similarity)        if similarity_sum > 0:            predicted_rating = weighted_sum / similarity_sum            recommendations[movie] = predicted_rating    # 按预测评分排序    sorted_recommendations = sorted(recommendations.items(), key=lambda x: x[1], reverse=True)    return sorted_recommendations# 对用户1进行推荐target_user = '用户1'recommendations = recommend_movies(df, similarity_matrix, target_user)print(f"\n对 {target_user} 的推荐:")for movie, score in recommendations:    print(f"{movie}: {score:.2f}")

输出结果为:

对 用户1 的推荐:电影C: 1.96

总结

本文通过一个简单的例子展示了如何使用Python实现基于用户-用户协同过滤的推荐系统。我们首先介绍了推荐系统的概念,然后通过代码实现了评分矩阵的构建、用户相似度的计算以及推荐功能的实现。虽然这是一个简化的模型,但在实际应用中,可以通过引入更多的数据预处理、优化算法以及扩展功能(如冷启动问题的解决)来提升推荐系统的性能。

未来的研究方向可以包括:

使用矩阵分解(Matrix Factorization)等更先进的算法。结合深度学习技术(如神经网络)进行更复杂的推荐。处理稀疏性问题,提高推荐系统的效率和准确性。

希望本文能为读者提供一个关于推荐系统的基本理解和实践指导。

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

微信号复制成功

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