基于Knn算法的图书推荐系统毕业设计_第1页
基于Knn算法的图书推荐系统毕业设计_第2页
基于Knn算法的图书推荐系统毕业设计_第3页
基于Knn算法的图书推荐系统毕业设计_第4页
基于Knn算法的图书推荐系统毕业设计_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、目录基于Knn算法的图书推荐系统IBook recommendationsystem based onKnn algorithmII第1章绪论11.1应用背景11.2系统功能21.3系统预览21.4系统特点1第2章开发环境及工具22.1系统开发环境22.2系统架构模型22.3系统开发技术32.3.1 R语言简介32.3.2数据库技术简介32.3.3 Java简介4第3章系统设计与数据库53.1系统设计53.1.1 系统功能模块划分53.2数据库结构5第4章 K最近邻分类(Knn)算法介绍64.1 Knn算法简介64.2 算法流程64.3 算法优缺点74.3.1 优点74.3.2 缺点7第5章

2、Knn算法在图书推荐系统的实现85.1 训练集数据train.data85.2建立读者-书目矩阵95.3计算书目距离矩阵distance105.4计算读者和书目的关系程度105.5计算用户的推荐书目id115.6 查询推荐书目的具体信息13第6章 SQL Server数据库、Java语言与R的组合146.1 简述146.2 SQL Server数据库与R语言146.3 R语言与Java语言15参考文献16致谢17附录18基于Knn算法的图书推荐系统摘要:互联网的出现和普及给用户带来了大量的信息,满足了用户在信息时代对信息的需求的同时,也使得用户在面对大量信息时无法从中获得对自己真正有用的那部分

3、信息,而产生所谓的信息超载问题,推荐系统就这样应运而生。推荐系统现已广泛应用于很多领域,其中最典型并具有良好的发展和应用前景的领域就是电子商务领域。个性化推荐系统是建立在海量数据挖掘基础上的一种高级商务智能平台,以帮助电子商务网站为其顾客购物提供完全个性化的决策支持和信息服务。同时学术界对推荐系统的研究热度一直很高,逐步形成了一门独立的学科。本文介绍的推荐系统,一方面根据学校的图书借阅情况,构建出基于Knn算法的图书推荐系统,可以解决同学们借书没有头绪,借不到适合自己的书等等问题,另一方面实现了数据、算法、成果展示的分离,使得程序设计、大数据处理、前端展示的分工更加明确简洁。本系统采用了统计领

4、域广泛使用的R软件,适于数据存储与挖掘的SQL Server 2008,以及适用于前端展示的Java语言,通过三者的协调互助,共同完成推荐系统的数据存储、挖掘以及展示工作。关键词:推荐系统 Knn算法专属推荐 大数据挖掘 R软件Book recommendationsystem based onKnn algorithmAbstract: The emergence and popularization of the Internet users to bring a great deal of information, meet the users at the same time the

5、need for information in the information age, but also makes the user in the face of a large amount of information cannot be obtained from that part of the information they really useful, and produce the information overload the so-called problems, recommendation system comes. Recommendation system h

6、as been widely used in many fields, among which the most typical and has good prospects for the development and application of the field is the field of electronic commerce. Personalized recommender system is established on the basis of a senior mining business intelligence platform in the massive d

7、ata, in order to help e-commerce sites provide complete personalized decision support and information service for the customer shopping. At the same time, the research heat system to recommend the academic community has been very high, and gradually formed an independent discipline.Recommendation sy

8、stem is introduced in this paper, hand according to books borrowing situation of the school, build a recommendation system based on Knn algorithm library, can solve the students borrow books have no clue, borrow not suitable for their own books and so on, on the other hand to achieve the separation

9、of data, algorithms, the results show that the program design, large data, processing, front-end display division more clear and concise.This system adopts the widely used R software for statistical field, data storage and data mining in SQL Server 2008, and the application of Java language in the f

10、ront display, through the coordination of the three cooperation, jointly completed recommendation system for data storage, and display the work of mining.Key words:Recommendation system;Knn algorithm;exclusiverecommendation ; largedata mining; R software第1章 绪论推荐系统现已广泛应用于很多领域,其中最典型并具有良好的发展和应用前景的领域就是电

11、子商务领域。个性化推荐系统是建立在海量数据挖掘基础上的一种高级商务智能平台,以帮助电子商务网站为其顾客购物提供完全个性化的决策支持和信息服务。对于我们的图书的大量藏书,我们已经完全没有那么多的时间和精力去看完所有的书来寻找自己想要得到的知识,所以一个有专属个性的、合适的推荐系统能给我们节约不少的时间和精力。1.1 应用背景互联网的出现和普及给用户带来了大量的信息,满足了用户在信息时代对信息的需求,但随着网络的迅速发展而带来的网上信息量的大幅增长,使得用户在面对大量信息时无法从中获得对自己真正有用的那部分信息,对信息的使用效率反而降低了,这就是所谓的信息超载问题。解决信息超载问题一个非常有潜力的

12、办法是推荐系统 ,它是根据用户的信息需求、兴趣等,将用户感兴趣的信息、产品等推荐给用户的个性化信息推荐系统。和搜索引擎相比推荐系统通过研究用户的兴趣偏好,进行个性化计算,由系统发现用户的兴趣点,从而引导用户发现自己的信息需求。一个好的推荐系统不仅能为用户提供个性化的服务,还能和用户之间建立密切关系,让用户对推荐产生依赖。推荐系统现已广泛应用于很多领域,其中最典型并具有良好的发展和应用前景的领域就是电子商务领域。同时学术界对推荐系统的研究热度一直很高,逐步形成了一门独立的学科。对于我们的图书的大量藏书,我们已经没有那么多的时间和精力去看完所有的书来寻找自己想要得到的知识,所以一个有专属个性的、合

13、适的推荐系统能给我们节约不少的时间和精力。1.2 系统功能该系统的具体功能如下1. 根据用户的借书证号给出专属推荐2. 根据书目的主键值给出相关推荐3. 推荐的书目中包含书名,作者,出版社,出版日期,索书号,类型等字段4. 可以查询用户的信息,以及当前书目的信息1.3 系统预览图1-1 系统主界面图图1-2 系统副界面图1.4 系统特点系统界面相对简单,适合添加到web应用程序,作为Applet嵌入到网页中,但是内部数据的运算量相当大,因此可能运行较缓慢。第2章 开发环境及工具2.1系统开发环境服务器操作系统:Microsoft Windows操作系统数据库:SQL Server 2008R软

14、件:R 3.1.2JDK:1.62.2系统架构模型本系统整体框架采用了数据存储、大规模计算与前端展示相分离的新型设计模式。其中SQL Server 2008 负责数据的存储与管理,R软件负责大规模数据计算,是系统的核心部分,Java端采用模型-视图-控制器(MVC)设计模型,完成数据计算结果的展示。具体的模型设计如下图: Java前端结果展示参数传递R软件数据抽取数据存储数据库图2-1 程序结构图2.3系统开发技术2.3.1 R语言简介R是用于统计分析、绘图的语言和操作环境。R是属于GNU系统的一个自由、免费、源代码开放的软件,它是一个用于统计计算和统计制图的优秀工具。R是一套完整的数据处理、

