《R语言与数据挖掘》⑨智能推荐算法

写在前面,目前的推荐算法重要分为四类

  • 基于关联规则的推荐算法
  • 基于物品的协同过滤算法
  • 基于用户的协同过滤算法
  • 基于内容的推荐算法

协同过滤

一个重要的环节就是如何选择合适的相似度计算方法,常用的两种相似度计算方法包括皮尔逊相关系数和余弦相似度等。
皮尔逊相关系数
在这里插入图片描述

余弦相似度
在这里插入图片描述
基于R语言的实现主要依赖recommenderlab

recommenderlab包主要处理的对象为ratingMatrix。
ratingMatrix有两种:realRatingMatrix和 binaryRatingMatrix。
realRatingMatrix是一个评分矩阵,以真实的评分数据反映在矩阵当中,而 binaryRatingMatrix为布尔矩阵,相当于把realRatingMatrix中大于0的数值赋值为1。
在R中,realRatingMatrix和binaryRatingMatrix矩阵储存空间小,计算效率高,并且能够很方便地转化成数据框和列表。

recommender()

功能:构建推荐模型。
格式:Recommender(data, method, parameter=NULL)
data为一个ratingMatrix,调用 recommender()之前需给矩阵的所有列进行列命名,否则会出现报错。
method 的选项包括:IBCF(基于物品的协同过滤推荐)、UBCF(基于用户的协同过滤推荐)、SVD(矩阵因子化)、PCA(主成分分析)、 RANDOM(随机推荐)、POPULAR(基于流行度的推荐)。
parameter的参数有很多,运行以下代码可以看到不同method下参数的默认设置:
recommenderRegistry$get_entries(dataType = “realRatingMatrix”)

参数设置

在这里插入图片描述
在这里插入图片描述

Predict()

在这里插入图片描述

# 9.1   	示例:将matrix转化成realRatingMatrix,并将realRatingMatrix转化成list和data.frame。
# realRatingMatrix格式转换
library(recommenderlab)
m <- matrix(sample(c(NA, 0:5), 100, replace = TRUE, prob = c(.7, rep(.3/6, 6))), 
            nrow = 10, ncol = 10, dimnames = list(
              user = paste('u', 1:10, sep = ''), 
              item = paste('i', 1:10, sep = '')    
            ))
r <- as(m, "realRatingMatrix")  # 将matrix格式转换成realRatingMatrix格式
r
list.m <- as(r, "list")  # 把realRatingMatrix转化成list
df.m <- as(r, "data.frame")  # 把realRatingMatrix转化成data.frame



# 9.1    示例:根据用户对电影的评分进行电影推荐和电影评分预测
# recommender推荐
library(recommenderlab)
library(ggplot2)
data(MovieLense)  # 电影评分数据
as(MovieLense, "matrix")[1:3, 1:4]  # 显示部分电影评分

# 利用前940位用户建立基于物品的协同过滤推荐模型,method = "IBCF"
m.recomm <- Recommender(MovieLense[1:940], method = "IBCF")
m.recomm

# 对后三位用户进行推荐预测,使用predict()函数,默认是topN推荐
(ml.predict <- predict(m.recomm, MovieLense[941:943], n = 3))  # n = 3 表示Top3推荐
as(ml.predict, "list")  # 电影推荐预测结果

# 用户对item的评分预测,使用predict()函数,type = "ratings"
ml.predict2 <- predict(m.recomm, MovieLense[941:943], type = "ratings")  
as(ml.predict2, "matrix")[1:3, 1:4]  # 显示部分电影评分预测结果



# 9.2  示例:建立基于流行度、基于用户的协同过滤和基于物品的协同过滤推荐模型,并对这三个模型进行评价
# 推荐模型评价
library(recommenderlab)
data(MovieLense)

# 建立评价方案
# 使用evaluationScheme函数将MovieLense分成训练集和测试集
scheme <- evaluationScheme(MovieLense, method = "split", train = 0.9, k = 1, 
                           given = 10, goodRating = 4)
# 设置模型popular,ubcf,ibcf的参数
algorithms <- list(popular = list(name = "POPULAR", param = list(normalize = "Z-score")), 
                   ubcf = list(name = "UBCF", param = list(normalize = "Z-score", 
                                                           method = "Cosine", nn = 25, 
                                                           minRating = 3)), 
                   ibcf = list(name = "IBCF", param = list(normalize = "Z-score")))
# 对模型进行评价
results <- evaluate(scheme, algorithms, n = c(1, 3, 5, 10, 15, 20))

# 输出ROC曲线和precision-recall曲线
plot(results, annotate = 1:3, legend = "topleft")  # ROC
plot(results, "prec/rec", annotate = 3)  # precision-recall

# 按照评价方案建立推荐模型
model.popular <- Recommender(getData(scheme, "train"), method = "POPULAR", 
                             parameter = algorithms[[1]][[2]])
model.ibcf <- Recommender(getData(scheme, "train"), method = "UBCF",
                          parameter = algorithms[[2]][[2]])
model.ubcf <- Recommender(getData(scheme, "train"), method = "IBCF", 
                          parameter = algorithms[[3]][[2]])

# 对推荐模型进行预测
predict.popular <- predict(model.popular, getData(scheme, "known"), type = "ratings")
predict.ubcf <- predict(model.ubcf, getData(scheme, "known"), type = "ratings")
predict.ibcf <- predict(model.ibcf, getData(scheme, "known"), type = "ratings")

#  做误差的计算
# calcPredictionAccuracy()的参数"know "和"unknow "表示对测试集的进一步划分:
# "know "表示用户已经评分的,要用来预测的items;"unknow "表示用户已经评分,要被预测以便于进行模型评价的items。
predict.err <- rbind(calcPredictionAccuracy(predict.popular, getData(scheme, "unknown")), 
                     calcPredictionAccuracy(predict.ubcf, getData(scheme, "unknown")), 
                     calcPredictionAccuracy(predict.ibcf, getData(scheme, "unknown")))
rownames(predict.err) <- c("POPULAR", "UBCF", "IBCF")
predict.err

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wency(王斯-CUEB)

我不是要饭的

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值