当前位置: 首页 > news >正文

基于深度学习的图书管理推荐系统(python版)

基于深度学习的图书管理推荐系统

1、效果图

在这里插入图片描述

1/1 [==============================] - 0s 270ms/step
[13 11  4 19 16 18  8  6  9  0]
[0.1780757  0.17474999 0.17390694 0.17207369 0.17157653 0.168248440.1668652  0.16665359 0.16656876 0.16519257]
keras_recommended_book_ids深度学习推荐列表 [9137, 10548, 1, 10546, 2, 1024, 10, 10550, 7, 512]

2、算法原理

​ 使用Keras框架实现一个简单的深度学习推荐算法。Keras是建立在Python之上的高级神经网络API。Keras提供了一种简单、快速的方式来构建和训练深度学习模型。

​ 根据用户对书籍的评分表,使用Emmbeding深度学习训练得到一个模型,预测用户可能评分高的书籍,并把前5本推荐给用户。

Emmbeding是从离散对象(如书籍 ID)到连续值向量的映射。
这可用于查找离散对象之间的相似性。
Emmbeding向量是低维的,并在训练网络时得到更新。
设计一个模型,将用户id作为用户向量,物品id作为物品向量。
分别Emmbeding两个向量,再Concat连接起来,最后加上3个全连接层构成模型,进行训练。
使用adam优化器,用均方差mse来衡量预测评分与真实评分之间的误差

流程图:
在这里插入图片描述

3、算法流程

1、从数据库中读取评分表信息并转成二维数组
2、数据预处理,把用户id,物品id映射成顺序字典
3、统计用户数量、物品数量
4、划分训练集与测试集
5、构建Embedding模型并进行数据训练得到模型
6、调用模型预测评分高的物品并推荐给用户

4、主体代码