15、计算和制图软件系统。其功能包括:数据存储和处理系统;数组运算工具,其向量、矩阵运算方面功能尤其强大;完整连贯的统计分析工具;优秀的统计制图功能;简便而强大的编程语言:可操纵数据的输入和输出,可实现分支、循环,用户可自定义功能。与其说R是一种统计软件,还不如说R是一种数学计算的环境,因为R并不是仅仅提供若干统计程序、使用者只需指定数据库和若干参数便可进行一个统计分析。R的思想是:它可以提供一些集成的统计工具,但更大量的是它提供各种数学计算、统计计算的函数,从而使使用者能灵活机动的进行数据分析,甚至创造出符合需要的新的统计计算方法。该语言的语法表面上类似 C,但在语义上是函数设计语言(functi

16、onal programming language)的变种并且和Lisp以及APL有很强的兼容性。特别的是,它允许在“语言上计算”(computing on the language)。这使得它可以把表达式作为函数的输入参数,而这种做法对统计模拟和绘图非常有用。2.3.2数据库技术简介SQL Server是由Microsoft开发和推广的关系数据库管理系统(DBMS),它最初是由Microsoft、Sybase和Ashton-Tate三家公司共同开发的,并于1988年推出了第一个OS/2版本。 SQL Server近年来不断更新版本,1996年,Microsoft 推出了SQL Server

17、6.5版本;1998年,SQL Server 7.0版本和用户见面;SQL Server 2000是Microsoft公司于2000年推出的最新版本。 SQL Server 特点:1真正的客户机/服务器体系结构。 2图形化用户界面,使系统管理和数据库管理更加直观、简单。 3丰富的编程接口工具,为用户进行程序设计提供了更大的选择余地。 4SQL Server与Windows NT完全集成,利用了NT的许多功能,如发送和接受消息,管理登录安全性等。SQL Server也可以很好地与Microsoft BackOffice产品集成。 5具有很好的伸缩性,可跨越从运行Windows 95/98的电脑到

18、运行Windows 2000的大型多处理器等多种平台使用。 6对Web技术的支持,使用户能够很容易地将数据库中的数据发布到Web页面上。 7SQL Server提供数据仓库功能,这个功能只在Oracle和其他更昂贵的DBMS中才有。2.3.3 Java简介Java是由Sun Microsystems公司推出的Java面向对象程序设计语言(以下简称Java语言)和Java平台的总称。由James Gosling和同事们共同研发,并在1995年正式推出。Java最初被称为Oak,是1991年为消费类电子产品的嵌入式芯片而设计的。1995年更名为Java,并重新设计用于开发Internet应用程序。

19、用Java实现的Hot Java浏览器(支持Java applet)显示了Java的魅力:跨平台、动态Web、Internet计算。从此,Java被广泛接受并推动了Web的迅速发展,常用的浏览器均支持Java applet。另一方面,Java技术也不断更新。Java自面世后就非常流行,发展迅速,对C+语言形成有力冲击。在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。2010年Oracle公司收购Sun Microsystems。Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、

20、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。第3章 系统设计与数据库3.1系统设计3.1.1 系统功能模块划分1. 用户借书证号的查询:包括个人信息以及推荐书目(专属推荐)。2. 书目编号查询:包括本书的相关信息以及关于本书的推荐。 3.2数据库结构历史数据来源于华北科技学院图书馆,数据处理中需要的表有流通日志表、读者信息表、书目信息表,详细字段含义如下:表3-1 流通日志表comLog流通日志表条形码barCode流通号comNum读者条码readerNum处理时间handleTime主键码keyNum表4-2 读者信息表reader读者信息表读

21、者条码readerNum姓名rName性别sex读者级别rRank读者单位rUnit班级rClass年级rGrade表4-2 书目信息表book书目信息表主键码keyNum题目title责任者author出版社press出版日期pubDate索书号indexNum图书类型bType第4章 K最近邻分类(Knn)算法介绍4.1 Knn算法简介邻近算法,或者说K最近邻(Knn,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。Knn算法的核心思想是如果一个样本在特征空间中的k个最

22、相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。 kNN方法在类别决策时,只与极少量的相邻样本有关。由于Knn方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,Knn方法较其他方法更为适合。4.2 算法流程1. 准备数据,对数据进行预处理2. 选用合适的数据结构存储训练数据和测试元组3. 设定参数,如k4.维护一个大小为k的的按距离由大到小的优先级队列,用于存储最近邻训练元组。随机从训练元组中选取k个元组

23、作为初始的最近邻元组,分别计算测试元组到这k个元组的距离,将训练元组标号和距离存入优先级队列5. 遍历训练元组集,计算当前训练元组与测试元组的距离,将所得距离L 与优先级队列中的最大距离Lmax6. 进行比较。若L=Lmax,则舍弃该元组,遍历下一个元组。若L Lmax,删除优先级队列中最大距离的元组,将当前训练元组存入优先级队列。7. 遍历完毕,计算优先级队列中k 个元组的多数类,并将其作为测试元组的类别。8. 测试元组集测试完毕后计算误差率,继续设定不同的k值重新进行训练,最后取误差率最小的k 值。4.3 算法优缺点4.3.1 优点1.简单,易于理解,易于实现,无需估计参数,无需训练。2.

24、 适合对稀有事件进行分类。3.特别适合于多分类问题(multi-modal,对象具有多个类别标签), kNN比SVM的表现要好。4.3.2 缺点该算法在分类时有个主要的不足是,当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数。 该算法只计算“最近的”邻居样本,某一类的样本数量很大,那么或者这类样本并不接近目标样本,或者这类样本很靠近目标样本。无论怎样,数量并不能影响运行结果。该方法的另一个不足之处是计算量较大,因为对每一个待分类的文本都要计算它到全体已知样本的距离,才能求得它的K个最近邻点。第5章 Knn算法在

25、图书推荐系统的实现5.1 训练集数据train.data以表5-1所示的华北科技学院图书借阅记录的用户借阅行为,作为推荐系统的训练集数据。表5-1 数据集barCodecomNumreaderNumhandleTimekeyNum A2006/9/5 0:00 A2006/9/5 0:00 A2006/9/5 0:0047478 A2006/9/5 0:0095171 A2006/9/5 0:00 A2006/9/5 0:00 A2006/9/5 0:00 A2006/9/5 0:00 A2006/9/6 0:00 A2006/9/6 0:00 A2006/9/6 0:0082555 A200

26、6/9/6 0:00 A2006/9/6 0:0095871其中readerNum(读者编号)和keyNum(书目主键)是相关性计算的主要数据依据。下面将上述数据通过SQL Server 2008数据库读取到R软件中,然后存放于train.data数据框中,具体代码如下:library(RODBC)odbcDataSources()conn=odbcConnect(library)sql=select readerNum,keyNum from comLogtrain.data=sqlQuery(conn,sql)names(train.data)=c(reader,book)odbcClos

27、e(conn)其中,前3行样本数据如下所示:train.data1:3, reader book1 A 2 A 690453 A 828795.2建立读者-书目矩阵现在要把常规的train.data 形式的矩阵转换为列代表不同书目,行代表不同读者,内部代表是否进行过借阅的矩阵,即每列代表某一本书被哪些读者借阅过,每行代表每一读者借阅过的书目。具体数据如表5-2所示:表5-2 读者-书目矩阵669232482009462989510515108651100711304A000000000A000000000A100100000A000010010A000010000A000000000A0000

28、00000A001000000A000000010实现代码如下:library(reshape)user.item.matrix=cast(train.data,readerbook,value=value,fill=0,fun.aggregate=length) s(user.item.matrix)=user.item.matrix,1 user.item.matrix=user.item.matrix,-1这里的核心函数是reshape包里的cast函数,如下代码执行后会返回行代表的用户。user.item.matrix=cast(train.data,readerboo

29、k,value=value,fill=0,fun.aggregate=length)其中列代表书目(readerbook),元素内容是value,默认值NA自动使用0替换(fill=0),以代表读者没有借入过该书目,首列数据(reader)是代表用户的读者编号,首列数据是代表书目的键值编号。5.3计算书目距离矩阵distance这里使用书目之间的相关性系数来间接计算书目的距离矩阵。例如,user.item.matrix矩阵中的第1列和第3列分别代表书目669和书目8200被用户借阅的情况,其相关性系数的计算方式代码如下:sim_cor=cor(user.item.matrix,1 , user

30、.item.matrix,3);sim_cor的取值范围是-1,1这里使用如下规则把sim_cor转换为distance1. 当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(

31、user.item.matrix)5.4计算读者和书目的关系程度自定义的Knn.userid.item函数是算法的核心,它主要计算读者reader和书目itemid的相关程度。通过distance物品间的距离矩阵,可以形象的得到一个书目二维平面分布图。如图5-4所示:图5-1 读者和书目的关系程度 其中,各个书目的分布位置由distance得出,各类点上的取值由读者-书目矩阵user.item.matrix得出,分类取值0,表示未曾借阅,分类取值1表示借阅过这本书。然后根据Knn算法思想找出商品最近的K个物品,图示中的K取值为3。最后计算书目取值只和,并除以K,从而代表读者reader和书目b

32、ook之间的关系。代码如下:knn.userid.item=function(userid,itemid,user.item.matrix,distance,k=25) item.index=which(rownames(distance)=as.character(itemid) k.nearest.item.index=order(distanceitem.index,)2:(k+1) k.nearest.itemid=as.numeric(rownames(distance)k.nearest.item.index) sum(user.item.matrixas.character(us

33、erid),as.character(k.nearest.itemid)/k下面通过distance书目距离矩阵找到与itemid距离最近的K个物品:1. 查找名称是itemid的物品在distance的序列号item.index。代码如下:item.index=which(rownames(distance)=as.character(itemid)2. 如果order()可以返回向量a的取值由小到大排序后元素的序列号信息,则语句如下:k.nearest.item.index=order(distanceitem.index,)2:(k+1)上述语句可以返回distanceitem.inde

34、x,中最小的第2至k+1元素的序列号。这里由于distance与itemid距离最近的书目还是itemid,所以这里取第2至k+1元素。3. 使用k.nearest.index反查出物品id,代码如下k.nearest.itemid=as.numeric(rownames(distance)k.nearest.item.index)4. 使用读者-书目距离矩阵user.item.matrix来计算距离最近的K个物品有多少个被借阅,再除以K得到一个处于0,1之间的数据,用以表明读者和书目的关系,代码如下所示:sum(user.item.matrixas.character(userid),as.

35、character(k.nearest.itemid)/k5.5计算用户的推荐书目id使用自定义的核心函数knn.userid.item,可以计算用户userid与所有的商品的关系数据,并可以取关系最大的书目,作为该用户的推荐书目。该过程实际上就是在上述书目平面分布图中,查找周围书目与之最近的k个物品中取值为1的最多的书目。例如在图5-2中,取值为零的书目,周围的k个物品的分类取值1占多数,所以它就被作为一款推荐书目。图5-2 用户推荐书目示意图 该过程涉及的代码如下:knn.itembase=function(userid,user.item.matrix,distance,k=25,ret

36、urn.item.num=10) knn.userid=0 for(i in 1:nrow(distance) knn.useridi=knn.userid.item(userid,rownames(distance)i,user.item.matrix,distance,k=k) return.itemid=rownames(distance)order(knn.userid,decreasing=T) return.itemid=setdiff(return.itemid,colnames(user.item.matrix)which(user.item.matrixas.characte

37、r(userid),!=1) return.itemid1:return.item.num代码中的knn.userid用于存储用户userid和所有书目的关系数据,然后依据knn.userid取值由大到小的顺序进行排序,然后返回其编号。代码如下return.itemid=rownames(distance)order(knn.userid,decreasing=T) 然后使用如下语句找到已被用户收藏的书目的itemid:colnames(user.item.matrix)which(user.item.matrixas.character(userid), !=1)再从上面的return.it

38、emid中提取出已经借阅过的书目的信息。代码如下:return.itemid=setdiff(return.itemid,colnames(user.item.matrix)which(user.item.matrixas.character(userid),!=1)最后依据推荐书目数,来返回最后为用户userid推荐的return.itemid个书目itemid。5.6 查询推荐书目的具体信息根据上述步骤计算出的用户推荐书目id,在数据库中查找出推荐书目的具体信息,返回给用户,给用户提取出一些有用的信息,方便用户对推荐书目的了解以及在图书馆的检索。代码如下:recFromPerson=fun

39、ction(readerNum,user.item.matrix1=user.item.matrix,distance1=distance) library(RODBC) odbcDataSources() conn=odbcConnect(library) result= rec=knn.itembase(readerNum,user.item.matrix1,distance1,k=25,return.item.num=10) rec=na.omit(rec)#缺失值处理 for(i in 1:length(rec) sql.rec=paste(select * from GDLIS.bo

40、ok where keyNum=,reci) result=rbind(result,sqlQuery(conn,sql.rec) odbcClose(conn) na.omit(result)在数据库中返回的信息有图书的标题,作者,出版社,出版日期,检索号等等信息。方便用户对推荐书目的了解和查找。其中na.omit(result),用于去空操作。第6章 SQL Server数据库、Java语言与R的组合6.1 简述R是属于GNU系统的一个自由、免费、源代码开放的软件,它是一个用于统计计算和统计制图的优秀工具。R拥有一套完整的数据处理、计算和制图软件系统。其功能包括:数据存储和处理系统;数组运

41、算工具,其向量、矩阵运算方面功能尤其强大;完整连贯的统计分析工具;优秀的统计制图功能;简便而强大的编程语言。SQLServer数据库提供大量数据的存储以及一些复杂的数据整理合并等。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群,同时适用于开发各种良好的图形界面。而数据从存储到大规模计算,再到计算结果展示,这三者的组合刚好迎合了数据的一条龙式的发展与应用。我相信这必将是大数据时代的一个利器。6.2 SQL Server数据库与R语言R语言提供了RODBC包,用于基于数据源的数

42、据库连接,下面一个例子简单说明数据库的连接:library(RODBC)odbcDataSources()conn=odbcConnect(library)sql=select readerNum,keyNum from comLogtrain.data=sqlQuery(conn,sql)names(train.data)=c(reader,book)odbcClose(conn)其中conn=odbcConnect(library)用于数据源的连接,train.data=sqlQuery(conn,sql)用于数据的查询,odbcClose(conn)用于数据源连接的关闭。6.3 R语言与

43、Java语言Java语言提供了R应用的REngine.jar和RServerEngine.jar包,用于Java中使用R语言。下面使用简单的例子来介绍RSever的使用:1. 需要在R软件中下载RServe包,然后加载包,调用函数启动RServe2. 在Java端导入REngine.jar和RServerEngine.jar3. 在Java端应用如下函数this.rc=new RConnection();rc.eval(source(H:/BCS.R);String s=recResult=recFromPerson(+readerNum+);System.out.println(读取代码);

44、rc.voidEval(s);REXP title=rc.eval(iconv(recResult$titile, gbk, utf-8,);其中this.rc=new RConnection()用于R服务器的连接,rc.eval(source(H:/BCS.R)用于加载R代码,rc.voidEval(s)用于在R服务器端运行R代码,REXP title=rc.eval(iconv(recResult$titile, gbk, utf-8,)用于数据的返回,其中的iconv函数用于编码的转换,否则可能在传输过程中出现乱码现象。参考文献1王珊.数据库与数据库管理系统.第1版.北京:电子工业出版社

45、,19952赵子江,王丹.数据库原理与SQL SERVER应用.第2版.北京:机械工业出版社,20063张丹.R的极客理想-工具篇.第1版.北京:机械工业出版社,20144李明.R语言与网站分析.第1版.北京:机械工业出版社,20145Yanchang Zhao. R and Data Mining Examples and Case Studies.第1版.北京:机械工业出版社,20146耿祥义,张跃平,Java大学实用教程.第3版.北京:电子工业出版社,2013致谢在本文结束之际,我要特别感谢我的指导老师谭立云老师。谭老师学识渊博、为人真诚,他在我大学学习期间给了我许多教诲。本文从选题的确

46、定,论文的写作、修改到最后定稿得到了谭老师的悉心指导,提出了许多宝贵建议,而且提供了大量的书籍资料。特别是他多次主动询问进程,为我指点迷津,帮助我开拓思路,精心点拨,热忱鼓励。他严肃的教学态度,严谨的治学精神,精益求精的工作作风深深地感染和激励着我,使我终身受益。在此,谨向谭老师致以诚挚的谢意和崇高的敬意。此外,感谢其他诸位老师的谆谆教导,感谢谭立云老师对我学习上的点拨。同时,还要感谢在大学四年中所有帮助我的人,也要感谢在论文写作过程中,帮助过我、并且共同奋斗四年的大学同学们,与他们的讨论和他们提出的诸多建议帮助我解决了很多难题,使得论文能够顺利完成。衷心感谢我的家人。在漫长的求学生涯中,我的

47、每一份成长和进步都离不开他们的支持。另外,需要感谢一个素未谋面的老师,也就是R的极客理想工具篇的作者,张丹老师。感谢他通过邮件给予的悉心指导。最后,再次衷心地向所有在我论文写作过程中给予过我支持、帮助与关怀的各位老师、同学、亲友表以诚挚的谢意!附录1.R代码library(RODBC)odbcDataSources()conn=odbcConnect(library)sql=select readerNum,keyNum from comLogtrain.data=sqlQuery(conn,sql)names(train.data)=c(reader,book)odbcClose(conn)

48、train.data=train.data1:1000,#数据处理value=rep(1,length(train.data$reader)train.data=cbind(train.data,value)library(reshape)user.item.matrix=cast(train.data,readerbook,value=value,fill=0,fun.aggregate=length)#重点代码s(user.item.matrix)=user.item.matrix,1 user.item.matrix=user.item.matrix,-1#用book之间

49、的相关系数,计算距离矩阵sim_cor=cor(user.item.matrix)distance=-log(sim_cor/2)+0.5)colnames(distance)=colnames(user.item.matrix)rownames(distance)=colnames(user.item.matrix)#计算用户和物品的关系成度knn.userid.item=function(userid,itemid,user.item.matrix,distance,k=25) item.index=which(rownames(distance)=as.character(itemid)

50、 k.nearest.item.index=order(distanceitem.index,)2:(k+1) k.nearest.itemid=as.numeric(rownames(distance)k.nearest.item.index) sum(user.item.matrixas.character(userid),as.character(k.nearest.itemid)/k#计算书目关系程度。knn.book.item=function(itemid,user.item.matrix,distance,k=10) item.index=which(rownames(dista

51、nce)=as.character(itemid) k.nearest.item.index=order(distanceitem.index,)2:(k+1) k.nearest.itemid=as.numeric(rownames(distance)k.nearest.item.index) k.nearest.itemid#选拔最近距离knn.itembase=function(userid,user.item.matrix,distance,k=25,return.item.num=10) knn.userid=0 for(i in 1:nrow(distance) knn.useri

52、di=knn.userid.item(userid,rownames(distance)i,user.item.matrix,distance,k=k) return.itemid=rownames(distance)order(knn.userid,decreasing=T)#itemid的反向查找,值得考虑(向量排序之后,它的索引号是不变的)return.itemid=setdiff(return.itemid,colnames(user.item.matrix)which(user.item.matrixas.character(userid),!=1) return.itemid1:r

53、eturn.item.num#热门书籍hotbook=function() library(RODBC) odbcDataSources() conn=odbcConnect(library) hotbookmsg=c() sql.hotbookid=select keyNum,count(*)amount from comLog group by keyNum order by count(*) desc hotbookid=sqlQuery(conn,sql.hotbookid) for(i in 1:10) sql.getbook=paste(select * from GDLIS.book where keyNum=,hotbookid$keyNumi) hotbookmsg=rbind(hotbookmsg,sqlQuery(conn,sql.getbook) odbcClose(conn) na.omit(hotbookmsg)#根据书籍名称推荐recFromBook=function(bName,user.item.matrix,distan

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论