[R - ml]推荐系统

推荐系统

# 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 的方法最好

猜你喜欢

转载自blog.csdn.net/weixin_33941350/article/details/87235425
R
R: