首页 > 编程语言 >Python+协同过滤算法实现一个简单的图书推荐系统

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

时间:2023-08-29 13:56:39浏览次数:45  
标签:Python 过滤 用户 评分 算法 book scores 物品

image

背景介绍

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

协同过滤算法

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

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

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

代码示例

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

  • 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

标签:Python,过滤,用户,评分,算法,book,scores,物品
From: https://www.cnblogs.com/shiqianlong/p/17664548.html

相关文章

  • 《最新出炉》系列初窥篇-Python+Playwright自动化测试-14-playwright操作iframe-番外
    1.简介通过前边三篇的学习,想必大家已经对iframe有了一定的认识和了解,今天这一篇主要是对iframe的一些特殊情况的介绍和讲解,主要从iframe的定位、监听事件和执行js脚本三个方面进行展开介绍。2.iframe定位2.1动态id属性如何定位有时候,我们可能看到的iframe的id不是固定的,是动......
  • 素性测试--Miller-Rabin算法
    引子今天(23/8/16),老师问了一个有趣的问题:出道题给大家,111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111131111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111是不是素数......
  • Lnton羚通视频分析算法平台【PyTorch】教程:torch.nn.maxpool2d
    torch.nn.MaxPool2d是PyTorch中的一个二维最大池化层。它用于在神经网络中执行最大池化操作,以减少特征图的空间尺寸并提取出主要特征。torch.nn.MaxPool2d的常用语法如下:torch.nn.MaxPool2d(kernel_size,stride=None,padding=0,dilation=1,return_indices=False,ceil_mode......
  • [代码随想录]Day30-贪心算法part04
    题目:860.柠檬水找零思路:收到钱三种情况:5刀:直接收起来就可以了,不需要找钱10刀:收到10刀,需要找5刀,如果没有5刀,就返回false,否则5刀-120刀:收到20刀(但是没用,找钱也不能找20所以不需要记录数量),优先考虑找105,因为10只能在这里用,其次再考虑找555代码:funclemonadeChange(bil......
  • 【数据结构与算法】TypeScript 实现图结构
    classGrapg<T>{//用于存储所有的顶点verteces:T[]=[];//用于存储所有的边采用邻接表的形式adjList:Map<T,T[]>=newMap();//添加顶点addVertex(v:T){this.verteces.push(v);//初始化顶点的邻接表this.adjList.set(v,[]);}......
  • C++算法
    运行前进行卡夫曼滤波(减小机器检测波动的影响)延迟上机算法速率法原理1、判断最新数据点和前面几个点的差值是否大于设定值2、判断两点间的斜率k是否大于设定值3、判断拟合曲线的符合度是否在规定范围内技术实现///\brief直线拟合-一元回归,拟......
  • Python连接Neo4j工具比较 Neo4j Driver、py2neo
    Python有许多可以连接Neo4j的库和工具,以下是一些常用的:Neo4jDriverforPython这是官方提供的Python驱动程序,它使用Cypher查询语言与Neo4j数据库进行交互。您可以使用此驱动程序与Neo4j数据库建立连接,执行查询和管理事务。优点:官方提供的驱动程序,支持最新的Neo4j版本,提供完整......
  • Python学习 -- 枚举类
    当谈到在Python中管理一组常量或者枚举类型的时候,Enum(枚举)类是一个非常有用的工具。Python的Enum类允许你创建具有有意义的、可读性高的常量集合,而不必使用硬编码的数字或字符串。在本篇博客中,我们将深入探讨Python中的Enum类,包括如何定义、使用和高级技巧,同时提供详细的代码案例。......
  • 安装python3.5并在QT中配置使用
    一、安装32位的python3.5及各种库链接:https://pan.baidu.com/s/1q94_Vo3XDhfZ_hmssPjz6w提取码:zotf先在dos环境下输入python,如果显示版本则表示python安装成功,安装库文件的时候,在dos环境下进入whl文件所在的目录,然后使用pipinstall***-whl。如果提示pip版本过低,则按照提示更新pip......
  • python工程打包可执行exe
    1、打包配置文件HuiMergeDemo_x64.spec#-*-mode:python;coding:utf-8-*-block_cipher=Nonea=Analysis(['HuiMergeDemo.py','D:\\HuiMerge\\__init__.py'],pathex=['D:\\HuiMerge'],binaries=[]......