ubuntu下安装r-base,然后进入终端:R;source "douban.R" 代码:“douban.R” #读入数据 data=read.table('data.dat',sep=',',header=TRUE) #标识索引 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 #对列向量进行标准化 mod=colSums(M^2)^0.5 #各列的模 MM=M %*% diag(1/mod) #向量的内积 S=crossprod(MM) #用户-主题的分值 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) 数据如下: user_id,subject_id 1,1 1,3 1,7 1,13 2,2 2,5 2,6 2,7 2,9 2,10 2,11 3,1 3,2 3,3 3,4 3,7 3,9 3,10 5,13 6,1 6,3 6,4 6,5 6,8 6,10 8,1 8,2 8,3 8,5 8,6 8,7 8,8 9,13 10,12 11,2 11,3 11,4 11,6 11,8 11,9 11,13 12,12 13,3 13,6 13,7 15,4 15,12 15,13 16,2 16,3 16,4 16,7 16,8 17,2 17,3 17,4 17,5 17,6 17,7 17,8 17,9 17,10 17,11 18,2 18,3 19,2 19,3 19,5 19,6 19,9 19,10 19,11 19,12 20,1 20,3 20,4 20,7 20,13 21,1 21,6 21,8 21,9 21,11 21,12 21,13 22,6 23,2 23,4 23,9 23,12 24,1 24,5 24,9 25,2 25,6 25,10 25,11 26,2 26,3 26,8 27,3 27,6 27,12 27,13 28,1 28,2 28,3 28,5 28,7 28,9 28,10 28,11 28,12 28,13 29,1 29,2 29,3 29,4 29,5 29,6 29,7 29,8 29,9 29,10 30,6 30,7 30,9 30,13 31,6 31,11 32,1 32,5 33,2 33,13 34,3 34,7 34,8 34,9 34,10 34,13 35,3 35,4 35,5 35,6 35,7 36,2 36,3 36,4 36,6 36,7 36,8 36,9 36,11 36,12 36,13 38,5 41,1 41,3 41,4 41,5 41,6 41,7 41,11 42,2 42,3 42,7 42,8 42,9 42,10 42,11 43,2 43,6 43,10 43,11 43,12 最终的结果"result.dat" 1:c(3, 7, 1, 13, 9) 2:c(9, 10, 2, 11, 6) 3:c(3, 7, 9, 2, 10) 5:c(13, 9, 12, 3, 7) 6:c(3, 7, 5, 4, 8) 8:c(3, 7, 2, 8, 5) 9:c(13, 9, 12, 3, 7) 10:c(12, 11, 13, 9, 2) 11:c(3, 9, 2, 8, 7) 12:c(12, 11, 13, 9, 2) 13:c(7, 3, 6, 2, 9) 15:c(13, 12, 4, 3, 9) 16:c(3, 7, 8, 2, 4) 17:c(3, 2, 7, 9, 10) 18:c(3, 2, 7, 8, 10) 19:c(2, 9, 11, 10, 6) 20:c(3, 7, 4, 1, 13) 21:c(9, 6, 11, 3, 2) 22:c(6, 11, 7, 3, 2) 23:c(9, 2, 4, 3, 12) 24:c(5, 1, 9, 7, 3) 25:c(11, 2, 10, 6, 9) 26:c(3, 8, 2, 7, 9) 27:c(6, 3, 13, 12, 9) 28:c(9, 3, 7, 2, 10) 29:c(3, 7, 9, 2, 10) 30:c(9, 7, 6, 3, 13) 31:c(6, 11, 2, 9, 10) 32:c(5, 1, 3, 7, 10) 33:c(13, 2, 9, 3, 7) 34:c(3, 7, 9, 8, 2) 35:c(3, 7, 4, 6, 5) 36:c(3, 9, 2, 7, 6) 38:c(5, 1, 10, 3, 7) 41:c(3, 7, 5, 6, 4) 42:c(2, 3, 9, 10, 7) 43:c(11, 2, 10, 6, 9)