python版协同过滤算法图书管理系统

news2025/1/14 18:03:15

基于协同过滤算法的图书管理系统

在这里插入图片描述

一、简介(v信:1257309054)

​ 本系统基于推荐算法给用户实现精准推荐图书。

​ 根据用户对物品或者信息的偏好,发现物品或者内容本身的相关性,或者是发现用户的相关性,然后再基于这些关联性进行推荐,种被称为基于协同过滤的推荐。

​ 本系统使用了三种推荐算法:基于用户的协同过滤算法、基于物品的协同过滤算法、基于机器学习k-means聚类的过滤算法,以及三种算法的混合推荐算法。

​ 主要功能如下图:

在这里插入图片描述

二、使用到的技术

​ 开发语言是python3.7,框架是Django3.0,采用的是djanog前后端相结合的技术,后台管理系统是xadmin,数据库是Mysql5.7。

1、Django的MTV架构

​ 所谓MTV就是:数据模型(M)-前端界面(T)-调度控制器(V).

用户在浏览器发起一个请求:通过V对M和T进行连接,用户通过T(界面)对服务器进行访问(发送请求),T把请求传给V(调度),V调用M(数据模型)获取数据,把数据给模板T进行渲染,然后再把渲染后的模板返回给用户。
MTV框架是一种 把业务逻辑、数据、界面显示分离而设计创建的Web应用程序的开发模式。在web开发中应该尽量使代码高内聚低耦合,这样利于代码复用、维护、管理,MTV框架就是这样分层的。
M对应于Model,即数据模型(数据层),用于管理数据库,对数据进行增删改查;
T对应于视图,template(即T),模板,用于管理html文件,呈现给用户的界面;
V对应于控制层,views(即V),视图调度器,用于访问数据层,获取数据,把数据调度给模板进行渲染,把渲染的结果返回给客户端。
MTV框架的大体流程是:
1、客户端发起请求,路由对客户发起的请求进行统一处理和分发给控制层;
2、控制层获取请求,访问数据层;
3、数据层对数据进行增删改查,把数据返回给控制层;
4、控制层获取数据,把数据调度给视图(模板);
5、视图(模板)对数据进行渲染,形成html文件返回给控制层;
6、控制层把渲染后的视图(模板)返回给客户端。

三、开发流程

​ 1、环境搭建:创建虚拟环境、创建数据库

​ 2、创建数据库模型:用户表、图书标签表、用户选择类型表(用户解决推荐算法冷启动问题)、借书清单表、购书清单表、评分表、收藏表、点赞表、评论表、推荐反馈表。然后数据迁移,把表映射到数据库中。

​ 3、爬取数据,然后把数据经过预处理存放到数据库中。

​ 4、编写用户界面框架,完成各种功能点击响应事件

​ 5、编写后台管理文件,管理数据。

​ 6、系统测试,检验完成的功能。

具体开发过程可以查看【开发文档.pdf】

四、主要功能

1、前台用户

启动项目后,浏览器输入127.0.0.1:8000即可打开前端界面。

登录注册、修改密码、搜索、全部书籍、点赞收藏、评论评分、新书速递、热门书籍、图书分类、猜你喜欢、借阅书籍、购买书籍、购物车、个人中心。

1.1、注册界面

在这里插入图片描述

​ 支付密码用于用户在购买书籍时模拟支付场景。

1.2、登录界面

在这里插入图片描述

1.3、全部书籍界面

在这里插入图片描述

​ 书籍按照浏览量进行排序。

​ 点击图片可以进去查看具体的书籍内容。

​ 用户可以通过标题、作者进行搜索相关图书。

1.4、具体书籍

在这里插入图片描述

​ 具体书籍界面有书籍的封面、标题、作者、简介、评分信息、点赞、收藏信息、评论信息。低下还有推荐的三本图书。

1.5、新书速递

​ 按照图书上架时间返回书籍。

1.6、热门书籍

​ 按照收藏图书人数返回书籍。

1.7、图书分类

在这里插入图片描述

​ 根据不同的标签过滤显示该类型书籍。

1.8、猜你喜欢

​ 猜你喜欢是根据用户推荐不同的书籍。

​ 用户A刚注册登录时,由于用户A没有对书籍进行过评分,无法与其他用户、图书产生联系,所以只推荐用户A注册时选择的喜欢类型的图书。

​ 当用户A对图书进行评分后,后台会根据余弦相似度计算出跟该用户最相似的用户B,然后把推荐的用户B喜欢的图书推荐给用户A。

1.9、借阅书籍

在这里插入图片描述

​ 用户可以在平台上进行图书借阅,可以立即取走,也可以填写收货地址、电话号码进行邮寄。用户需要在规定的时间内归还,如果预期则扣除信誉值,当信誉值为0时将无法进行图书借阅。

1.20、购买书籍、购物车

在这里插入图片描述

​ 用户可以购买书籍并立即取走,也可添加到购物车,也可进行邮寄,填写地址、电话、支付密码模拟支付后即可。

1.21、个人中心

在这里插入图片描述

​ 可以修改密码、修改喜欢的图书类型、查看我的借阅、点赞、收藏、评论、评分。

2、后台管理

启动项目后,浏览器输入127.0.0.1:8000\xadmin可打开后台界面。
在这里插入图片描述

可以通过后台管理数据:上架借阅书籍、购买书籍、物流发货等。

五、算法说明

1、基于用户协同过滤推荐算法

基于用户的协同过滤算法:就是把和你相似的用户喜欢的东西推荐给你。

协同过滤:利用用户的群体行为来计算用户的相关性。计算用户相关性的时候我们就是通过对比他们对相同物品打分的相关度来计算的

举例:

--------+--------+--------+--------+--------+
        |   X    |    Y   |    Z   |    R   |
--------+--------+--------+--------+--------+
    a   |   5    |    4   |    1   |    5   |
--------+--------+--------+--------+--------+
    b   |   4    |    3   |    1   |    ?   |
--------+--------+--------+--------+--------+
    c   |   2    |    2   |    5   |    1   |
--------+--------+--------+--------+--------+

a用户给X物品打了5分,给Y打了4分,给Z打了1分

b用户给X物品打了4分,给Y打了3分,给Z打了1分

c用户给X物品打了2分,给Y打了2分,给Z打了5分

那么很容易看到a用户和b用户非常相似,但是b用户没有看过R物品,那么我们就可以把和b用户很相似的a用户打分很高的R物品推荐给b用户,这就是基于用户的协同过滤。

相关性

基于用户的协同过滤需要比较用户间的相关性,那么如何计算这个相关性呢?

我们可以利用两个用户对于相同物品的评分来计算相关性。

对于a,b用户而言,他们都对XYZ物品进行了评价,那么,a我们可以表示为(5,4,1),b可以表示为(4,3,1),经典的算法是把他们看作是两个向量,并计算两个向量间的夹角,或者说计算向量夹角的cosine值来比较,于是a和b的相关性为:
在这里插入图片描述

这个值介于-1到1之间,越大,说明相关性越大。

皮尔逊相关系数

到这里似乎cosine还是不错的,但是考虑这么个问题,用于用户间的差异,d用户可能喜欢打高分,e用户喜欢打低分,f用户喜欢乱打分。

--------+--------+--------+--------+
        |   X    |    Y   |    Z   |
--------+--------+--------+--------+
    d   |   4    |    4   |    5   |
--------+--------+--------+--------+
    e   |   1    |    1   |    2   |
--------+--------+--------+--------+
    f   |   4    |    1   |    5   |
--------+--------+--------+--------+

很显然用户d和e对于作品评价的趋势是一样的,所以应该认为d和e更相似,但是用cosine计算出来的只能是d和f更相似。于是就有皮尔逊相关系数(pearson correlation coefficient)。
在这里插入图片描述

pearson其实做的事情就是先把两个向量都减去他们的平均值,然后再计算cosine值。

等价公式:
在这里插入图片描述

其中E是数学期望,N表示变量取值的个数。

示例代码传送门

2、基于物品协同过滤推荐算法

2.1、基于⽤户的协同过滤算法(UserCF)

该算法利⽤⽤户之间的相似性来推荐⽤户感兴趣的信息,个⼈通过合作的机制给予信息相当程度的回应(如评分)并记录下来以达到过滤的⽬的进⽽帮助别⼈筛选信息,回应不⼀定局限于特别感兴趣的,特别不感兴趣信息的纪录也相当重要。

但两个问题,⼀个是稀疏性,即在系统使⽤初期由于系统资源还未获得⾜够多的评价,很难利⽤这些评价来发现相似的⽤户。

另⼀个是可扩展性,随着系统⽤户和资源的增多,系统的性能会越来越差。

