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

比特筑梦说
• 阅读 1065

背景介绍

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

协同过滤算法

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

  1. 基于用户的协同过滤: 这种方法首先计算用户之间的相似性,然后利用与目标用户相似的其他用户的偏好来预测目标用户对物品的评分或喜好。基于用户的协同过滤通常包括以下步骤:

    • 相似性计算: 使用一些相似性度量(如余弦相似度、皮尔逊相关系数等)来计算用户之间的相似性。
    • 邻居选择: 选取与目标用户最相似的一些用户作为邻居。
    • 预测生成: 利用邻居用户对物品的评分来预测目标用户对尚未互动过的物品的评分。
  2. 基于物品的协同过滤: 这种方法通过计算物品之间的相似性来预测用户对尚未互动过的物品的评分或喜好。基于物品的协同过滤一般包括以下步骤:

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

协同过滤算法的优点在于它能够捕捉用户和物品之间的复杂关系,从而提供个性化的推荐。然而,它也面临一些挑战,比如“冷启动”问题(新用户或新物品如何进行推荐)、数据稀疏性(用户和物品之间的交互数据可能非常少)、推荐偏差(可能会忽视一些长尾物品)等。

代码示例

在本文中通过使用Django框架作为网站开发的后端框架。其数据表模型结构如下:
Python+协同过滤算法实现一个简单的图书推荐系统

  • 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+协同过滤算法实现一个简单的图书推荐系统

Python网站开发、项目订制、请联系V:sql2201

点赞
收藏
评论区
推荐文章
Stella981 Stella981
3年前
Apache Mahout中推荐算法Slope one源码分析
关于推荐引擎如今的互联网中,无论是电子商务还是社交网络,对数据挖掘的需求都越来越大了,而推荐引擎正是数据挖掘完美体现;通过分析用户历史行为,将他可能喜欢内容推送给他,能产生相当好的用户体验,这就是推荐引擎。推荐算法Slopeone的原理      首先Slopeone是一种基于项目的协同过
Wesley13 Wesley13
3年前
1分钟了解相似性推荐
前几天聊的“协同过滤(CollaborativeFiltering)”和“基于内容的推荐(ContentbasedRecommendation)”,都必须分析用户的历史行为数据(例如电影点击数据,职位查看数据等),针对不同的用户进行个性化推荐。如果系统没有用户的历史行为数据积累,如何实施推荐呢?今天接着用通俗的语言说说推荐算法中的“相似性推
Easter79 Easter79
3年前
TensorFlow Ranking框架在海外推荐业务中的实践与应用
前言在当今互联网世界,推荐系统在内容分发领域扮演着至关重要的角色。如何尽可能的提升推荐系统的推荐效果,是每个推荐算法同学工作的核心目标。在爱奇艺海外推荐业务,引入TensorFlowRanking(TFR)框架,并在此基础上进行了研究和改进,显著提升了推荐效果。本文将分享TFR框架在海外推荐业务中的实践和应用。01算法的
Wesley13 Wesley13
3年前
User
1基于用户的协同过滤算法:基于用户的协同过滤算法是推荐系统中最古老的的算法,可以说是这个算法的诞生标志了推荐系统的诞生。该算法在1992年被提出,并应用于邮件过滤系统,1994年被GroupLens用于新闻过滤。在一个在线个性化推荐系统中,当一个用户A需要个性化推荐时,可以先找到和他有相似兴趣的其他用户,然后把那些用户喜欢的而用户A没有接触过的物品推
商品推荐系统浅析 | 京东云技术团队
本文主要做推荐系统浅析,主要介绍推荐系统的定义,推荐系统的基础框架,简单介绍设计推荐的相关方法以及架构。适用于部分对推荐系统感兴趣的同学以及有相关基础的同学,本人水平有限,欢迎大家指正。
京东云开发者 京东云开发者
5个月前
京东广告生成式召回基于 NVIDIA TensorRT-LLM 的推理加速实践
作者:京东零售陈航0000生成式推荐系统优势介绍推荐系统的主要任务是根据用户的历史行为预测其兴趣点,并向其推荐相应的商品。传统的推荐系统在处理用户请求时,会触发多个召回模块(包括热门商品召回、个性化召回、深度召回等),以召回大量候选商品。随后,系统通过相对
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
RALB负载均衡算法的应用 | 京东云技术团队
一、背景搜索推荐算法架构为京东集团所有的搜索推荐业务提供服务,实时返回处理结果给上游。部门各子系统已经实现了基于CPU的自适应限流,但是Client端对Server端的调用依然是RR轮询的方式,没有考虑下游机器性能差异的情况,无法最大化利用集群整体CPU,
【实践篇】推荐算法PaaS化探索与实践 | 京东云技术团队
目前,推荐算法部支持了主站、企业业务、全渠道等20业务线的900推荐场景,通过梳理大促运营、各垂直业务线推荐场景的共性需求,对现有推荐算法能力进行沉淀和积累,并通过算法PaaS化打造通用化的推荐能力,提升各业务场景推荐赋能效率,高效赋能业务需求。