# -*- coding: utf-8 -*-"""
@contact: 微信 1257309054
@file: recommend_keras.py
@time: 2024/3/30 16:21
@author: LDC
使用Keras框架实现一个深度学习推荐算法
"""import os
import django
from django.conf import settingsos.environ["DJANGO_SETTINGS_MODULE"] = "book_manager.settings"
django.setup()import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import pymysql
from sklearn.model_selection import train_test_split
import warningswarnings.filterwarnings('ignore')from book.models import UserSelectTypes, LikeRecommendBook, Book, RateBook
from keras.layers import Input, Embedding, Flatten, Dot, Dense, Concatenate, Dropout
from keras.models import Modelfrom keras.models import load_modeldef get_select_tag_book(user_id, book_id=None):# 获取用户注册时选择的书籍类别各返回10门书籍category_ids = []us = UserSelectTypes.objects.get(user_id=user_id)for category in us.category.all():category_ids.append(category.id)unlike_book_ids = [d['book_id'] for d inLikeRecommendBook.objects.filter(user_id=user_id, is_like=0).values('book_id')]if book_id and book_id not in unlike_book_ids:unlike_book_ids.append(book_id)book_list = Book.objects.filter(tags__in=category_ids).exclude(id__in=unlike_book_ids).distinct().order_by("-like_num")[:10]return book_listdef get_data():'''从数据库获取数据'''conn = pymysql.connect(host=settings.DATABASE_HOST,user=settings.DATABASE_USER,password=settings.DATABASE_PASS,database=settings.DATABASE_NAME,charset='utf8mb4',use_unicode=True)sql_cmd = 'SELECT book_id, user_id,mark FROM rate_book'dataset = pd.read_sql(sql=sql_cmd, con=conn)conn.close()  # 使用完后记得关掉return datasetdef preprocessing(dataset):'''数据预处理'''book_val_counts = dataset.book_id.value_counts()book_map_dict = {}for i in range(len(book_val_counts)):book_map_dict[book_val_counts.index[i]] = i# print(map_dict)dataset["book_id"] = dataset["book_id"].map(book_map_dict)user_id_val_counts = dataset.user_id.value_counts()# 映射字典user_id_map_dict = {}for i in range(len(user_id_val_counts)):user_id_map_dict[user_id_val_counts.index[i]] = i# 将User_ID映射到一串字典dataset["user_id"] = dataset["user_id"].map(user_id_map_dict)return dataset, book_map_dict, user_id_map_dictdef train_model():'''训练模型'''dataset = get_data()  # 获取数据dataset, book_map_dict, user_id_map_dict = preprocessing(dataset)  # 数据预处理n_users = len(dataset.user_id.unique())  # 统计用户数量print('n_users', n_users)n_books = len(dataset.book_id.unique())  # 统计书籍数量print('n_books', n_books)# 划分训练集与测试集train, test = train_test_split(dataset, test_size=0.2, random_state=42)# 开始训练# creating book embedding pathbook_input = Input(shape=[1], name="Book-Input")book_embedding = Embedding(n_books + 1, 5, name="Book-Embedding")(book_input)Dropout(0.2)book_vec = Flatten(name="Flatten-Books")(book_embedding)# creating user embedding pathuser_input = Input(shape=[1], name="User-Input")user_embedding = Embedding(n_users + 1, 5, name="User-Embedding")(user_input)Dropout(0.2)user_vec = Flatten(name="Flatten-Users")(user_embedding)# concatenate featuresconc = Concatenate()([book_vec, user_vec])# add fully-connected-layersfc1 = Dense(128, activation='relu')(conc)Dropout(0.2)fc2 = Dense(32, activation='relu')(fc1)out = Dense(1)(fc2)# Create model and compile itmodel2 = Model([user_input, book_input], out)model2.compile('adam', 'mean_squared_error')history = model2.fit([train.user_id, train.book_id], train.mark, epochs=10, verbose=1)model2.save('regression_model2.h5')loss = history.history['loss']  # 训练集损失# 显示损失图像plt.plot(loss, 'r')plt.title('Training loss')plt.xlabel("Epochs")plt.ylabel("Loss")plt.show()print('训练完成')def predict(user_id, dataset):'''将预测评分高的图书推荐给该用户user_id'''model2 = load_model('regression_model2.h5')'''先拿到所有的图书索引ISBN,并去重成为book_data。再添加一个和book_data长度相等的用户列表user,不过这里的user列表中的元素全是1,因为我们要做的是:预测第1个用户对所有图书的评分,再将预测评分高的图书推荐给该用户。'''book_data = np.array(list(set(dataset.book_id)))user = np.array([user_id for i in range(len(book_data))])predictions = model2.predict([user, book_data])# 更换列->行predictions = np.array([a[0] for a in predictions])# 根据原array,取其中数值从大到小的索引,再只取前top10recommended_book_ids = (-predictions).argsort()[:10]print(recommended_book_ids)print(predictions[recommended_book_ids])return recommended_book_idsdef embedding_main(user_id, book_id=None, is_rec_list=False):'''1、获取数据、数据预处理2、划分训练集与测试集3、训练模型、模型评估4、预测user_id: 用户idbook_id: 用户已经评分过的书籍id,需要在推荐列表中去除is_rec_list: 值为True:返回推荐[用户-评分]列表,值为False:返回推荐的书籍列表'''dataset = get_data()  # 获取数据# print(dataset.head())if user_id not in dataset.user_id.unique():# 用户未进行评分则推荐注册时选择的图书类型print('用户未进行评分则推荐注册时选择的图书类型')if is_rec_list:return []# 推荐列表为空,按用户注册时选择的书籍类别各返回10门return get_select_tag_book(user_id, book_id)dataset, book_map_dict, user_id_map_dict = preprocessing(dataset)# user_id需要转换为映射后的user_id传到predict函数中predict_book_ids = predict(user_id_map_dict[user_id], dataset)  # 预测的书籍Idrecommend_list = []  # 最后推荐的书籍id# 把映射的值转为真正的书籍idfor book_id in predict_book_ids:for k, v in book_map_dict.items():if book_id == v:recommend_list.append(k)print('keras_recommended_book_ids深度学习推荐列表', recommend_list)if not recommend_list:# 推荐列表为空,且is_rec_list: 值为True:返回推荐[用户-评分]列表if is_rec_list:return []# 推荐列表为空,按用户注册时选择的书籍类别return get_select_tag_book(user_id, book_id)if is_rec_list:# 推荐列表不为空,且且is_rec_list: 值为True:返回推荐[用户-评分]列表return recommend_list# 过滤掉用户反馈过不喜欢的书籍unlike_book_ids = [d['book_id'] for d inLikeRecommendBook.objects.filter(user_id=user_id, is_like=0).values('book_id')]# 过滤掉用户已评分的数据already_mark_ids = [d['book_id'] for d in RateBook.objects.filter(user_id=user_id).values('book_id')]unrecommend = list(set(unlike_book_ids + already_mark_ids))if book_id and book_id not in unrecommend:unrecommend.append(book_id)book_list = Book.objects.filter(id__in=recommend_list).exclude(id__in=unrecommend).distinct().order_by("-like_num")return book_listif __name__ == '__main__':train_model() # 训练模型embedding_main(2) # 调用模型

输出:
在这里插入图片描述

相关文章:

基于深度学习的图书管理推荐系统(python版)

基于深度学习的图书管理推荐系统 1、效果图 1/1 [] - 0s 270ms/step [13 11 4 19 16 18 8 6 9 0] [0.1780757 0.17474999 0.17390694 0.17207369 0.17157653 0.168248440.1668652 0.16665359 0.16656876 0.16519257] keras_recommended_book_ids深度学习推荐列表 [9137…...

MATLAB 点云随机渲染赋色(51)

MATLAB 点云随机渲染赋色(51) 一、算法介绍二、算法实现1.代码2.效果总结一、算法介绍 为点云中的每个点随机赋予一种颜色,步骤和效果如图: 1、读取点云 (ply格式) 2、随机为每个点的RGB颜色字段赋值 3、保存结果 (ply格式) 二、算法实现 1.代码 代码如下(示例):…...

通过一篇文章让你完全掌握VS和电脑常用快捷键的使用方法

VS常用快捷键 前言一、 VS常用快捷键常用VS运行调试程序快捷键常用VS编辑程序快捷键 二、常用windows系统操作快捷键 前言 VS(Visual Studio)是一款强大的开发工具,提供了许多常用快捷键,以提高开发效率。这些快捷键包括文件操作…...

ChatGPT指引:借助ChatGPT撰写学术论文的技巧

ChatGPT无限次数:点击直达 ChatGPT指引:借助ChatGPT撰写学术论文的技巧 在当今信息技术高度发达的时代,人工智能技术的不断发展为学术研究者提供了更多的便利和可能。其中,自然语言处理技术中的ChatGPT无疑是一种强大的工具,它能…...

魔改一个过游戏保护的CE

csdn审核不通过 网易云课堂有配套的免费视频 int0x3 - 主页 文章都传到github了 Notes/外挂/魔改CE at master MrXiao7/Notes GitHub 为什么要编译自己的CE 在游戏逆向的过程中,很多游戏有保护,我们运行原版CE的时候会被检测到 比如我们开着CE运…...

rust嵌入式开发之await

嵌入式经常有类似通过串口发送指令然后等待响应再做出进一步反应的需求。比如,通过串口以AT命令来操作蓝牙模块执行扫描、连接,需要根据实际情况进行操作,复杂的可能需要执行7、8条指令才能完成连接。 对于这样的需求,如果用异步…...

UE4_碰撞_碰撞蓝图节点——Line Trace For Objects(对象的线条检测)

一、Line Trace For Objects(对象的线条检测):沿给定线条执行碰撞检测并返回遭遇的首个命中,这只会找到由Object types指定类型的对象。注意他与Line Trace By Channel(由通道检测线条)的区别,一个通过Obje…...

抽象类和接口的简单认识

目录 一、抽象类 1.什么是抽象类 2.抽象类的注意事项 3.抽象类与普通类的对比 二、接口 1.接口的简单使用 2.接口的特性 3.接口的使用案例 4.接口和抽象类的异同 一、抽象类 所谓抽象类,就是更加抽象的类,也就是说,这个类不能具体描…...

python-pytorch获取FashionMNIST实际图片标签数据集

在查看pytorch官方文档的时候,在这里链接中https://pytorch.org/tutorials/beginner/basics/data_tutorial.html的Creating a Custom Dataset for your files章节,有提到要自定义数据集,需要用到实际的图片和标签。 在网上找了半天没找到&a…...

深入探秘Python生成器:揭开神秘的面纱

一、问题起源: 想象一下,您掌握了一种魔法,在代码世界里,您可以轻松呼唤出一个整数。然而,事情并不总是看起来那样简单。在Python的奇妙王国中,我遇到了一个有趣的谜题: def tst():try:print(…...

红队攻防渗透技术实战流程:红队目标信息收集之批量信息收集

红队资产信息收集 1. 自动化信息收集1.1 自动化信息收集工具1.2 自动域名转换IP工具1.3 自动企业信息查询工具1.4 APP敏感信息扫描工具1.5 自动化信息工具的使用1.5.1 资产灯塔系统(ARL)1.5.1.1 docker环境安装1.2.2.9.1 水泽-信息收集自动化工具1. 自动化信息收集 1.1 自动化…...

【vue3学习笔记(二)】(第141-143节)初识setup;ref函数_处理基本类型;ref函数_处理对象类型

尚硅谷Vue2.0Vue3.0全套教程丨vuejs从入门到精通 本篇内容对应课程第141-143节 课程 P141节 《初识setup》笔记 1、setup是所有组合式API“表演的舞台”,组件中所用到的所有数据、方法、监视数据、生命周期钩子等都需要配置在setup中。 2、setup的两种返回值&…...

若依框架学习使用

若依官网项目拉取下来介绍 | RuoYi 项目运行: 1.idea安装,可以运行前后端 编辑器idea、jdk环境安装、数据库mysql、navicat工具、redis(redis-server启动)安装 2.navicat数据库连接, 创建数据库ry-vue并导入数据脚本ry_2021xxxx.sql,qua…...

蓝桥杯_数学模板

1.试除法判定质数 #include <iostream> using namespace std;bool is_zs(int x) {if(x<2) return false;for(int i2;i<x/i;i)if(x%i0)return false;return true; }int main() {int n; cin>>n;while(n--){int x; cin>>x;if(is_zs(x)) cout<<&quo…...

稀碎从零算法笔记Day31-LeetCode:接雨水

半月一去&#xff0c;望舒一轮&#xff0c;明天开始攻坚哈德题了 前言&#xff1a;非常经典的一道笔试题&#xff0c;看了保证血赚&#xff08;今天银泰星笔试第四题就是这个&#xff09; 题型&#xff1a;dp、模拟、双指针…… 链接&#xff1a;42. 接雨水 - 力扣&#xff…...

微前端的使用和注意事项 - qiankun

一、为什么使用微前端 微前端架构旨在解决单体应用在一个相对长的时间跨度下&#xff0c;由于参与的人员、团队的增多、变迁&#xff0c;从一个普通应用演变成一个巨石应用(Frontend Monolith)后&#xff0c;随之而来的应用不可维护的问题。微前端的核心目标是将巨石应用拆解成…...

uniapp微信小程序消息订阅详解

一、微信公众平台申请订阅模板 注意&#xff1a;订阅信息 这个事件 是 当用户 点击的时候触发 或者 是 支付成功后触发&#xff0c; 用户勾选 “总是保持以上选择&#xff0c;不再询问” 之后或长期订阅&#xff0c;下次订阅调用 wx.requestSubscribeMessage 不会弹窗&#xf…...

git 查看文件夹结构树

在Git中&#xff0c;没有直接的命令可以像文件系统那样展示一个可视化的文件结构树。但是&#xff0c;你可以使用一些外部工具或命令来达到这个目的。 以下是一些方法&#xff0c;你可以使用它们来查看Git仓库的文件结构树&#xff1a; 使用tree命令&#xff08;如果你的系统已…...

设计模式一详解

一、观察者模式 当一个对象状态发生改变时&#xff0c;依赖它的对象全部会收到通知&#xff0c;并自动更新 场景&#xff1a;一个事件发生后&#xff0c;要执行一连串更新操作。传统的编程方式&#xff0c;就是在事件的代码之后直接加入处理逻辑。当更新的逻辑增多之后&#x…...

python 进程、线程、协程基本使用

1、进程、线程以及协程【1】进程概念【2】线程的概念线程的生命周期进程与线程的区别 【3】协程(Coroutines) 2、多线程实现【1】threading模块【2】互斥锁【3】线程池【4】线程应用 3、多进程实现4、协程实现【1】yield与协程【2】asyncio模块【3】3.8版本【4】aiohttp 1. 并发…...

SQLite3进行数据库各项常用操作

目录 前言1、SQLite介绍2、通过SQLite创建一个数据库文件3、往数据库文件中插入数据4、数据库文件信息查询5、修改数据库中的内容6、删除数据库中的内容 前言 本文是通过轻量化数据库管理工具SQLite进行的基础操作和一些功能实现。 1、SQLite介绍 SQLite是一个广泛使用的嵌入…...

Debian GNU/Linux 安装docker与docker compose

安装 Docker 更新包列表 sudo apt update 安装必要的软件包&#xff0c;以便让 APT 可以通过 HTTPS 使用存储库&#xff1a; sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common 添加 Docker 的官方 GPG 密钥&#xff1a; cu…...

图片标注编辑平台搭建系列教程(2)——fabric.js简介

文章目录 综述数据管理图形渲染图形编辑事件监听预告 综述 fabric提供了二维图形编辑需要的所有基础能力&#xff0c;包括&#xff1a;数据管理、图形渲染、图形编辑和事件监听。其中&#xff0c;图形编辑可以通过事件监听和图形渲染来实现&#xff0c;所以可以弃用。数据管理…...

Debian linux版本下运行的openmediavault网盘 千兆网卡升级万兆

一、适用场景 1、使用vmware ESXi虚拟化平台运行多种不同应用服务器时&#xff0c;其中网盘服务器采用开源的openmediavault搭建&#xff1b; 2、将老专业服务器升级千兆网为万兆网&#xff1b; 3、需要转移的数据量大的企业或用户&#xff1b; 4、从服务器到服务器的数据转移…...

前端 CSS 经典:grid 栅格布局

前言&#xff1a;Grid 布局是将容器划分成"行"和"列"&#xff0c;产生单元格&#xff0c;然后将"项目"分配给划分好的单元格&#xff0c;因为有行和列&#xff0c;可以看作是二维布局。 一 术语 1. 容器 采用网格布局的区域&#xff0c;也就是…...

多输入多输出通道

文章目录 图像卷积填充和步幅填充步幅 多输入多输出通道1x1卷积层 图像卷积 卷积原理: 就是将之前的大的图片,定义一个核函数,然后经过移动并运算将图片变小了.也就是将图像压缩提取整合特征值. 这里利用的时乘法. 填充和步幅 填充 在应用多层卷积时&#xff0c;我们常常…...

http响应练习—在服务器端渲染html(SSR)

一、什么是服务器端渲染&#xff08;SSR&#xff09; 简单说&#xff0c;就是在服务器上把网页生成好&#xff0c;整个的HTML页面生成出来&#xff0c;生成出的页面已经包含了所有必要的数据和结构信息&#xff0c;然后直接发给浏览器进行展现。 二、例题 要求搭建http服务&a…...

C++(8): std::deque的使用

1. std::deque std::deque 是 C 标准库中的一个双端队列容器。这个容器支持在序列的两端进行快速的插入和删除操作&#xff0c;其时间复杂度为常数时间 O(1)。同时&#xff0c;std::deque 也提供了对序列中任意元素的随机访问。 2. 特点 &#xff08;1&#xff09;双端操作&…...

openwrt开发包含路由器基本功能的web问题记录

1.这里的扫描怎么实现的先找一些luci代码&#xff0c;在openwrt21版本后&#xff0c;luci用js替换了lua写后台&#xff0c;先找一些代码路径 在openrwt15这部分代码是在这个目录下 feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/wifi_join.htm 里面包含…...

HarmonyOS ArkTS 骨架屏加载显示(二十五)

目录 前言1、骨架屏代码显示2、代码中引用3、效果图展示 前言 所谓骨架屏&#xff0c;就是在页面进行耗时加载时&#xff0c;先展示的等待 UI, 以告知用户程序目前正在运行&#xff0c;稍等即可。 等待的UI大部分是 loading 转圈的弹窗&#xff0c;有的是自己风格的小动画。其实…...

东莞营销商城网站建设/服装品牌策划方案

实际操作步骤&#xff1a; 输入brew install nginx-full --with-rtmp-module命令出现以下报错&#xff1a; 需要先安装nginx服务器&#xff0c;运行命令brew tap homebrew/nginx&#xff0c;出现报错&#xff1a; 换一个github项目&#xff0c;即运行命令brew tap denji/nginx …...

网站页面组成部分/企业培训师

1.CtrlALTF1 进入控制台 2.输入用户名和密码进入系统 3.输入以下命令: cd /etc/X11 sudo cp xorg.conf.failsafe xorg.conf sudo reboot 进入系统后感觉到明显的卡顿&#xff0c;查看分辨率很低&#xff0c;而且在vm下无法全屏 解决办法&#xff1a; sudo apt-get updata…...

服装网站源码php/搜索引擎优化关键词的处理

RelativeLayout&#xff1a;基于其他控件&#xff08;包括同容器中控件和容器(父)控件&#xff09;的layout 相对于容器控件&#xff08;父控件&#xff09; android:layout_alignParentLeft"true" 将控件的左边缘和父控件的左边缘对齐 RelativeLayout andro…...

wordpress浏览统计/中国足球世界排名

查看linux的重启记录&#xff1a; last | grep reboot 与之类似可以查看Linux的关机记录&#xff1a; last | grep shutdown...

网站建设 东八区/企业网站建设的重要性

部分代码&#xff08;完整包见资源下载链接&#xff09; 注&#xff1a;资源上传时默认付费&#xff0c;可以私信我&#xff0c;我看到会回复的 <!doctype html> <html><head><meta charset"utf-8"><meta http-equiv"X-UA-Compatib…...

星沙做淘宝店铺网站/百度搜索资源管理平台

visible, disable, css绑定 这个例子非常简单&#xff0c;主要演示如何通过属性控制html元素的显示与否&#xff08;visible&#xff09;&#xff0c;可用性&#xff08;disable&#xff09;以及根据属性添加相应的CSS样式。 先简单的看一段代码&#xff1a; <p><inpu…...