用recommenderlab做电影推荐

最近做电影推荐,主要目的是结合算法评价工具选取最优推荐算法。为了缩短开发周期,我们采用了开源社区的R语言包recommenderlab。四周时间下来,主要的开发工作已结束,包括前台设计实现,后台数据准备及算法实现。做完一个项目,总结一下,看看自己的收获,也供大家参考。如有不对之处,望不吝指点。

(1) recommenderlab简介

recommenderlab是一个用于做推荐的R包,提供了多种推荐算法,包括UBCF(User Based Collaborative Filtering), IBCF(Item Based Collaborative Filtering), Popular, Random,SVD,PCA,AR等。recommenderlab的核心数据结构是RatingMatrix(评分矩阵),,该矩阵记录了user对item的评分。以RatingMatrix为输入,利用上述算法估计用户对尚未评价item的评分,并依此为依据进行推荐。recommenderlab的详细内容请参见recommenderlab项目主页:。

(2) 数据准备

我们采用rottentomatoes网上的电影数据,包括用户的评价数据和电影的一些基本信息。因为我们用的是collaborative filtering,所以此处的电影基本信息仅限于电影名,电影海报,电影平均评分。rottentomatoes提供了下载电影数据的api。 首先需要注册一个账户,获取一个apikey,然后用这个apikey下载电影数据。关于rottentomatoes数据下载的详细api请参见rottentomatoes开发者网站:。 另外,github上的JTomato项目实现了获取rottentomatoes电影数据的java程序,请参见:https://github.com/geeordanoh/JTomato。

(3) 训练推荐模型

recommenderlab中的Recommender类用于训练推荐模型,在调用Recommender之前,我们必须导入训练数据并将其转换成RatingMatrix。

library(recommenderlab)rating <- read.table("/tmp/rating_rt.csv",sep=",")r <- as(as(rating[1],"list")[[1]],"numeric")c <- as(as(rating[2],"list")[[1]],"numeric")v <- as(as(rating[3],"list")[[1]],"numeric")rowNames <- as(c(1:max(r)),"character")colNames <- as(c(1:max(c)),"character")sm <- sparseMatrix(r,c,x=v,dimnames=list(rowNames,colNames))rm <- new("realRatingMatrix",data=sm)#rm <- normalize(rm)rec <- Recommender(rm,method="UBCF", parameter=list(method="pearson",nn=30))save(rec_ubcf_cosine,file="/tmp/rec_ubcf.rda")首先导入recommenderlab包,然后从csv文件读入data frame。 data frame是R语言的数据结构,如读者不熟悉可参见书籍《R in action》。 读入的rating以三元组形式 (即<user, item,rating>的格式) 表示评价矩阵,而RatingMatrix的构造函数以sparseMatrix为数据源,故需构造sparseMatrix 。 3~8行代码构造了稀疏矩阵sm,然后就基于sm构造RatingMatrix。recommenderlab中的RatingMatrix是一个抽象类,它有两个子类:binaryRatingMatrix和realRatingMatrix,分别用于0-1评分模型和多级评分模型。在此,我们采用的是realRatingMatrix。

每个用户的打分标准各不相同,有的用户评分总体偏高,有的偏低。为了消除这种用户的评分差异,我们需要对realRatingMatrix做normalization。但是,因为recommenderlab在Recommder类做模型训练时默认对输入数据做了center normalization,故我们不需要额外的标准化。center是标准化方法之一,有关标准化方法请参见recommenderlab提供的recommenderlab文档:。

第11行代码调用Recommender类的构造函数训练推荐模型,这里method指定推荐算法, parameter传入推荐算法的参数。method="pearson"表示采用pearson相关系数做相似度计算,nn=30表示以30个最近邻作为neighborhood。

完成模型训练后我们得到了训练模型rec,为了方便多次推荐,我们将rec保存在磁盘文件中,每次推荐时只需load该文件即可。

(4) 预测与推荐

训练好推荐模型后,就可以做推荐了。recommenderlab提供了predict方法预测用户评分,该方法提供了两种type,一种是"ratings",另一种是"topN"。 当type=“ratings”时,predict预测用户对所有未评分item的打分,返回一个RatingMatrix对象;当type=“topN”时,predict直接返回用户评分最高的前N个item。 topN是默认type。

library(recommenderlab)user_rating <- read.table("/tmp/user_rating.csv",sep=",")r <- user_rating[1]r <- as(r[[1]],"numeric")c <- user_rating[2]c <- as(c[[1]],"numeric")v <- user_rating[3]v <- as(v[[1]],"numeric")sm <- sparseMatrix(r,c,x=v,dims=c(max(r),movie_num))rm <- new("realRatingMatrix",data=sm)rm <- normalize(rm)load("/tmp/rec_ubcf.rda")pre <- predict(rec,rm,n=10)preList <- as(pre,"list")recommendation <- data.frame(RECOMMENDED_ITEM=preList[[1]])

第2~10行代码从csv文件读取用户对已知item的评价,并将其转换成realRatingMatrix。第11行代码对rm进行标准化。然后,我们导入训练模型,并调用predict方法预测出用户最喜欢的前10个item。predict方法返回一个topNList类的对象,14~15行代码将该对象转换成data frame结构。

(5) 总结recommenderlab提供了多种推荐算法,并可以根据需要调整算法参数。R语言提供了对多种编程语言 (包括C/C++, java等)的支持,开发者可以从C/C++或java程序中调用recommenderlab中的方法,这样可以很大程度上提高开发效率。但从实践结果来看,R语言包的运行效率一般。当然,有利则有弊。另外,目前recommenderlab还没有提供comtent-based推荐算法。

人生重要的不是所站的位置,而是所朝的方向

用recommenderlab做电影推荐

相关文章:

你感兴趣的文章:

标签云: