RHadoop协同过滤算法
生活随笔
收集整理的這篇文章主要介紹了
RHadoop协同过滤算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
###################################################################################################
##第一步,建立物品的共現矩陣:對用戶分組,找到每個用戶所選的物品,單獨出現計數,及兩兩一組計數。
###################################################################################################
##加載plyr和rmr2包
library(plyr)
library(rmr2)
##輸入數據文件
train <- read.csv(file="/home/hyxy/Downloads/small.csv",header=FALSE)
names(train) <- c("user","item","pref")
##使用rmr的hadoop格式,hadoop是默認設置
rmr.options(backend='hadoop')
##設置數據到HDFS上
train.hdfs=to.dfs(keyval(train$user,train))
##從hdfs上查看數據
from.dfs(train.hdfs)
#########################################################
##記錄重要點:
##train.mr:這是MapReduce任務的key-value信息模型
##key:這是物品向量列表
##value:這是物品聯合向量
###########################################################MapReduce任務1:物品共現矩陣
train.mr <- mapreduce(train.hdfs,map=function(k,v){keyval(k,v$item)},##識別共現物品reduce=function(k,v){m <- merge(v,v)keyval(m$x,m$y)})##########################################################
##對物品組合列表進行計數,建立物品的同現矩陣。
##定義MapReduce任務,step2.mr被用來計算聯合物品的頻率。
##Step2.mr:這是MapReduce任務的key-value信息模型
##key:這是物品向量列表
##value:這是數據框value(item,item,Freq)的共現矩陣
############################################################MapReduce函數:計算聯合物品頻率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)})##########################################################
##第二步,建立用戶對物品的評分矩陣
##train2.mr:這是MapReduce任務的key-value信息模型
##key:這是物品向量列表
##value:這是用戶物品評分矩陣的值
############################################################MapReduce任務:建立用戶對物品的評分矩陣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)對keyval(key,val)})
##從HDFS加載數據from.dfs(train2.mr)###########################################################
##以下是合并和共現評分矩陣:
##eq.hdfs:這是MapReduce任務的key-value信息模型
##key:key在這里是NULL
##value:這是合并的數據框值
#############################################################運行equi連接兩個數據-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加載數據from.dfs(eq.hdfs)############################################################
##第三步,生成推薦部分,我們將獲得結果的推薦列表
##Cal.mr:這是MapReduce任務的key-value信息模型
##key:這是物品向量列表
##value:這是被推薦的結果的數據框值
##############################################################MapReduce任務:從equi連接數據中獲得被推薦的結果列表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加載數據from.dfs(cal.mr)############################################################################
##第四步:定義結果:獲得被推薦物品相關值得列表,評分進程被應用到推薦結果上
##result.mr:這是MapReduce任務的key-value信息模型
##key:這是用戶ID
##value:這是被推薦的結果,數據框value
#####################################################################MapReduce任務:評分推薦輸出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數據集:
| 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 |
總結
以上是生活随笔為你收集整理的RHadoop协同过滤算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SMD封装尺寸
- 下一篇: qt 获取本机的wifi密码_还在记密码