RHadoop协同过滤算法
生活随笔
收集整理的這篇文章主要介紹了
RHadoop协同过滤算法
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
###################################################################################################
##第一步,建立物品的共現(xiàn)矩陣:對(duì)用戶分組,找到每個(gè)用戶所選的物品,單獨(dú)出現(xiàn)計(jì)數(shù),及兩兩一組計(jì)數(shù)。
###################################################################################################
##加載plyr和rmr2包
library(plyr)
library(rmr2)
##輸入數(shù)據(jù)文件
train <- read.csv(file="/home/hyxy/Downloads/small.csv",header=FALSE)
names(train) <- c("user","item","pref")
##使用rmr的hadoop格式,hadoop是默認(rèn)設(shè)置
rmr.options(backend='hadoop')
##設(shè)置數(shù)據(jù)到HDFS上
train.hdfs=to.dfs(keyval(train$user,train))
##從hdfs上查看數(shù)據(jù)
from.dfs(train.hdfs)
#########################################################
##記錄重要點(diǎn):
##train.mr:這是MapReduce任務(wù)的key-value信息模型
##key:這是物品向量列表
##value:這是物品聯(lián)合向量
###########################################################MapReduce任務(wù)1:物品共現(xiàn)矩陣
train.mr <- mapreduce(train.hdfs,map=function(k,v){keyval(k,v$item)},##識(shí)別共現(xiàn)物品reduce=function(k,v){m <- merge(v,v)keyval(m$x,m$y)})##########################################################
##對(duì)物品組合列表進(jìn)行計(jì)數(shù),建立物品的同現(xiàn)矩陣。
##定義MapReduce任務(wù),step2.mr被用來(lái)計(jì)算聯(lián)合物品的頻率。
##Step2.mr:這是MapReduce任務(wù)的key-value信息模型
##key:這是物品向量列表
##value:這是數(shù)據(jù)框value(item,item,Freq)的共現(xiàn)矩陣
############################################################MapReduce函數(shù):計(jì)算聯(lián)合物品頻率step2.mr <- mapreduce(train.mr,map=function(k,v){d <- data.frame(k,v)d2 <- ddply(d,.(k,v),count)key <- d2$kval <- d2keyval(key,val)})##########################################################
##第二步,建立用戶對(duì)物品的評(píng)分矩陣
##train2.mr:這是MapReduce任務(wù)的key-value信息模型
##key:這是物品向量列表
##value:這是用戶物品評(píng)分矩陣的值
############################################################MapReduce任務(wù):建立用戶對(duì)物品的評(píng)分矩陣train2.mr <- mapreduce(train.hdfs,map=function(k,v){df <- v##物品的keykey <- df$item##[item,user,pref]的valueval <- data.frame(item=df$item,user=df$user,pref=df$pref)##頒布(key,value)對(duì)keyval(key,val)})
##從HDFS加載數(shù)據(jù)from.dfs(train2.mr)###########################################################
##以下是合并和共現(xiàn)評(píng)分矩陣:
##eq.hdfs:這是MapReduce任務(wù)的key-value信息模型
##key:key在這里是NULL
##value:這是合并的數(shù)據(jù)框值
#############################################################運(yùn)行equi連接兩個(gè)數(shù)據(jù)-step2.mr和train2.mreq.hdfs <- equijoin(left.input=step2.mr,right.input=train2.mr,map.left=function(k,v){keyval(k,v)},map.right=function(k,v){keyval(k,v)},outer=c("left"))
##從HDFS加載數(shù)據(jù)from.dfs(eq.hdfs)############################################################
##第三步,生成推薦部分,我們將獲得結(jié)果的推薦列表
##Cal.mr:這是MapReduce任務(wù)的key-value信息模型
##key:這是物品向量列表
##value:這是被推薦的結(jié)果的數(shù)據(jù)框值
##############################################################MapReduce任務(wù):從equi連接數(shù)據(jù)中獲得被推薦的結(jié)果列表cal.mr <- mapreduce(input=eq.hdfs,map=function(k,v){val <- vna <- is.na(v$user.r)if(length(which(na))>0) val <- v[-which(is.na(v$user.r)),]keyval(val$k.l,val)},reduce=function(k,v){val <- ddply(v,.(k.l,v.l,user.r),summarize,v=freq.l*pref.r)keyval(val$k1,val)})
##從HDFS加載數(shù)據(jù)from.dfs(cal.mr)############################################################################
##第四步:定義結(jié)果:獲得被推薦物品相關(guān)值得列表,評(píng)分進(jìn)程被應(yīng)用到推薦結(jié)果上
##result.mr:這是MapReduce任務(wù)的key-value信息模型
##key:這是用戶ID
##value:這是被推薦的結(jié)果,數(shù)據(jù)框value
#####################################################################MapReduce任務(wù):評(píng)分推薦輸出result.mr <- mapreduce(input=cal.mr,map=function(k,v){keyval(v$user.r,v)},reduce=function(k,v){val <- ddply(v,.(user.r,v.l),summarize,v=sum(v))val2 <- val[order(val$v,decreasing=TRUE),]names(val2) <- c("user","item","pref")keyval(val2$user,val2)})from.dfs(result.mr)
small.csv數(shù)據(jù)集:
| 1 | 101 | 5 |
| 1 | 102 | 3 |
| 1 | 103 | 2.5 |
| 2 | 101 | 2 |
| 2 | 102 | 2.5 |
| 2 | 103 | 5 |
| 2 | 104 | 2 |
| 3 | 101 | 2 |
| 3 | 104 | 4 |
| 3 | 105 | 4.5 |
| 3 | 107 | 5 |
| 4 | 101 | 5 |
| 4 | 103 | 3 |
| 4 | 104 | 4.5 |
| 4 | 106 | 4 |
| 5 | 101 | 4 |
| 5 | 102 | 3 |
| 5 | 103 | 2 |
| 5 | 104 | 4 |
| 5 | 105 | 3.5 |
| 5 | 106 | 4 |
總結(jié)
以上是生活随笔為你收集整理的RHadoop协同过滤算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: SMD封装尺寸
- 下一篇: qt 获取本机的wifi密码_还在记密码