用R解析mahout用户推荐协同过滤算法
2015-05-16 09:58
288 查看
##建立模型 FileDataModel=function(file){ data=read.csv(file,header=F) names(data)=c('uid','iid','pref') user=unique(data$uid) item=unique(sort(data$iid)) uidx=match(data$uid,user) iidx=match(data$iid,item) M=matrix(0,length(user),length(item)) i=cbind(uidx,iidx,pref=data$pref) for(n in 1:nrow(i)){ M[i[n,][1],i[n,][2]]=i[n,][3] } dimnames(M)[[2]]=item M } ##欧式距离相似度算法 EuclideanDistanceSimilarity=function(M){ row=nrow(M) s=matrix(0,row,row) for(z1 in 1:row){ for(z2 in 1:row){ if(z1<z2){ <span=""> num=intersect(which(M[z1,]!=0),which(M[z2,]!=0)) #可计算的列 sum=0 for(z3 in num ){ sum<-sum+(M[z1,][z3]-M[z2,][z3])^2 } s[z2,z1]<-length(num)/(1+sqrt(sum)) if(s[z2,z1]>1) s[z2,z1]<-1 #标准化 if(s[z2,z1]< -1) s[z2,z1]<- -1 #标准化 #print(paste(z1,z2));print(num);print(sum) } } } ts<-t(s) w<-which(upper.tri(ts)) s[w]<-ts[w] s } ##最紧邻算法 NearestNUserNeighborhood<-function(S,n){ row<-nrow(S) neighbor<-matrix(0, row, n) for(z1 in 1:row){ for(z2 in 1:n){ m<-which.max(S[,z1]) # print(paste(z1,z2,m,'\n')) neighbor[z1,][z2]<-m S[,z1][m]=0 } } neighbor } ###4). 推荐算法 UserBasedRecommender<-function(uid,n,M,S,N){ row<-ncol(N) col<-ncol(M) r<-matrix(0, row, col) N1<-N[uid,] for(z1 in 1:length(N1)){ num<-intersect(which(M[uid,]==0),which(M[N1[z1],]!=0)) #可计算的列 # print(num) for(z2 in num){ # print(paste("for:",z1,N1[z1],z2,M[N1[z1],z2],S[uid,N1[z1]])) r[z1,z2]=M[N1[z1],z2]*S[uid,N1[z1]] } } sum<-colSums(r) s2<-matrix(0, 2, col) for(z1 in 1:length(N1)){ num<-intersect(which(colSums(r)!=0),which(M[N1[z1],]!=0)) for(z2 in num){ s2[1,][z2]<-s2[1,][z2]+S[uid,N1[z1]] s2[2,][z2]<-s2[2,][z2]+1 } } s2[,which(s2[2,]==1)]=10000 s2<-s2[-2,] r2<-matrix(0, n, 2) rr<-sum/s2 item <-dimnames(M)[[2]] for(z1 in 1:n){ w<-which.max(rr) if(rr[w]>0.5){ r2[z1,1]<-item[which.max(rr)] r2[z1,2]<-as.double(rr[w]) rr[w]=0 } } r2 }
5). 运行程序 FILE<-"testCF.csv" NEIGHBORHOOD_NUM<-2 RECOMMENDER_NUM<-3 M<-FileDataModel(FILE) S<-EuclideanDistanceSimilarity(M) N<-NearestNUserNeighborhood(S,NEIGHBORHOOD_NUM) R1<-UserBasedRecommender(1,RECOMMENDER_NUM,M,S,N);R1 ## [,1] [,2] ## [1,] "104" "4.25" ## [2,] "106" "4" ## [3,] "0" "0" R2<-UserBasedRecommender(2,RECOMMENDER_NUM,M,S,N);R2 ## [,1] [,2] ## [1,] "105" "3.95699903407931" ## [2,] "0" "0" ## [3,] "0" "0" R3<-UserBasedRecommender(3,RECOMMENDER_NUM,M,S,N);R3 ## [,1] [,2] ## [1,] "103" "3.18540697329411" ## [2,] "102" "2.80243217111765" ## [3,] "0" "0" R4<-UserBasedRecommender(4,RECOMMENDER_NUM,M,S,N);R4 ## [,1] [,2] ## [1,] "102" "3" ## [2,] "0" "0" ## [3,] "0" "0" R5<-UserBasedRecommender(5,RECOMMENDER_NUM,M,S,N);R5 ## [,1] [,2] ## [1,] 0 0 ## [2,] 0 0 ## [3,] 0 0
相关文章推荐
- 用R解析Mahout用户推荐协同过滤算法(UserCF)
- 用R解析Mahout用户推荐协同过滤算法(UserCF)
- 用R解析Mahout用户推荐协同过滤算法(UserCF)
- 用R解析Mahout用户推荐协同过滤算法(UserCF)
- R全面解析Mahout的基于用户推荐协同过滤算
- 推荐引擎之Mahout 基于用户协同过滤算法的使用
- 推荐引擎之Mahout 基于用户协同过滤算法的使用
- 推荐系统:基于用户和基于物品的协同过滤算法的比较
- 实战智能推荐系统(7)-- 基于用户的协同过滤算法
- 基于协同过滤算法的电子商务网站用户行为分析及服务推荐
- 推荐系统实践--基于用户的协同过滤算法和python实现
- Mahout系列之推荐算法-基于用户协同过滤
- 实战智能推荐系统(7)-- 基于用户的协同过滤算法
- 实战智能推荐系统(7)-- 基于用户的协同过滤算法
- 一个简单的基于用户的mahout推荐程序
- Mahout基于项目的协同过滤算法源码分析(5)--推荐
- mahout实现基于用户的Mahout推荐程序
- 协同过滤算法处理用户推荐问题(源代码)
- mahout in Action2.2-给用户推荐图书(2)-分析对用户推荐书目的结果
- 推荐系统实践--基于用户的协同过滤算法