可能是史上代码最少的协同过滤推荐引擎
http://www.wentrue.net/blog/?p=970 可能是史上代码最少的协同过滤推荐引擎
自世界杯开幕以来,这是首次看不到球赛的两天,看不了球,就写篇博客吧,标题比较有噱头,实际上是用R实现的item-based CF推荐算法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
# 读入数据,原数据是user-subject的收藏二元组 data = read. table ( 'data.dat' , sep= ',' , header=TRUE ) # 标识user与subject的索引 user = unique ( data$user_id ) subject = unique ( data$subject_id ) uidx = match ( data$user_id, user ) iidx = match ( data$subject_id, subject ) # 从二元组构造收藏矩阵 M = matrix ( 0 , length ( user ) , length ( subject ) ) i = cbind ( uidx, iidx ) M [ i ] = 1 # 对列向量(subject向量)进行标准化,%*%为矩阵乘法 mod = colSums ( M^ 2 ) ^ 0.5 # 各列的模 MM = M %*% diag ( 1 /mod ) # M乘以由1/mod组成的对角阵,实质是各列除以该列的模 #crossprod实现MM的转置乘以MM,这里用于计算列向量的内积,S为subject的相似度矩阵 S = crossprod ( MM ) # user-subject推荐的分值 R = M %*% S R = apply ( R, 1 , FUN=sort, decreasing=TRUE, index. return =TRUE ) k = 5 # 取出前5个分值最大的subject res = lapply ( R, FUN=function ( r ) return ( subject [ r$ix [ 1 :k ] ] ) ) # 输出数据 write. table ( paste ( user , res, sep= ':' ) , file = 'result.dat' , quote=FALSE, row. name =FALSE, col. name =FALSE )
查看更多关于可能是史上代码最少的协同过滤推荐引擎的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did41971