基于Knn算法的图书推荐系统毕业设计.docx
《基于Knn算法的图书推荐系统毕业设计.docx》由会员分享,可在线阅读,更多相关《基于Knn算法的图书推荐系统毕业设计.docx(35页珍藏版)》请在冰豆网上搜索。
![基于Knn算法的图书推荐系统毕业设计.docx](https://file1.bdocx.com/fileroot1/2023-1/26/76e4eaee-74aa-4b72-b275-cc662093372e/76e4eaee-74aa-4b72-b275-cc662093372e1.gif)
基于Knn算法的图书推荐系统毕业设计
基于Knn算法的图书推荐系统
摘要:
互联网的出现和普及给用户带来了大量的信息,满足了用户在信息时代对信息的需求的同时,也使得用户在面对大量信息时无法从中获得对自己真正有用的那部分信息,而产生所谓的信息超载问题,推荐系统就这样应运而生。
推荐系统现已广泛应用于很多领域,其中最典型并具有良好的发展和应用前景的领域就是电子商务领域。
个性化推荐系统是建立在海量数据挖掘基础上的一种高级商务智能平台,以帮助电子商务网站为其顾客购物提供完全个性化的决策支持和信息服务。
同时学术界对推荐系统的研究热度一直很高,逐步形成了一门独立的学科。
本文介绍的推荐系统,一方面根据学校的图书借阅情况,构建出基于Knn算法的图书推荐系统,可以解决同学们借书没有头绪,借不到适合自己的书等等问题,另一方面实现了数据、算法、成果展示的分离,使得程序设计、大数据处理、前端展示的分工更加明确简洁。
本系统采用了统计领域广泛使用的R软件,适于数据存储与挖掘的SQLServer2008,以及适用于前端展示的Java语言,通过三者的协调互助,共同完成推荐系统的数据存储、挖掘以及展示工作。
关键词:
推荐系统Knn算法 专属推荐大数据挖掘R软件
Bookrecommendation systembasedon Knnalgorithm
Abstract:
TheemergenceandpopularizationoftheInternetuserstobringagreatdealofinformation,meettheusersatthesametimetheneedforinformationintheinformationage,butalsomakestheuserinthefaceofalargeamountofinformationcannotbeobtainedfromthatpartoftheinformationtheyreallyuseful,andproducetheinformationoverloadtheso-calledproblems,recommendationsystemcomes.Recommendationsystemhasbeenwidelyusedinmanyfields,amongwhichthemosttypicalandhasgoodprospectsforthedevelopmentandapplicationofthefieldisthefieldofelectroniccommerce.Personalizedrecommendersystemisestablishedonthebasisofaseniorminingbusinessintelligenceplatforminthemassivedata,inordertohelpe-commercesitesprovidecompletepersonalizeddecisionsupportandinformationserviceforthecustomershopping.Atthesametime,theresearchheatsystemtorecommendtheacademiccommunityhasbeenveryhigh,andgraduallyformedanindependentdiscipline.
Recommendationsystemisintroducedinthispaper,handaccordingtobooksborrowingsituationoftheschool,buildarecommendationsystembasedonKnnalgorithmlibrary,cansolvethestudentsborrowbookshavenoclue,borrownotsuitablefortheirownbooksandsoon,ontheotherhandtoachievetheseparationofdata,algorithms,theresultsshowthattheprogramdesign,largedata,processing,front-enddisplaydivisionmoreclearandconcise.
ThissystemadoptsthewidelyusedRsoftwareforstatisticalfield,datastorageanddatamininginSQLServer2008,andtheapplicationofJavalanguageinthefrontdisplay,throughthecoordinationofthethreecooperation,jointlycompletedrecommendationsystemfordatastorage,anddisplaytheworkofmining.
Keywords:
Recommendationsystem; Knnalgorithm; exclusive recommendation;large datamining ;Rsoftware
第1章绪论
推荐系统现已广泛应用于很多领域,其中最典型并具有良好的发展和应用前景的领域就是电子商务领域。
个性化推荐系统是建立在海量数据挖掘基础上的一种高级商务智能平台,以帮助电子商务网站为其顾客购物提供完全个性化的决策支持和信息服务。
对于我们的图书的大量藏书,我们已经完全没有那么多的时间和精力去看完所有的书来寻找自己想要得到的知识,所以一个有专属个性的、合适的推荐系统能给我们节约不少的时间和精力。
1.1应用背景
互联网的出现和普及给用户带来了大量的信息,满足了用户在信息时代对信息的需求,但随着网络的迅速发展而带来的网上信息量的大幅增长,使得用户在面对大量信息时无法从中获得对自己真正有用的那部分信息,对信息的使用效率反而降低了,这就是所谓的信息超载问题。
解决信息超载问题一个非常有潜力的办法是推荐系统,它是根据用户的信息需求、兴趣等,将用户感兴趣的信息、产品等推荐给用户的个性化信息推荐系统。
和搜索引擎相比推荐系统通过研究用户的兴趣偏好,进行个性化计算,由系统发现用户的兴趣点,从而引导用户发现自己的信息需求。
一个好的推荐系统不仅能为用户提供个性化的服务,还能和用户之间建立密切关系,让用户对推荐产生依赖。
推荐系统现已广泛应用于很多领域,其中最典型并具有良好的发展和应用前景的领域就是电子商务领域。
同时学术界对推荐系统的研究热度一直很高,逐步形成了一门独立的学科。
对于我们的图书的大量藏书,我们已经没有那么多的时间和精力去看完所有的书来寻找自己想要得到的知识,所以一个有专属个性的、合适的推荐系统能给我们节约不少的时间和精力。
1.2系统功能
该系统的具体功能如下
1.根据用户的借书证号给出专属推荐
2.根据书目的主键值给出相关推荐
3.推荐的书目中包含书名,作者,出版社,出版日期,索书号,类型等字段
4.可以查询用户的信息,以及当前书目的信息
1.3系统预览
图1-1系统主界面图
图1-2系统副界面图
1.4系统特点
系统界面相对简单,适合添加到web应用程序,作为Applet嵌入到网页中,但是内部数据的运算量相当大,因此可能运行较缓慢。
第2章开发环境及工具
2.1系统开发环境
服务器操作系统:
MicrosoftWindows操作系统
数据库:
SQLServer2008
R软件:
R3.1.2
JDK:
1.6
2.2系统架构模型
本系统整体框架采用了数据存储、大规模计算与前端展示相分离的新型设计模式。
其中SQLServer2008负责数据的存储与管理,R软件负责大规模数据计算,是系统的核心部分,Java端采用模型-视图-控制器(MVC)设计模型,完成数据计算结果的展示。
具体的模型设计如下图:
图2-1程序结构图
2.3系统开发技术
2.3.1R语言简介
R是用于统计分析、绘图的语言和操作环境。
R是属于GNU系统的一个自由、免费、源代码开放的软件,它是一个用于统计计算和统计制图的优秀工具。
R是一套完整的数据处理、计算和制图软件系统。
其功能包括:
数据存储和处理系统;数组运算工具,其向量、矩阵运算方面功能尤其强大;完整连贯的统计分析工具;优秀的统计制图功能;简便而强大的编程语言:
可操纵数据的输入和输出,可实现分支、循环,用户可自定义功能。
与其说R是一种统计软件,还不如说R是一种数学计算的环境,因为R并不是仅仅提供若干统计程序、使用者只需指定数据库和若干参数便可进行一个统计分析。
R的思想是:
它可以提供一些集成的统计工具,但更大量的是它提供各种数学计算、统计计算的函数,从而使使用者能灵活机动的进行数据分析,甚至创造出符合需要的新的统计计算方法。
该语言的语法表面上类似C,但在语义上是函数设计语言(functionalprogramminglanguage)的变种并且和Lisp以及APL有很强的兼容性。
特别的是,它允许在“语言上计算”(computingonthelanguage)。
这使得它可以把表达式作为函数的输入参数,而这种做法对统计模拟和绘图非常有用。
2.3.2数据库技术简介
SQLServer是由Microsoft开发和推广的关系数据库管理系统(DBMS),它最初是由Microsoft、Sybase和Ashton-Tate三家公司共同开发的,并于1988年推出了第一个OS/2版本。
SQLServer近年来不断更新版本,1996年,Microsoft推出了SQLServer6.5版本;1998年,SQLServer7.0版本和用户见面;SQLServer2000是Microsoft公司于2000年推出的最新版本。
SQLServer特点:
1.真正的客户机/服务器体系结构。
2.图形化用户界面,使系统管理和数据库管理更加直观、简单。
3.丰富的编程接口工具,为用户进行程序设计提供了更大的选择余地。
4.SQLServer与WindowsNT完全集成,利用了NT的许多功能,如发送和接受消息,管理登录安全性等。
SQLServer也可以很好地与MicrosoftBackOffice产品集成。
5.具有很好的伸缩性,可跨越从运行Windows95/98的电脑到运行Windows2000的大型多处理器等多种平台使用。
6.对Web技术的支持,使用户能够很容易地将数据库中的数据发布到Web页面上。
7.SQLServer提供数据仓库功能,这个功能只在Oracle和其他更昂贵的DBMS中才有。
2.3.3Java简介
Java是由SunMicrosystems公司推出的Java面向对象程序设计语言(以下简称Java语言)和Java平台的总称。
由JamesGosling和同事们共同研发,并在1995年正式推出。
Java最初被称为Oak,是1991年为消费类电子产品的嵌入式芯片而设计的。
1995年更名为Java,并重新设计用于开发Internet应用程序。
用Java实现的HotJava浏览器(支持Javaapplet)显示了Java的魅力:
跨平台、动态Web、Internet计算。
从此,Java被广泛接受并推动了Web的迅速发展,常用的浏览器均支持Javaapplet。
另一方面,Java技术也不断更新。
Java自面世后就非常流行,发展迅速,对C++语言形成有力冲击。
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
2010年Oracle公司收购SunMicrosystems。
Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。
Java技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
第3章系统设计与数据库
3.1系统设计
3.1.1系统功能模块划分
1.用户借书证号的查询:
包括个人信息以及推荐书目(专属推荐)。
2.书目编号查询:
包括本书的相关信息以及关于本书的推荐。
3.2数据库结构
历史数据来源于华北科技学院图书馆,数据处理中需要的表有流通日志表、读者信息表、书目信息表,详细字段含义如下:
表3-1流通日志表
comLog流通日志表
条形码
barCode
流通号
comNum
读者条码
readerNum
处理时间
handleTime
主键码
keyNum
表4-2读者信息表
reader读者信息表
读者条码
readerNum
姓名
rName
性别
sex
读者级别
rRank
读者单位
rUnit
班级
rClass
年级
rGrade
表4-2书目信息表
book书目信息表
主键码
keyNum
题目
title
责任者
author
出版社
press
出版日期
pubDate
索书号
indexNum
图书类型
bType
第4章K最近邻分类(Knn)算法介绍
4.1Knn算法简介
邻近算法,或者说K最近邻(Knn,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。
所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。
Knn算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。
该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。
kNN方法在类别决策时,只与极少量的相邻样本有关。
由于Knn方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,Knn方法较其他方法更为适合。
4.2算法流程
1.准备数据,对数据进行预处理
2.选用合适的数据结构存储训练数据和测试元组
3.设定参数,如k
4.维护一个大小为k的的按距离由大到小的优先级队列,用于存储最近邻训练元组。
随机从训练元组中选取k个元组作为初始的最近邻元组,分别计算测试元组到这k个元组的距离,将训练元组标号和距离存入优先级队列
5.遍历训练元组集,计算当前训练元组与测试元组的距离,将所得距离L与优先级队列中的最大距离Lmax
6.进行比较。
若L>=Lmax,则舍弃该元组,遍历下一个元组。
若L7.遍历完毕,计算优先级队列中k个元组的多数类,并将其作为测试元组的类别。
8.测试元组集测试完毕后计算误差率,继续设定不同的k值重新进行训练,最后取误差率最小的k值。
4.3算法优缺点
4.3.1优点
1.简单,易于理解,易于实现,无需估计参数,无需训练。
2.适合对稀有事件进行分类。
3.特别适合于多分类问题(multi-modal,对象具有多个类别标签),kNN比SVM的表现要好。
4.3.2缺点
该算法在分类时有个主要的不足是,当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数。
该算法只计算“最近的”邻居样本,某一类的样本数量很大,那么或者这类样本并不接近目标样本,或者这类样本很靠近目标样本。
无论怎样,数量并不能影响运行结果。
该方法的另一个不足之处是计算量较大,因为对每一个待分类的文本都要计算它到全体已知样本的距离,才能求得它的K个最近邻点。
第5章Knn算法在图书推荐系统的实现
5.1训练集数据train.data
以表5-1所示的华北科技学院图书借阅记录的用户借阅行为,作为推荐系统的训练集数据。
表5-1数据集
barCode
comNum
readerNum
handleTime
keyNum
00415155
0344432
A00000913
2006/9/50:
00
112354
00360052
0298082
A00000854
2006/9/50:
00
101837
00141303
0134864
A00000854
2006/9/50:
00
47478
00319832
0268308
A00000854
2006/9/50:
00
95171
00359031
0297062
A00000854
2006/9/50:
00
101547
00404067
0333555
A00000854
2006/9/50:
00
109964
…
…
…
…
…
00368169
0306006
A00000913
2006/9/50:
00
103890
00410055
0339333
A00000913
2006/9/50:
00
111251
00423676
0352909
A00000463
2006/9/60:
00
114296
00391519
0321016
A00000463
2006/9/60:
00
107254
00268408
0213510
A00000260
2006/9/60:
00
82555
00423214
0352451
A00000377
2006/9/60:
00
114217
00333482
0271950
A00000377
2006/9/60:
00
95871
其中readerNum(读者编号)和keyNum(书目主键)是相关性计算的主要数据依据。
下面将上述数据通过SQLServer2008数据库读取到R软件中,然后存放于train.data数据框中,具体代码如下:
library(RODBC)
odbcDataSources()
conn=odbcConnect("library")
sql="selectreaderNum,keyNumfromcomLog"
train.data=sqlQuery(conn,sql)
names(train.data)=c("reader","book")
odbcClose(conn)
其中,前3行样本数据如下所示:
train.data[1:
3,]
readerbook
1A00000543111510
2A0000099169045
3A0000099182879
5.2建立读者-书目矩阵
现在要把常规的train.data形式的矩阵转换为列代表不同书目,行代表不同读者,内部代表是否进行过借阅的矩阵,即每列代表某一本书被哪些读者借阅过,每行代表每一读者借阅过的书目。
具体数据如表5-2所示:
表5-2读者-书目矩阵
669
2324
8200
9462
…
9895
10515
10865
11007
11304
A00000014
0
0
0
0
…
0
0
0
0
0
A00000017
0
0
0
0
…
0
0
0
0
0
A00000025
1
0
0
1
…
0
0
0
0
0
A00000040
0
0
0
0
…
1
0
0
1
0
…
…
…
…
…
…
…
…
…
…
…
A00000050
0
0
0
0
…
1
0
0
0
0
A00000056
0
0
0
0
…
0
0
0
0
0
A00000057
0
0
0
0
…
0
0
0
0
0
A00000063
0
0
1
0
…
0
0
0
0
0
A00000075
0
0
0
0
…
0
0
0
1
0
实现代码如下:
library(reshape)
user.item.matrix=cast(train.data,reader~book,value=value,fill=0,fun.aggregate=length)
row.names(user.item.matrix)=user.item.matrix[,1]
user.item.matrix=user.item.matrix[,-1]
这里的核心函数是reshape包里的cast函数,如下代码执行后会返回行代表的用户。
user.item.matrix=cast(train.data,reader~book,value=value,fill=0,fun.aggregate=length)
其中列代表书目(reader~book),元素内容是value,默认值NA自动使用0替换(fill=0),以代表读者没有借入过该书目,首列数据(reader)是代表用户的读者编号,
首列数据是代表书目的键值编号。
5.3计算书目距离矩阵distance
这里使用书目之间的相关性系数来间接计算书目的距离矩阵。
例如,user.item.matrix矩阵中的第1列和第3列分别代表书目669和书目8200被用户借阅的情况,其相关性系数的计算方式代码如下:
sim_cor=cor(user.item.matrix[,1],user.item.matrix[,3]);
sim_cor的取值范围是[-1,1]这里使用如下规则把sim_cor转换为distance
1.当sim_cor的取值为-1时,distance=inf无限大
2.当sim_cor的取值为1是,distance=0
具体计算实现的方式代码如下:
distance=-log((sim_cor/2)+0.5)
最后把distance矩阵的行名称和列名称设置为书目键值,以便可以在后续程序中的distance矩阵中定位出实际的视频数据。
colnames(distance)=colnames(user.item.matrix)
rownames(distance)=colnames(user.item.matrix)
5.4计算读者和书目的关系程度
自定义的Knn.userid.item函数是算法的核心,它主要计算读者reader和书目itemid的相关程度。
通过distance物品间的距离矩阵,可以形象的得到一个书目二维平面分布图。
如图5