推荐系统
# install.packages('recommenderlab')
require(recommenderlab)
data(MovieLense)
MovieLense
# 943个用户 1664部电影评分
# 看一个用户对每一部电影的评分
# 把第一行转换成list ,取前10
as(MovieLense[1, ], 'list')[[1]][1:10]
# 1:100用户,对1:100电影的评分
# 看到有些用户,评分多,有些不评分
image(MovieLense[1:100, 1:100])
hist(rowCounts(MovieLense))
hist(colCounts(MovieLense))
mean(rowMeans(MovieLense))
recommenderLab
针对realRatingMatrix, recommenderLab 提供了6中不同的推荐方法
i.e random(随机推荐), popular(基于流行度推荐),ibcf(基于项目协同过滤)
recommenderRegistry$get_entries(dataType = 'realRatingMatrix')
以IBCF_realRatingMatrix 为例
k: 取多少个相似的item
method:相似度算法,默认采用余弦相似度
Normalize: 采用何种归一化算法
normalize_sim_matrix: 是否对相似矩阵归一化
alpha:
na_as_zero: 是否将NA作为0
minRating: 最小化评分
推荐模型
ml.recomModel = Recommender(MovieLense[1:800], method = 'IBCF')
# top_n 推荐
ml.predictl = predict(ml.recomModel, MovieLense[805:807], n =5)
ml.predictl
as(ml.predictl, 'list')
# 评分
ml.predict2 = predict(ml.recomModel, MovieLense[805:807], type = 'ratings')
ml.predict2
as(ml.predict2, 'matrix')[1:3, 1:6]
模型评估
recommenderlab 包有提供专门的评估方案, 对应的函数是evaluationScheme,
能够设置采用n-fold交叉验证还是简单的training/train分开验证,这里采用后一种方法,
即将数据集简单分为training和test,在training训练模型,然后在test上评估
model.eval = evaluationScheme(MovieLense[1:943], method = 'split', train = 0.9,
given = 15, goodRating = 5)
# 分别用RANDOM、UBCF、IBCF建立预测模型
model.random = Recommender(getData(model.eval, 'train'), method = 'RANDOM')
model.ubcf = Recommender(getData(model.eval, 'train'), method = 'UBCF')
model.ibcf = Recommender(getData(model.eval, 'train'), method = 'IBCF')
# 分别根据每个模型预测评分
# predict 已知部分测试数据
predict.random = predict(model.random, getData(model.eval, 'known'), type = 'ratings')
predict.ubcf = predict(model.ubcf, getData(model.eval, 'known'), type = 'ratings')
predict.ibcf = predict(model.ibcf, getData(model.eval, 'known'), type = 'ratings')
error = rbind(
calcPredictionAccuracy(predict.random, getData(model.eval, 'unknow')),
calcPredictionAccuracy(predict.ubcf, getData(model.eval, 'unknow')),
calcPredictionAccuracy(predict.ibcf, getData(model.eval, 'unknow'))
)
rownames(error) = c('RANDOM', 'UBCF', 'IBCF')
error
UBCF 的方法最好