算法讲解传送门

2.2、基于物品的协同过滤算法(ItemCF)

内容过滤根据信息资源与⽤户兴趣的相似性来推荐商品,通过计算⽤户兴趣模型和商品特征向量之间的向量相似性,主动将相似度⾼的商品发送给该模型的客户。

由于每个客户都独⽴操作,拥有独⽴的特征向量,不需要考虑别的⽤户的兴趣,不存在评价级别多少的问题,能推荐新的项⽬或者是冷门的项⽬。

这些优点使得基于内容过滤的推荐系统不受冷启动和稀疏问题的影响。

2.3、算法核心

通过分析用户行为记录(评分、购买、点击、浏览等行为)来计算两个物品的相似度,同时喜欢物品A和物品B的用户数越多,就认为物品A和物品B越相似。

2.4、流程
1.构建⽤户–>物品的对应表
2.构建物品与物品的关系矩阵(同现矩阵)
3.通过求余弦向量夹角计算物品之间的相似度,即计算相似矩阵
4.根据⽤户的历史记录,给⽤户推荐物品
2.5、构建用户与物品的对应关系表

如下表,⾏表⽰⽤户,列表⽰物品(电影),数字表⽰⽤户喜欢该物品的程度(评分)

用户\电影唐伯虎点秋香逃学威龙1追龙他人笑我太疯癫喜欢你暗战
A512
B423.5
C24
D43
E43
2.6、构建物品与物品的关系矩阵(共现矩阵)

共现矩阵C表⽰同时喜欢两个物品的⽤户数,是根据⽤户物品对应关系表计算出来的。

如根据上⾯的⽤户物品关系表可以计算出如下的共现矩阵C:

电影\电影唐伯虎点秋香逃学威龙1追龙他人笑我太疯癫喜欢你暗战
唐伯虎点秋香1111
逃学威龙1112
追龙11
他人笑我太疯癫2
喜欢你12
暗战12
2.7、计算相似矩阵

两个物品之间的相似度如何计算?

设|N(i)|表⽰喜欢物品i的⽤户数,|N(i)⋂N(j)|表⽰同时喜欢物品i,j的⽤户数,则物品i与物品j的相似度为:

在这里插入图片描述

利用公式计算物品之间的余弦相似矩阵如下:

电影\电影唐伯虎点秋香逃学威龙1追龙他人笑我太疯癫喜欢你暗战
唐伯虎点秋香0.410.70.50.5
逃学威龙10.410.580.82
追龙0.710.58
他人笑我太疯癫0.82
喜欢你0.51.0
暗战0.51.0
2.8、给用户推荐物品

根据⽤户的历史记录,给⽤户推荐物品。

最终推荐的是什么物品,是由预测兴趣度决定的。

物品j预测兴趣度=⽤户喜欢的物品i的兴趣度×物品i和物品j的相似度

例如:A⽤户喜欢唐伯虎点秋香逃学威龙1追龙 ,兴趣度分别为5,1,2

在用户A的评分电影列表中只有唐伯虎点秋香喜欢你有相似度,推荐喜欢你的预测兴趣度=5 x 0.5 = 2.5

在用户A的评分电影列表中只有唐伯虎点秋香暗战有相似度,推荐暗战的预测兴趣度=5 x 0.5 = 2.5

在用户A的评分电影列表中只有逃学威龙1他人笑我太疯癫有相似度,推荐他人笑我太疯癫的预测兴趣度=1 x 0.82 =0.82

3、基于机器学习K-means聚类推荐算法

原理:

从数据库中
1、首先获取书籍类别
2、获取用户注册时勾选喜欢的类别,勾选的为1,否则为0,得到一个样本数据
例:[1,0,1,0,0,...],[1,1,1,0,1,...],[0,0,1,0,0,...],
3、使用k-mean算法把用户分成6类【用户模型】
4、获取6类的【用户模型】的质心,比如[1,0,1,0,0,...]
把为1的类别找出来,然后获取该类别排行前3的书籍,组成一个推荐列表推荐给用户
5、类别书籍排行按收藏量来排序
6、用户购买书籍行为会动态更新样本数据

示例代码

六、程序文件说明

在这里插入图片描述

