基于人气与协同过滤的图书推荐系统研究与实践

2024-01-22 08:20

本文主要是介绍基于人气与协同过滤的图书推荐系统研究与实践,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 3f6a7ab0347a4af1a75e6ebadee63fc1.gif

🤵‍♂️ 个人主页:@艾派森的个人主页

✍🏻作者简介:Python学习者
🐋 希望大家多多支持,我们一起进步!😄
如果文章对你有帮助的话,
欢迎评论 💬点赞👍🏻 收藏 📂加关注+


目录

1.项目背景

2.数据集介绍

3.技术工具

4.实验过程

4.1导入数据

4.2数据探索

4.3数据预处理

4.4基于人气的推荐系统

4.5基于协同过滤的推荐系统

5.总结 

文末推荐与福利


1.项目背景

        随着信息技术的不断发展,人们获取图书信息的方式发生了巨大变化。传统的图书推荐方式主要依赖于专业书评和图书馆员的推荐,但这种方式面临着信息获取成本高、推荐精准度低等问题。而随着互联网的普及,大量用户生成的数据成为了个性化推荐系统的宝贵资源。

        在这一背景下,图书推荐系统应运而生,成为了图书行业提高用户体验、促进销售的有效工具。传统的图书推荐系统主要基于图书的内容属性进行推荐,然而,用户的个性化需求和兴趣爱好千差万别,因此单一的内容属性往往无法满足用户的需求。

        为了提高图书推荐的精准度,研究者们开始关注协同过滤算法,并结合用户的行为数据,实现个性化的图书推荐。协同过滤算法通过分析用户行为数据,发现用户之间的相似性,从而向用户推荐他们可能感兴趣的图书。与此同时,考虑到图书的热门程度也是影响用户选择的一个重要因素,人气推荐成为了图书推荐系统中不可忽视的一部分。

        因此,基于人气与协同过滤的图书推荐系统成为了当前研究的热点之一。通过深入研究用户行为数据和图书的人气信息,结合协同过滤算法,可以更好地满足用户的个性化需求,提高推荐系统的精准度和用户满意度。这也是本研究的动机所在,旨在探讨如何有效地整合人气信息和协同过滤算法,构建一种更为强大和智能的图书推荐系统。

2.数据集介绍

        本数据集来源于Kaggle,原始数据集中有3个文件,这些文件是从一些图书销售网站中提取的。

Books——首先是关于书籍的,它包含了所有与书籍相关的信息,比如作者、书名、出版年份等。

Users——第二个文件包含注册用户的信息,如用户id、位置。

ratings——评级包含诸如哪个用户对哪本书给出了多少评级之类的信息。

3.技术工具

Python版本:3.9

代码编辑器:jupyter notebook

4.实验过程

4.1导入数据

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
import seaborn as sns 
import warnings as w
w.filterwarnings('ignore')
from sklearn.metrics.pairwise import cosine_similaritybooks = pd.read_csv('Books.csv')
users = pd.read_csv('Users.csv')
ratings = pd.read_csv('Ratings.csv')

4.2数据探索

书籍数据集

# books 
print('shape of books ',books.shape)
print()
books.info()

0248162aa67540898f3cde6f16b1e0bc.png

用户数据集

# user 
print('shape of users',users.shape)
print()
users.info()

149350d276f646b5bd9bef7300e31a37.png

评分数据集

# ratings
print('shape of rating',ratings.shape)
print()
ratings.info()

fefae72983444c8dbbabff1e53f6d0db.png

该数据集是可靠的,可以考虑作为一个大数据集。我们有271360本书的数据,网站上的注册用户总数约为27.8万,他们给出了近110万次评级。因此,我们可以说我们拥有的数据集是好的和可靠的。

4.3数据预处理

ratings['Book-Rating'].value_counts().plot(kind='bar')

9edb1d1a1fb247a6b08bc0ef7cd65f76.png

在推荐系统中,通常会有隐式反馈数据,用户不会明确地提供评级,但他们的行为可以作为偏好的指示。在这种情况下,0的评级可能表示缺失或未知的评级,这通常被视为“隐含的负面反馈”。这意味着没有给一本书打分的用户并不一定表示他们不喜欢这本书;他们可能只是没有对此表达任何意见。

# 查找图书数据集中的空值
books.isnull().sum()

6eba8e8abb894495affa7bf9d7813b63.png

b65e6337bfd54dba8431a631374e28ad.png

books['Year-Of-Publication'].value_counts().index.values

8341ab92ea5c453d9cad37eeb65fc511.png

存在无效值或非年份值,如'0'和'1376'。

# Step 1: 过滤掉无效或非年份值
valid_years = books['Year-Of-Publication'].astype(str).str.isnumeric()
books = books[valid_years]# Step 2: 将列数据转换为整数
books['Year-Of-Publication'] = books['Year-Of-Publication'].astype(int)# Step 3: 从表示年份的整数中创建新的datetime列
books['Publication_Date'] = pd.to_datetime(books['Year-Of-Publication'], format='%Y', errors='coerce')# 如果你不再需要旧的“出版年份”栏,请删除它
books.drop(columns=['Year-Of-Publication'], inplace=True)# 显示DataFrame以检查新的日期时间列
books = pd.DataFrame(books)# Step 4: 创建一个只有年份部分为整数的新列
books['Year-Of-Publication'] = books['Publication_Date'].dt.year
books['Year-Of-Publication'].value_counts().index.values

7336655d7cc8420b9464752cbe2d650f.png

# 这是目前所有无效的数据
books = books[~(books['Year-Of-Publication'] == 2037)]
books = books[~(books['Year-Of-Publication'] == 2026)] 
books = books[~(books['Year-Of-Publication'] == 2030)]
books = books[~(books['Year-Of-Publication'] == 2050)]
books = books[~(books['Year-Of-Publication'] == 2038)]
plt.figure(figsize=(20,10))
sns.countplot(x=books['Year-Of-Publication']);
plt.xticks(rotation=90)
plt.show()

65592c7d763f4c5c85280ea4ebc364d3.png

注:最多的书出版年份是1980-2004年

# 十大出版商
books['Publisher'].value_counts().head(10).plot(kind='bar')

0ae2edd8f44b4d779c8634c245ed6622.png

# 查找空值
round(100*(users.isnull().sum()/len(users.index)),2)

e4d06fe998424c21b108f5cc6b98e592.png

# 删除age列
users.drop('Age',axis=1,inplace=True)
users['Location'] = users['Location'].apply(lambda x:x.split(',')[-1])
# 十大用户位置
users['Location'].value_counts().head(10).plot(kind='bar')

941ded232adc41b89c3b060844687ea9.png

4.4基于人气的推荐系统

我们将显示平均评分最高的前50本书,但我们只考虑那些获得至少250票的书。

#合并数据评级和图书基于“ISBN”列
rating_books_name = ratings.merge(books,on='ISBN')
rating_books_name.head()

69b47b9d33a944debcc813a8b3e21a49.png

# 首先按“Book-Title”分组,找出投票总数(计数)
numer_rating = rating_books_name.groupby('Book-Title').count()['Book-Rating'].reset_index()
numer_rating.rename(columns={'Book-Rating':'Totle_number_rating'},inplace=True)
numer_rating.head()

dcf0545238f541da87afa6bc40591237.png

# 总的平均评级
avg_rating = rating_books_name.groupby('Book-Title')['Book-Rating'].mean().reset_index()
avg_rating.rename(columns={'Book-Rating':'Totle_avg_rating'},inplace=True)
avg_rating.head()

0f6831b2b4d749f3918ca03a435bc661.png

# 合并'avg_rating'和'number_rating'基于'Book-Title'
popular_df = numer_rating.merge(avg_rating,on='Book-Title')
popular_df.head()

23ce5e4c9731470a9e8839db64a53b04.png

最高的平均评分,但我们只考虑那些获得至少250票的书

popular_df = popular_df[popular_df['Totle_number_rating'] >= 250].sort_values('Totle_avg_rating',ascending=False).head(50)
popular_df.head()

52bad115198f4bc285dc7e30367b9c87.png

#  合并' popul_df '和'books'数据集
popular_df = popular_df.merge(books,on='Book-Title').drop_duplicates('Book-Title')[['Book-Title','Book-Author', 'Image-URL-M', 'Totle_number_rating','Totle_avg_rating']]
popular_df.head()

73649957823b46638af745cf74c7bb68.png

# 这都是前50本书
popular_df.head()

25624c648ed646619cb1741986fe42df.png

4.5基于协同过滤的推荐系统

        我们不想在用户或书籍之间找到相似之处。我们想这样做,如果用户A读过并点赞x和y本书,用户B也点赞这两本书,现在用户A读过并点赞了B没有读过的z本书,所以我们必须向用户B推荐z本书,这就是协同过滤。

        因此,这是使用矩阵分解实现的,我们将创建一个矩阵,其中列是用户,索引是图书,值是评级。比如我们需要创建一个数据透视表。

        如果我们把所有的书和用户都拿来建模,你不觉得会产生问题吗?所以我们要做的就是减少用户和图书的数量,因为我们不能考虑只在网站上注册过或只读过一两本书的用户。对于这样的用户,我们不能依赖于向其他人推荐书籍,因为我们必须从数据中提取知识。所以我们会限制这个数字,我们会选择一个至少评价了200本书的用户,我们也会限制书籍,我们只会选择那些从用户那里得到至少50个评价的书。

