基于深度学习的图书管理推荐系统(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) # 调用模型

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

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

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

相关文章

Windows提权!!!

之前讲过一下提权,但是感觉有点不成体系,所以我们就成体系的来讲一下这个操作系统的提权 目录 Windows的提权 1.Widnows的内核溢出提权 1.MSF自带的提权模块(Win11都能提上来,有点牛逼) 2.CS的插件提权 3.补丁对比…

透视未来安全:PIR技术引领数据隐私新时代

1.隐语实现PIR总体介绍 隐语实现的Private Information Retrieval (PIR) 是一种隐私增强技术,它使用户能够在不暴露他们实际查询内容的情况下从远程服务器数据库中检索所需信息。以下是隐语在实现PIR方面的概要说明和技术特点: 基本概念: PI…

【蓝桥杯】矩阵快速幂

一.快速幂概述 1.引例 1)题目描述: 求A^B的最后三位数表示的整数,A^B表示:A的B次方。 2)思路: 一般的思路是:求出A的B次幂,再取结果的最后三位数。但是由于计算机能够表示的数字…

[linux初阶][vim-gcc-gdb] TwoCharter: gcc编译器

目录 一.Linux中gcc编译器的下载与安装 二.使用gcc编译器来翻译 C语言程序 ①.编写C语言代码 ②翻译C语言代码 a.预处理 b.编译 c.汇编 d.链接 ③.执行Main 二进制可执行程序(.exe文件) 三.总结 一.Linux中gcc编译器的下载与安装 使用yum命令(相当于手机上的应用…

10_MVC

文章目录 JSON常用的JSON解析Jackson的常规使用指定日期格式 MVC设计模式MVC介绍前后端分离案例(开发与Json相关接口) 三层架构三层架构介绍 JSON JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,是存…

JUC并发编程(七)

1、不可变对象 1.1、概念 不可变类是指一旦创建对象实例后,就不能修改该实例的状态。这意味着不可变类的对象是不可修改的,其内部状态在对象创建后不能被更改。不可变类通常具有以下特征: 实例状态不可改变:一旦不可变类的对象被…

unordered系列容器OJ

目录 1、unordered系列容器 2、unordered系列容器OJ 1、重复n次的元素 2、两个数组的交集I 3、两个数组的交集II 4、存在重复元素 5、两句话中不常见的单词 1、unordered系列容器 在C标准库中,unordered系列容器是基于哈希表实现的, 用于存储唯一…

用html实现一个文章图片缩略展示

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>文章图片缩略展示</title><link rel"stylesheet" href"./style.css"> </head> <body> <div class&qu…

初始《string》及手搓模拟实现《string》

目录 前言&#xff1a; 为什么学习string类&#xff1f; 标准库中的string类 1. string类对象的常见构造 ​编辑 2. string类对象的容量操作 ​编辑 3. string类对象的访问及遍历操作 4. string类对象的修改操作 5. string类非成员函数 vs和g下string结构的说明 vs下s…

k8s1.28.8版本安装prometheus并持久化数据

本文参考 [k8s安装prometheus并持久化数据_/prometheus-config-reloader:-CSDN博客](https://blog.csdn.net/vic_qxz/article/details/119598466)前置要求: 已经部署了NFS或者其他存储的K8s集群. 这里注意networkpolicies网络策略问题&#xff0c;可以后面删除这个策略&#x…

LangChain使用本地LLM的简单实现

所用模型&#xff1a;stable-code-instruct-3b-Q8_0.gguf 下载链接&#xff1a;bartowski/stable-code-instruct-3b-GGUF Hugging Face 详细内容请查看&#xff1a;Introduction | &#x1f99c;️&#x1f517; Langchain 目录 LangChain 代码示例 LangChain LangChain…

再生式收音机填坑记

年前踩坑再生式收音机&#xff0c;还是得找机会把坑填上&#xff0c;最终选定了K8TND的方案&#xff0c;其实与Mr. Kitchen的也基本差不多。电路图如下&#xff1a; 实物图如下&#xff1a; 实际接收效果还不错&#xff0c;但是感觉频段上哪哪都是中国之声&#xff0c;对这种…

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

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

React系列之合成事件与事件处理机制

文章目录 React事件处理机制原生事件的事件机制事件代理&#xff08;事件委托&#xff09; 合成事件使用合成事件目的合成事件原生事件区别事件池 原生事件和React事件的执行顺序e.stopPropagation() React17事件机制的修改 React事件处理机制 react 事件机制基本理解&#xf…

时序预测 | Matlab实现CPO-BP冠豪猪算法优化BP神经网络时间序列预测

时序预测 | Matlab实现CPO-BP冠豪猪算法优化BP神经网络时间序列预测 目录 时序预测 | Matlab实现CPO-BP冠豪猪算法优化BP神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现CPO-BP冠豪猪算法优化BP神经网络时间序列预测&#xff08;完整源码…

Linux(CentOS7)安装软件方式(编译安装,yum,rpm)

目录 前言 安装方式 编译安装 下载 解压 安装 创建软链接 yum rpm 前言 在使用 CentOS 安装软件时&#xff0c;发现安装的方式有好几种&#xff0c;有官网下载 tar 包解压&#xff0c;然后自己编译安装的&#xff0c;也有直接通过 yum 命令一键安装的&#xff0c;还有…

力扣刷题Days29-第二题-70.爬楼梯(js)

只有学习&#xff0c;没有自己的思路解题哈哈哈 1&#xff0c;题目 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 2&#xff0c;代码 这种解法的本质是斐波那契数列 /*** param {number} n* re…

appium辅助自动化工具-- Appium studio

这里我要给大家介绍一款appium辅助自动化测试工具appium studio&#xff0c;你没看错&#xff0c;不是android studio&#xff0c;也不是appium android studio&#xff0c;就是appium studio&#xff01; 下载地址&#xff1a; Appium Studio | Digital.ai Continuous Test…

探究ThreadLocal的魔数0x61c88647和Entry数组

探究ThreadLocal 下面有一个很重要的HASH_INCREMENT,他的值是0x61c88647 public class ThreadLocal<T> {/***ThreadLocals依赖于附加到每个线程的每线程线性探针哈希映射 (thread.threadLocals和inheritableThreadLocals)。ThreadLocal对象充当键&#xff0c;通过threa…

Visual Studio 2022 中VLD库如何安装

GitHub链接 Release v2.5.1 KindDragon/vld 点击可执行程序进行下载 点击可执行程序进行安装 双击打开 一直点击next即可完成安装&#xff08;不用在意安装路径&#xff0c;总共不到2MB&#xff09; 如果GitHub无法打开&#xff0c;可以私信我发你安装包直接安装