book是子应用名称,migrations是数据迁移文件,把数据模型映射到数据库中,templatetags是定义界面模板语法,__init__.py是导包文件,adminx.py存放的是后台管理代码,apps.py是子应用说明,forms.py是登录注册表单定义,models.py是数据模型,test.py是测试文件,urls.py是路由表,views.py是控制层调度器。

book_manager是项目应用管理起始文件夹,settings.py是项目数据库,静态文件等配置,urls.py是总路由表。

media保存的是媒体文件。

static保存的是界面的静态文件:css,html,js,图片等。

template保存的是前端界面模板代码。

book-k-mean.dat是k-means聚类后的模型。

manage.py是项目启动管理器。

recommend_books.py是推荐算法代码。

requirements.txt保存的是第三方库文件。

spider_get_data.py是爬虫代码。

七、数据库表说明

数据库表如下:

在这里插入图片描述

auth_groupauth_group_permissionsauth_permissions是后台管理的组、权限表。

auth_userauth_user_groupauth_user_groupsauth_user_user_permissions是后台管理用户数据表。

book是图书表。

book_tags是图书标签表。

borrow_list是图书借阅表。

collect_book是图书收藏表。

comment_book是图书评论表。

django_admin_log是原始后台管理日志表。

django_content_type是django应用内容表。

django_migrations是数据迁移文件表。

django_session是django缓存表。

like_book是图书点赞表。

like_recommend_book是图书推荐反馈表。

purchase_list是购物车表

rate_book是评分表。

tags是图书标签表。

user是用户表。

user_select_types是用户注册时选择喜欢的图书类型表。

user_select_types_category是一个多对多表,存放的是图书标签id与user_select_types表id的对应关系。

xadmin_bookmark是是后台管理的标签表。

xadmin_log是后台管理操作日志表。

xadmin_usersettings是后台管理用户设置表。

xadmin_userwidget是后台管理小组件表。

用内容表。

django_migrations是数据迁移文件表。

django_session是django缓存表。

like_book是图书点赞表。

like_recommend_book是图书推荐反馈表。

purchase_list是购物车表

rate_book是评分表。

tags是图书标签表。

user是用户表。

user_select_types是用户注册时选择喜欢的图书类型表。

user_select_types_category是一个多对多表,存放的是图书标签id与user_select_types表id的对应关系。

xadmin_bookmark是是后台管理的标签表。

xadmin_log是后台管理操作日志表。

xadmin_usersettings是后台管理用户设置表。

xadmin_userwidget是后台管理小组件表。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/387820.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Typora上传文档图片链接失效的问题+PicGo布置图床在Github

文章目录typora图片链接失效原因PicGO开源图床布置先配置Github2.1先创建新仓库、用于存放图片2.2生成一个token,用picGo访问github3.下载picGo,并进行配置3.1 配置v4.1typora图片链接失效原因 因为你是保存在本地的,因此图片是不能访问,可以…

laravel 邮件发送

配置 Laravel 的邮件服务可以通过 config/mail.php 配置文件进行配置。 邮件中的每一项都在配置文件中有单独的配置项,甚至是独有的「传输方式」,允许你的应用使用不同的邮件服务发送邮件 mailers > [smtp > [transport > smtp,host > env(M…

【超级猜图案例上半部分的实现 Objective-C语言】

一、超级猜图这么一个案例: 1.实现之后的效果是这样的: 1)中间有一个图片,点一下,能放大,背景变半透明的黑色: 2)再点一下图片,或者点周围黑色的阴影,图片回归原状, 3)右边有一个“大图”按钮,点一下,实现跟点图片一样的效果, 4)左边有一个“提示”按钮,点…

【Java学习笔记】4.Java 对象和类

前言 本章介绍Java的对象和类。 Java 对象和类 Java作为一种面向对象语言。支持以下基本概念: 多态继承封装抽象类对象实例方法重载 本节我们重点研究对象和类的概念。 对象:对象是类的一个实例(对象不是找个女朋友)&#x…

为什么人们宁可用Lombok,也不把成员设为public?

目录专栏导读一、从零了解JavaBean1、基本概念2、JavaBean的特征3、JavaBean的优点二、定义最简单的JavaBean三、思考一个问题,为何属性是private,然后用get/set方法?四、下面系统的分析以下,why?五、不和谐的声音,禁…

MySQL实战解析底层---行锁功过:怎么减少行锁对性能的影响

