张丹在这篇博客http://blog.fens.me/r-mahout-usercf/里给出了协同过滤算法的R代码,但是其本身使用过多的for循环,影响了代码的执行效率,同时也没有把R语言的特色给体现出来。
现用R重新写一遍,看看使用 for和不用for的差别。数据在他的博客中下载。
比如第四部分的推荐算法,左一个for,右一个for,搞的人头昏,其实就是一个简单的加权平均。
4). 推荐算法
RECOMMENDER_NUM = 3
UserBasedRecommender = function(uid,n,M,S,N){
part = colnames(M)[is.na(M[uid,])]
m = S[uid, N[uid,]]
md = M[N[uid,],part]
if(length(dim(md)) >= 1) {
a = colnames(md)[colSums(is.na(md)) == 0]
score = colSums(md*m,na.rm = T)/apply(!is.na(md),2,function(x) sum(m[x]))
res = score[order(score,decreasing=T)][1:n]
res = res[intersect(names(res),a)]
return(res)
} else { res = NA}
}
5). 运行程序
R1 = UserBasedRecommender(1,RECOMMENDER_NUM,M,S,N);
R1
104 106
4.25 4.00