基于Knn算法的图书推荐系统(毕业设计) 联系客服

发布时间 : 星期四 文章基于Knn算法的图书推荐系统(毕业设计)更新完毕开始阅读b5dabdc390c69ec3d4bb7528

华北科技学院毕业设计

其中,各个书目的分布位置由distance得出,各类点上的取值由读者-书目矩阵

user.item.matrix得出,分类取值0,表示未曾借阅,分类取值1表示借阅过这本书。然后根据Knn算法思想找出商品最近的K个物品,图示中的K取值为3。最后计算书目取值只和,并除以K,从而代表读者reader和书目book之间的关系。代码如下:

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(distance[item.index,])[2:(k+1)]

k.nearest.itemid=as.numeric(rownames(distance)[k.nearest.item.index]) sum(user.item.matrix[as.character(userid),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>)可以返回向量a的取值由小到大排序后元素的序列号信息,则语句如下:

k.nearest.item.index=order(distance[item.index,])[2:(k+1)]

上述语句可以返回distance[item.index,]中最小的第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.matrix[as.character(userid),as.character(k.nearest.itemid)])/k

5.5计算用户的推荐书目id

使用自定义的核心函数knn.userid.item,可以计算用户userid与所有的商品的关系数

据,并可以取关系最大的书目,作为该用户的推荐书目。该过程实际上就是在上述 书目平面分布图中,查找周围书目与之最近的k个物品中取值为1的最多的书目。

例如在图5-2中,取值为零的书目,周围的k个物品的分类取值1占多数,所以它

第 11 页 共 27 页

图书推荐系统

就被作为一款推荐书目。

图5-2 用户推荐书目示意图

该过程涉及的代码如下:

knn.itembase=function(userid,user.item.matrix,distance,k=25,return.item.num=10){ knn.userid=0

for(i in 1:nrow(distance)){

knn.userid[i]=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.matrix[as.character(userid),]!=1)])

return.itemid[1: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.matrix[as.character(userid),] !=1)]

再从上面的return.itemid中提取出已经借阅过的书目的信息。代码如下:

return.itemid=setdiff(return.itemid,colnames(user.item.matrix)[which(user.item.matrix[as.character(userid),]!=1)])

最后依据推荐书目数,来返回最后为用户userid推荐的return.itemid个书目itemid。

第 12 页 共 27 页

华北科技学院毕业设计

5.6 查询推荐书目的具体信息

根据上述步骤计算出的用户推荐书目id,在数据库中查找出推荐书目的具体信息,返回给用户,给用户提取出一些有用的信息,方便用户对推荐书目的了解以及在图书馆的检索。代码如下:

recFromPerson=function(readerNum,user.item.matrix1=user.item.matrix,distance1=distance){ library(RODBC) odbcDataSources()

conn=odbcConnect(\

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(\ result=rbind(result,sqlQuery(conn,sql.rec)) }

odbcClose(conn) na.omit(result) }

在数据库中返回的信息有图书的标题,作者,出版社,出版日期,检索号等等信息。方便用户对推荐书目的了解和查找。其中na.omit(result),用于去空操作。

第 13 页 共 27 页

图书推荐系统

第6章 SQL Server数据库、Java语言与R的组合

6.1 简述

R是属于GNU系统的一个自由、免费、源代码开放的软件,它是一个用于统计计算和统计制图的优秀工具。R拥有一套完整的数据处理、计算和制图软件系统。其功能包括:数据存储和处理系统;数组运算工具,其向量、矩阵运算方面功能尤其强大;完整连贯的统计分析工具;优秀的统计制图功能;简便而强大的编程语言。

SQLServer数据库提供大量数据的存储以及一些复杂的数据整理合并等。

Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群,同时适用于开发各种良好的图形界面。

而数据从存储到大规模计算,再到计算结果展示,这三者的组合刚好迎合了数据的一条龙式的发展与应用。我相信这必将是大数据时代的一个利器。

6.2 SQL Server数据库与R语言

R语言提供了RODBC包,用于基于数据源的数据库连接,下面一个例子简单说明

数据库的连接:

library(RODBC) odbcDataSources()

conn=odbcConnect(\

sql=\train.data=sqlQuery(conn,sql) names(train.data)=c(\odbcClose(conn)

其中conn=odbcConnect(\用于数据源的连接,train.data=sqlQuery(conn,sql)用

于数据的查询,odbcClose(conn)用于数据源连接的关闭。

第 14 页 共 27 页