目录 前言 从两阶段锁说起 死锁和死锁检测 前言 MySQL 的行锁是在引擎层由各个引擎自己实现的但并不是所有的引擎都支持行锁,比如MyISAM 引擎就不支持行锁不支持行锁意味着并发控制只能使用表锁,对于这种引擎的表,同一张表上任何时刻只能有…

[深入理解SSD系列综述 1.5] SSD固态硬盘参数图文解析_选购固态硬盘就像买衣服?

版权声明:付费作品,未经许可,不可转载前言SSD (Solid State Drive),即固态硬盘,通常是一种以半导体闪存(NAND Flash)作为介质的存储设备。SSD 以半导体作为介质存储数据&…

Python进阶-----面对对象4.0(面对对象三大特征之--继承)

目录 前言: Python的继承简介 1.什么是继承 2.继承的好处 3.object类 继承的相关用法 1.继承的定义与法则 2.对继承的重写 3.(单继承)多层继承 4.多继承 5.多继承重写时调用父类方法 前言: 在讲之前,我想说说中…

servlet注解开发

文章目录servlet注解开发内容回顾响应对象 HttpServletResponse重定向与请求转发ServletConfig简介案例ServletContext简介案例Servlet 注解开发简介注解使用案例WebServlet 注解详细参数综合的增删改查案例登录注册功能servlet注解开发 内容回顾 响应对象 HttpServletRespon…

推荐一个日历转换开源工具库,支持C#、Java、PHP等主流的语言

更多开源项目请查看:一个专注推荐.Net开源项目的榜单 日历对我们来说,最熟悉的就是阳历和农历,在中国每年都有固定的节日、节气、中国特有传统节日,有些节日是固定的,但是节气这些都需要我们经过一定规则换算出来。 所…

【JavaSE】数组的定义和使用(上)

数组的定义和使用(上)6-数组的定义与使用1. 数组的基本概念1.1 为什么要使用数组1.2 什么是数组1.3 数组的创建及初始化1.3.1 数组的创建1.3.2 数组的初始化1.4 数组的使用1.4.1 数组中元素的访问1.4.2 遍历数组2. 数组是引用类型2.1 初始JVM的内存分布2…

【Python - Matplotlib】P1 Matplotlib2D 快速入门

Matplotlib 2D什么是,为什么选择快速上手三层结构图像层结构一览图画图三步法补充画布设置设定图像的长宽以及清晰度代码将图片保存前言 本节为 Matplotlib 简单专题第一节,简单介绍 Matplotlib 的结构,画图三步法,以及介绍一个简…

认识Spring(上)

作者:~小明学编程 文章专栏:Spring框架 格言:热爱编程的,终将被编程所厚爱。 目录 什么是spring 什么是IOC 传统开发 IOC DI spring的创建使用 pom.xml spring.xml 取出bean对象 ApplicationContext BeanFactory App…

【NLP相关】PyTorch多GPU并行训练(DataParallel和DistributedDataParallel介绍、单机多卡和多机多卡案例展示)

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…

@Transactional详解

一、事务的概念 百度百科: 事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执 行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL&#x…

第十四届蓝桥杯三月真题刷题训练——第 1 天

目录 题目1:数列求值 代码: 题目2:质数 代码: 题目3:饮料换购 代码: 题目1:数列求值 题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出…

vulnhub five86-1

总结:私钥登录,隐藏文件很多 目录 下载地址 漏洞分析 信息收集 网站渗透 爆破密码 提权 下载地址 Five86-1.zip (Size: 865 MB)Download (Mirror): https://download.vulnhub.com/five86/Five86-1.zip使用:下载以后打开压缩包,使用vm直…

数据结构(二)(嵌入式学习)

大 家 好 今天讲讲算法和哈希函数,数据结构基础请跳转数据结构(一) 数据结构干货总结(二)算法常见的数据结构及算法你以为我要都讲嘛??????&#…

SpringMVC源码:getHandler、getHandlerAdapter过程

参考资料: 《SpringMVC源码解析系列》 《SpringMVC源码分析》 《Spring MVC源码》 写在开头:本文为个人学习笔记,内容比较随意,夹杂个人理解,如有错误,欢迎指正。 前文: 《SpringMVC源码&a…

机器学习|多变量线性回归 | 吴恩达学习笔记

前文回顾:机器学习 | 线性回归(单变量) 目录 📚多维特征 📚多变量梯度下降 📚梯度下降法实践 🐇特征缩放 🐇学习率 📚特征和多项式回归 📚正规方程 &…