关于python:Python协同过滤算法实现一个简单的图书推荐系统

44次阅读

共计 2010 个字符,预计需要花费 6 分钟才能阅读完成。

背景介绍

当咱们做一些举荐零碎网站时,通常须要适合的举荐算法,上面给大家介绍举荐零碎中经典的举荐算法——协同过滤算法。在本文中通过 Python 语言,以一个图书举荐零碎为案例,最终实现一个基于用户对图书的评分而对指定的用户个性化举荐的网站零碎。(ps:本文中介绍的是算法的简略示例, 如需我的项目性能扩大,可在最下方分割我

协同过滤算法

协同过滤是一种罕用于举荐零碎中的算法,用于预测用户可能感兴趣的物品或内容。它的核心思想是基于用户行为和相似性来进行预测,而不依赖于物品或用户的内容特色。协同过滤算法依据用户和物品之间的交互历史,发现用户之间的相似性或物品之间的相似性,从而为用户生成个性化的举荐列表。
协同过滤算法能够分为两种次要类型:基于用户的协同过滤和基于物品的协同过滤。

  1. 基于用户的协同过滤:这种办法首先计算用户之间的相似性,而后利用与指标用户类似的其余用户的偏好来预测指标用户对物品的评分或爱好。基于用户的协同过滤通常包含以下步骤:

    • 相似性计算:应用一些相似性度量(如余弦类似度、皮尔逊相关系数等)来计算用户之间的相似性。
    • 街坊抉择:选取与指标用户最类似的一些用户作为街坊。
    • 预测生成:利用街坊用户对物品的评分来预测指标用户对尚未互动过的物品的评分。
  2. 基于物品的协同过滤:这种办法通过计算物品之间的相似性来预测用户对尚未互动过的物品的评分或爱好。基于物品的协同过滤个别包含以下步骤:

    • 相似性计算:计算物品之间的相似性,通常与用户的历史行为相干。
    • 街坊抉择:选取与指标物品最类似的一些物品作为街坊。
    • 预测生成:基于指标用户对邻近物品的评分,预测用户对尚未互动过的物品的评分。

协同过滤算法的长处在于它可能捕获用户和物品之间的简单关系,从而提供个性化的举荐。然而,它也面临一些挑战,比方“冷启动”问题(新用户或新物品如何进行举荐)、数据稠密性(用户和物品之间的交互数据可能非常少)、举荐偏差(可能会漠视一些长尾物品)等。

代码示例

在本文中通过应用 Django 框架作为网站开发的后端框架。其数据表模型构造如下:

  • db_user_info:用户信息表
  • db_book:书籍表
  • db_rating:书籍评分表

在本文中通过应用基于用户的协同过滤算法,在计算类似度时选用余弦类似度计算公式。余弦类似度掂量两个向量之间的方向统一水平。在这里,向量是用户对独特评估过的图书的评分。余弦类似度计算公式为:

$$
cosine_similarity = \frac{\sum_{i} user1\_scores[i] \times user2\_scores[i]}{\sqrt{\sum_{i} user1\_scores[i]^2} \times \sqrt{\sum_{i} user2\_scores[i]^2}}
$$

代码如下:

def calculate_cosine_similarity(user_ratings1, user_ratings2):
    # 将用户 1 的图书评分存入字典,键为图书 ID,值为评分
    book_ratings1 = {rating.book_id: rating.score for rating in user_ratings1}
    # 将用户 2 的图书评分存入字典,键为图书 ID,值为评分
    book_ratings2 = {rating.book_id: rating.score for rating in user_ratings2}

    # 找出两个用户独特评估过的图书
    common_books = set(book_ratings1.keys()) & set(book_ratings2.keys())

    if len(common_books) == 0:
        return 0.0  # 无独特评估的图书,类似度为 0

    # 提取独特评估图书的评分,存入 NumPy 数组
    user1_scores = np.array([book_ratings1[book_id] for book_id in common_books])
    user2_scores = np.array([book_ratings2[book_id] for book_id in common_books])

    # 计算余弦类似度
    cosine_similarity = np.dot(user1_scores, user2_scores) / (np.linalg.norm(user1_scores) * np.linalg.norm(user2_scores))
    return cosine_similarity

其中,user1_scores 和 user2_scores 是两个用户的评分向量,i 是独特评估过的图书的索引。实现步骤如下:

首先遍历所用其余的用户,对于每个其余用户计算与指标用户的余弦类似度。如果类似度大于 0,那么遍历其余用户评估的图书,创立举荐记录包含加权评分和类似度。而后依照分数大小降序排列。将对应的图书名称信息等返回给用户。

试验成果

Python 网站开发、我的项目订制、请分割 V:sql2201

正文完
 0