3618fe33ed0b437ab2e8614748788e0c.png

        因此,让我们开始分析并准备数据集,正如我们讨论的建模。让我们看看有多少用户给出了评分,并提取那些评分超过200的用户。

步骤1)提取超过200个的用户和评分

        现在我们将提取给出超过200个评分的用户id,当我们有用户id时,我们将从评分数据框中提取仅该用户id的评分。

x = ratings['User-ID'].value_counts() > 200
y = x[x].index
print(y.shape)

1e9e3c7d4bb94603b9981c611013c36e.png

只有899个用户的评分超过200

ratings = ratings[ratings['User-ID'].isin(y)]

步骤2)将评级与书籍合并

900名用户给出了52万的评分,这是我们想要的。现在,我们将根据ISBN合并评分与图书,这样我们将得到每个用户对每个图书id的评分,而没有对该图书id评分的用户的值将为零。

rating_with_books = ratings.merge(books, on='ISBN')
rating_with_books.head(2)

7571532cfe654ed9b0127beadc41fc77.png

步骤3)提取评分超过50的书籍

现在数据帧的大小减小了,我们有48万,因为当我们合并数据帧时,我们没有所有的book id-data。现在我们将计算每本书的评级,因此我们将根据标题对数据进行分组,并根据评级进行汇总。

number_rating = rating_with_books.groupby('Book-Title')['Book-Rating'].count().reset_index()
number_rating.rename(columns= {'Book-Rating':'number_of_ratings'}, inplace=True)
number_rating.head()

c3b4e355158647b9831106875abea73a.png

final_rating = rating_with_books.merge(number_rating, on='Book-Title')
final_rating = final_rating[final_rating['number_of_ratings'] >= 50]
final_rating.drop_duplicates(['User-ID','Book-Title'], inplace=True)

        我们必须删除重复的值,因为如果同一用户多次评价同一本书,这将产生一个问题。最后,我们有一个用户的数据集,该用户对200多本图书进行了评分,并对50多本图书进行了评分。最终数据框的形状是59850行和8列。

步骤4)创建数据透视表

我们将创建一个数据透视表,其中列是用户id,索引是书名,值是评级。没有给任何一本书打分的用户id的value为NAN,因此将其归为0。

book_pivot = final_rating.pivot_table(columns='User-ID', index='Book-Title', values="Book-Rating")
book_pivot.fillna(0, inplace=True)
book_pivot

9bad69f30f1b4ef78771fc29950be45c.png

总计42本图书和888名用户

我们可以看到超过11个用户被移出,因为他们的评分是在那些评分不超过50的书上,所以他们被移出了。

建模

        现在每本书都变成了888维空间中的向量,我们必须找到类似的向量。现在我们要计算每个向量和其他向量之间的欧氏距离根据这个距离我们就能知道哪本书是相似的。

使用余弦相似距离查找所有推荐的书籍

from sklearn.metrics.pairwise import cosine_similarity
similarity_scores = cosine_similarity(book_pivot)
similarity_scores

92ce95e061964be5ad22ad8edea85d72.png

56ee285861c1400a8a1473826c1df8a6.png

(742,742)意味着每本书距离电影都很远

# 这是第一本书的距离,每本书的相似性
similarity_scores[0]

91a73689c49944db8edac7e5031d9ab4.png

# 定义一个根据书名进行推荐的函数
def recommend(book_name):index = np.where(book_pivot.index==book_name)[0][0]similar_items = sorted(list(enumerate(similarity_scores[index])),key=lambda x:x[1],reverse=True)[1:5]data = []for i in similar_items:item = []temp_df = books[books['Book-Title'] == book_pivot.index[i[0]]]item.extend(list(temp_df.drop_duplicates('Book-Title')['Book-Title'].values))item.extend(list(temp_df.drop_duplicates('Book-Title')['Book-Author'].values))item.extend(list(temp_df.drop_duplicates('Book-Title')['Image-URL-M'].values))data.append(item)return data
# 调用推荐函数,以“Harry Potter and the Chamber of Secrets (Book 2)”进行推荐
recommend('Harry Potter and the Chamber of Secrets (Book 2)')

ec144fe861ba4fbcbf017800641be698.png

