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

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

华北科技学院毕业设计

3. 设定参数,如k

4.维护一个大小为k的的按距离由大到小的优先级队列,用于存储最近邻训练元组。随机从训练元组中选取k个元组作为初始的最近邻元组,分别计算测试元组到这k个元组的距离,将训练元组标号和距离存入优先级队列

5. 遍历训练元组集,计算当前训练元组与测试元组的距离,将所得距离L 与优先级队列中的最大距离Lmax

6. 进行比较。若L>=Lmax,则舍弃该元组,遍历下一个元组。若L < Lmax,删除优先级队列中最大距离的元组,将当前训练元组存入优先级队列。

7. 遍历完毕,计算优先级队列中k 个元组的多数类,并将其作为测试元组的类别。 8. 测试元组集测试完毕后计算误差率,继续设定不同的k值重新进行训练,最后取误差率最小的k 值。

4.3 算法优缺点

4.3.1 优点

1.简单,易于理解,易于实现,无需估计参数,无需训练。 2. 适合对稀有事件进行分类。

3.特别适合于多分类问题(multi-modal,对象具有多个类别标签), kNN比SVM的表现要好。 4.3.2 缺点

该算法在分类时有个主要的不足是,当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数。 该算法只计算“最近的”邻居样本,某一类的样本数量很大,那么或者这类样本并不接近目标样本,或者这类样本很靠近目标样本。无论怎样,数量并不能影响运行结果。

该方法的另一个不足之处是计算量较大,因为对每一个待分类的文本都要计算它到全体已知样本的距离,才能求得它的K个最近邻点。

第 7 页 共 27 页

图书推荐系统

第5章 Knn算法在图书推荐系统的实现

5.1 训练集数据train.data

以表5-1所示的华北科技学院图书借阅记录的用户借阅行为,作为推荐系统的训练集数据。

表5-1 数据集

barCode 00415155 00360052 00141303 00319832 00359031 00404067 ? 00368169 00410055 00423676 00391519 00268408 00423214 00333482 comNum 0344432 0298082 0134864 0268308 0297062 0333555 ? 0306006 0339333 0352909 0321016 0213510 0352451 0271950 readerNum A00000913 A00000854 A00000854 A00000854 A00000854 A00000854 ? A00000913 A00000913 A00000463 A00000463 A00000260 A00000377 A00000377 handleTime 2006/9/5 0:00 2006/9/5 0:00 2006/9/5 0:00 2006/9/5 0:00 2006/9/5 0:00 2006/9/5 0:00 ? 2006/9/5 0:00 2006/9/5 0:00 2006/9/6 0:00 2006/9/6 0:00 2006/9/6 0:00 2006/9/6 0:00 2006/9/6 0:00 keyNum 112354 101837 47478 95171 101547 109964 ? 103890 111251 114296 107254 82555 114217 95871

其中readerNum(读者编号)和keyNum(书目主键)是相关性计算的主要数据依据。下面将上述数据通过SQL Server 2008数据库读取到R软件中,然后存放于train.data数据框中,具体代码如下:

library(RODBC) odbcDataSources()

conn=odbcConnect(\

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

其中,前3行样本数据如下所示:

第 8 页 共 27 页

华北科技学院毕业设计

train.data[1:3,] reader book

1 A00000543 111510 2 A00000991 69045 3 A00000991 82879

5.2建立读者-书目矩阵

现在要把常规的train.data 形式的矩阵转换为列代表不同书目,行代表不同读者,内部代表是否进行过借阅的矩阵,即每列代表某一本书被哪些读者借阅过,每行代表每一读者借阅过的书目。具体数据如表5-2所示:

表5-2 读者-书目矩阵

A00000014 A00000017 A00000025 A00000040 ? A00000050 A00000056 A00000057 A00000063 A00000075 669 2324 8200 9462 ? 9895 10515 10865 11007 11304 0 0 0 0 ? 0 0 0 0 0 0 0 0 0 ? 0 0 0 0 0 1 0 0 1 ? 0 0 0 0 0 0 0 0 0 ? 1 0 0 1 0 ? ? ? ? ? ? ? ? ? ? 0 0 0 0 ? 1 0 0 0 0 0 0 0 0 ? 0 0 0 0 0 0 0 0 0 ? 0 0 0 0 0 0 0 1 0 ? 0 0 0 0 0 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)是代表用户的读者编号, 首列数据是代表书目的键值编号。

第 9 页 共 27 页

图书推荐系统

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-4所示:

图5-1 读者和书目的关系程度

第 10 页 共 27 页