5.总结 

        本实验基于人气与协同过滤的图书推荐系统,旨在提高图书推荐的精准度和用户满意度。通过对用户行为数据和图书人气信息的深入研究,以及协同过滤算法的应用,我们得出了以下几点总结:

  1. 个性化推荐的重要性: 传统的图书推荐系统主要依赖于内容属性,但个性化推荐系统的兴起使得系统能够更好地理解用户的兴趣和需求。结合协同过滤算法,系统能够根据用户的历史行为数据,为每个用户提供更为个性化的图书推荐,从而提高推荐的精准度。

  2. 人气信息的价值: 图书的人气信息是用户选择图书的重要参考因素之一。在推荐系统中,将人气信息纳入考虑范围,可以使系统更好地把握热门图书,为用户提供具有广泛吸引力的推荐。这对于提高用户体验、吸引更多读者具有积极作用。

  3. 协同过滤的优越性: 协同过滤算法通过挖掘用户行为数据中的相似性,为用户提供与其兴趣相近的图书推荐。实验结果表明,协同过滤算法在提高推荐系统准确性方面具有显著优势。通过引入该算法,系统能够更好地适应用户的个性化需求,增强了推荐系统的智能化水平。

  4. 综合优化: 在实验中,我们探索了如何综合利用人气信息和协同过滤算法,以进一步提高推荐系统的性能。通过精细调节算法参数和权重,我们成功实现了在保持系统简单性的同时提高了推荐的准确性。这为未来推荐系统的研究和应用提供了有益的经验。

        综合而言,基于人气与协同过滤的图书推荐系统在本实验中取得了良好的效果,为提高图书推荐系统的智能化水平和用户体验提供了有益的参考。未来的研究方向可以在更多算法创新和用户反馈挖掘的基础上进一步完善推荐系统,以满足不断变化的用户需求。

 文末推荐与福利

《从概念到现实:ChatGPT和Midjourney的设计之旅》免费包邮送出3本!

b26465e75e724525816891b02c2deaac.jpeg

内容简介:

        《从概念到现实:ChatGPT和Midjourney的设计之旅》详细介绍了ChatGPT与Midjourney的使用方法和应用场景,并结合设计案例讲解了如何利用AIGC辅助不同行业的设计师提升工作效率和创造力,共涉及8个应用领域,近60个案例演示,生动展示了各行各业中融入AIGC技术的设计成果,为设计师提供了更开阔的设计思路。同时,书中还有很多实用的技巧和建议,可以帮助设计师更快地掌握相关技术。对于不熟悉AI技术的设计师来说,这将是一本很有价值的指南书。通过阅读《从概念到现实:ChatGPT和Midjourney的设计之旅》,插画设计师、UI和UX设计师、游戏设计师、电商设计师、文创设计师、服装设计师、家居建筑设计师、工业设计师及相关设计人员可以更好地理解AI工具的工作原理,并更加灵活地加以运用。
        《从概念到现实:ChatGPT和Midjourney的设计之旅》不仅适合对设计充满热情的专业人士,还适合广大热爱设计艺术的读者。愿我们共同开启这段关于AI与设计的奇妙旅程,探索无限的创作空间!

编辑推荐:

        君子生非异也,善假于物也。让AI成为设计师的亲密助手,激发设计师的创造力!减少简单工作,提升设计效率!8个应用领域,插画设计 UI和UX设计 游戏设计 平面和电商设计 文创设计 服装设计 家居建筑设计 工业设计,近60个案例讲解。

  • 抽奖方式:评论区随机抽取3位小伙伴免费送出!
  • 参与方式:关注博主、点赞、收藏、评论区评论“人生苦短,拒绝内卷!”(切记要点赞+收藏,否则抽奖无效,每个人最多评论三次!
  • 活动截止时间:2023-12-18 20:00:00
  • 当当链接:http://product.dangdang.com/29628718.html

    京东链接:https://item.jd.com/13864763.html

 名单公布时间:2023-12-18 21:00:00 

aba8f742e90847aabd55876239c32a10.png

资料获取,更多粉丝福利,关注下方公众号获取

a74f7d5d03234f7c8a635562034442a0.gif#pic_center

 

这篇关于基于人气与协同过滤的图书推荐系统研究与实践的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/632389

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

软考系统规划与管理师考试证书含金量高吗?

2024年软考系统规划与管理师考试报名时间节点: 报名时间:2024年上半年软考将于3月中旬陆续开始报名 考试时间:上半年5月25日到28日,下半年11月9日到12日 分数线:所有科目成绩均须达到45分以上(包括45分)方可通过考试 成绩查询:可在“中国计算机技术职业资格网”上查询软考成绩 出成绩时间:预计在11月左右 证书领取时间:一般在考试成绩公布后3~4个月,各地领取时间有所不同

防近视护眼台灯什么牌子好?五款防近视效果好的护眼台灯推荐

在家里,灯具是属于离不开的家具,每个大大小小的地方都需要的照亮,所以一盏好灯是必不可少的,每个发挥着作用。而护眼台灯就起了一个保护眼睛,预防近视的作用。可以保护我们在学习,阅读的时候提供一个合适的光线环境,保护我们的眼睛。防近视护眼台灯什么牌子好?那我们怎么选择一个优秀的护眼台灯也是很重要,才能起到最大的护眼效果。下面五款防近视效果好的护眼台灯推荐: 一:六个推荐防近视效果好的护眼台灯的