RHadoop实践系列文章
RHadoop实践系列文章,包括了R语言与Hadoop团结举办海量数据阐明。Hadoop主要用来存储海量数据,R语言完成MapReduce
算法,用来替代Java的MapReduce实现。有了RHadoop可以让宽大的R语言喜好者,有更强大的东西处理惩罚大数据。1G, 10G,
100G, TB,PB 由于大数据所带来的单机机能问题,大概会一去联复返了。
RHadoop实践是一套系列文章,主要包罗”Hadoop情况搭建”,”RHadoop安装与利用”,”R实现MapReduce的算法案
例”,”HBase和rhbase的安装与利用”。对付单独的R语言喜好者,Java喜好者,可能Hadoop喜好者来说,同时具备三种语言常识并不容
易。
由于rmr2的对hadoop操纵有一些非凡性,代码实现有必然难度。需要深入进修的同学,请多实验并思考key/value值的设计。
本文难度为中高级。
第三篇 R实现MapReduce的协同过滤算法,分为3个章节。
1.基于物品推荐的协同过滤算法先容
2.R当地措施实现
3.R基于Hadoop分步式措施实现
每一章节,城市分为”文字说明部门”和”代码部门”,保持文字说明与代码的连贯性。
注:Hadoop情况及RHadoop的情况,请查察同系列前二篇文章,此文将不再先容。
1. 基于物品推荐的协同过滤算法先容
文字说明部门:
越来越多的互联网应用,都开始利用推荐算法(协同过滤算法)。按照用户活泼度和物品风行度,可以分为”基于用户的协同过滤算法”和”基于物品的协同过滤算法”。
基于用户的协同过滤算法,是给用户推荐和他乐趣相似的其他用户喜欢的物品。
基于物品的协同过滤算法,是给用户推荐和他之前喜欢的物品相似的物品。
基于物品的协同过滤算法,是今朝遍及利用的一种推荐算法,像Netflix, YouTube, Amazon等。
算法主要分为两步:
1. 计较物品之间的相似度
2. 按照物品的相似度和用户的汗青行为给用户生成推荐列表
有关算法的细节请参考:”Mahout In Action”和”推荐系统实践”两本书。
为开拓利便,我们选择一组很小的测试数据集。
测试数据,来自于”Mahout In Action” P49
原第8行,3,101,2.5 改为 3,101,2.0
每行3个字段,依次是用户ID,物品ID,对物品的评分
代码部门:
在处事上建设测试数据文件small.csv
~ pwd
/root/R
~ vi small.csv
1,101,5.0
1,102,3.0
1,103,2.5
2,101,2.0
2,102,2.5
2,103,5.0
2,104,2.0
3,101,2.0
3,104,4.0
3,105,4.5
3,107,5.0
4,101,5.0
4,103,3.0
4,104,4.5
4,106,4.0
5,101,4.0
5,102,3.0
5,103,2.0
5,104,4.0
5,105,3.5
5,106,4.0
~ ls
small.csv
2. R当地措施实现
首先,通过R语言实现基于物品的协同过滤算法,为和RHadoop实现举办比拟。这里我利用”Mahout In
Action”书里,第一章第六节先容的分步式基于物品的协同过滤算法举办实现。Chapter 6: Distributing
recommendation computations
算法的思想:
1. 成立物品的同现矩阵
2. 成立用户对物品的评分矩阵
3. 矩阵计较推荐功效
文字说明部门:
1. 成立物品的同现矩阵
按用户分组,找到每个用户所选的物品,单独呈现计数,及两两一组计数。
譬喻:用户ID为3的用户,别离给101,104,105,107,这4个物品打分。
1) (101,101),(104,104),(105,105),(107,107),单独呈现计较各加1。
2) (101,104),(101,105),(101,107),(104,105),(104,107),(105,107),两个一组计数各加1。
3) 把所有用户的计较功效求和,生成一个三角矩阵,再补全三角矩阵,就成立了物品的同现矩阵。
如下面矩阵所示:
[101] [102] [103] [104] [105] [106] [107]
[101] 5 3 4 4 2 2 1
[102] 3 3 3 2 1 1 0
[103] 4 3 4 3 1 2 0
[104] 4 2 3 4 2 2 1
[105] 2 1 1 2 2 1 1
[106] 2 1 2 2 1 2 0
[107] 1 0 0 1 1 0 1
2. 成立用户对物品的评分矩阵
按用户分组,找到每个用户所选的物品及评分
譬喻:用户ID为3的用户,别离给(3,101,2.0),(3,104,4.0),(3,105,4.5),(3,107,5.0),这4个物品打分。
1) 找到物批评分(3,101,2.0),(3,104,4.0),(3,105,4.5),(3,107,5.0)
2) 成立用户对物品的评分矩阵
U3
[101] 2.0
[102] 0.0
[103] 0.0
[104] 4.0
[105] 4.5
[106] 0.0
[107] 5.0
3. 矩阵计较推荐功效
同现矩阵*评分矩阵=推荐功效
图片摘自”Mahout In Action”
推荐给用户ID为3的用户的功效是(103,24.5),(102,18.5),(106,16.5)
#p#分页标题#e#
代码部门:
#引用plyr包
library(plyr)
#读取数据集
train<-read.csv(file="small.csv",header=FALSE)
names(train)<-c("user","item","pref")
> train
user item pref
1 1 101 5.0
2 1 102 3.0
3 1 103 2.5
4 2 101 2.0
5 2 102 2.5
6 2 103 5.0
7 2 104 2.0
8 3 101 2.0
9 3 104 4.0
10 3 105 4.5
11 3 107 5.0
12 4 101 5.0
13 4 103 3.0
14 4 104 4.5
15 4 106 4.0
16 5 101 4.0
17 5 102 3.0
18 5 103 2.0
19 5 104 4.0
20 5 105 3.5
21 5 106 4.0
#计较用户列表
usersUnique<-function(){
users<-unique(train$user)
users[order(users)]
}
#计较商品列表要领
itemsUnique<-function(){
items<-unique(train$item)
items[order(items)]
}
# 用户列表
users<-usersUnique()
> users
[1] 1 2 3 4 5
# 商品列表
items<-itemsUnique()
> items
[1] 101 102 103 104 105 106 107
#成立商品列表索引
index<-function(x) which(items %in% x)
data<-ddply(train,.(user,item,pref),summarize,idx=index(item))
> data
user item pref idx
1 1 101 5.0 1
2 1 102 3.0 2
3 1 103 2.5 3
4 2 101 2.0 1
5 2 102 2.5 2
6 2 103 5.0 3
7 2 104 2.0 4
8 3 101 2.0 1
9 3 104 4.0 4
10 3 105 4.5 5
11 3 107 5.0 7
12 4 101 5.0 1
13 4 103 3.0 3
14 4 104 4.5 4
15 4 106 4.0 6
16 5 101 4.0 1
17 5 102 3.0 2
18 5 103 2.0 3
19 5 104 4.0 4
20 5 105 3.5 5
21 5 106 4.0 6
#同现矩阵
cooccurrence<-function(data){
n<-length(items)
co<-matrix(rep(0,n*n),nrow=n)
for(u in users){
idx<-index(data$item[which(data$user==u)])
m<-merge(idx,idx)
for(i in 1:nrow(m)){
co[m$x[i],m$y[i]]=co[m$x[i],m$y[i]]+1
}
}
return(co)
}
#推荐算法
recommend<-function(udata=udata,co=coMatrix,num=0){
n<-length(items)
# all of pref
pref<-rep(0,n)
pref[udata$idx]<-udata$pref
# 用户评分矩阵
userx<-matrix(pref,nrow=n)
# 同现矩阵*评分矩阵
r<-co %*% userx
# 推荐功效排序
r[udata$idx]<-0
idx<-order(r,decreasing=TRUE)
topn<-data.frame(user=rep(udata$user[1],length(idx)),item=items[idx],val=r[idx])
topn0),]
# 推荐功效取前num个
if(num>0){
topn<-head(topn,num)
}
# 推荐功效取前num个
if(num>0){
topn<-head(topn,num)
}
#返回功效
return(topn)
}
#生成同现矩阵
co<-cooccurrence(data)
> co
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,] 5 3 4 4 2 2 1
[2,] 3 3 3 2 1 1 0
[3,] 4 3 4 3 1 2 0
[4,] 4 2 3 4 2 2 1
[5,] 2 1 1 2 2 1 1
[6,] 2 1 2 2 1 2 0
[7,] 1 0 0 1 1 0 1
#计较推荐功效
recommendation<-data.frame()
for(i in 1:length(users)){
udata<-data[which(data$user==users[i]),]
recommendation<-rbind(recommendation,recommend(udata,co,0))
}
> recommendation
user item val
1 1 104 33.5
2 1 106 18.0
3 1 105 15.5
4 1 107 5.0
5 2 106 20.5
6 2 105 15.5
7 2 107 4.0
8 3 103 24.5
9 3 102 18.5
10 3 106 16.5
11 4 102 37.0
12 4 105 26.0
13 4 107 9.5
14 5 107 11.5
3. R基于Hadoop分步式措施实现
R语言实现的MapReduce算法,可以基于R的数据工具实现,不必如JAVA一样利用文本存储。
算法思想同上面R语言实现思想,略有巨大。
算法的思想:
1. 成立物品的同现矩阵
1) 按用户分组,获得所有物品呈现的组合列表。
2) 对物品组合列表举办计数,成立物品的同现矩阵
2. 成立用户对物品的评分矩阵
3. 归并同现矩阵和评分矩阵
4. 计较推荐功效列表
5. 按输入名目获得推荐评排列表
通过MapReduce实现时,所有操纵都要利用Map和Reduce的任务完成,措施实现进程略有变革。
图片摘自”Mahout In Action”
文字说明部门:
1. 成立物品的同现矩阵
1) 按用户分组,获得所有物品呈现的组合列表。
key:物品列表向量
val:物品组合向量
$key
[1] 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 102 102 102 102
[20] 102 102 102 103 103 103 103 103 103 103 103 103 103 103 104 104 104 104 104
[39] 104 104 104 104 104 104 104 105 105 105 105 106 106 106 106 107 107 107 107
[58] 101 101 101 101 101 101 102 102 102 102 102 102 103 103 103 103 103 103 104
[77] 104 104 104 104 104 105 105 105 105 105 105 106 106 106 106 106 106
$val
[1] 101 102 103 101 102 103 104 101 104 105 107 101 103 104 106 101 102 103 101
[20] 102 103 104 101 102 103 101 102 103 104 101 103 104 106 101 102 103 104 101
[39] 104 105 107 101 103 104 106 101 104 105 107 101 103 104 106 101 104 105 107
[58] 101 102 103 104 105 106 101 102 103 104 105 106 101 102 103 104 105 106 101
[77] 102 103 104 105 106 101 102 103 104 105 106 101 102 103 104 105 106
2) 对物品组合列表举办计数,成立物品的同现矩阵
#p#分页标题#e#
key:物品列表向量
val:同现矩阵的数据框值(item,item,Freq)
矩阵名目,要与”2. 成立用户对物品的评分矩阵”的名目一致,把异构的两种数据源,归并为同一种数据名目,为”3. 归并 同现矩阵 和 评分矩阵”做数据基本。
$key
[1] 101 101 101 101 101 101 101 102 102 102 102 102 102 103 103 103 103 103 103
[20] 104 104 104 104 104 104 104 105 105 105 105 105 105 105 106 106 106 106 106
[39] 106 107 107 107 107
$val
k v freq
1 101 101 5
2 101 102 3
3 101 103 4
4 101 104 4
5 101 105 2
6 101 106 2
7 101 107 1
8 102 101 3
9 102 102 3
10 102 103 3
11 102 104 2
12 102 105 1
13 102 106 1
14 103 101 4
15 103 102 3
16 103 103 4
17 103 104 3
18 103 105 1
19 103 106 2
20 104 101 4
21 104 102 2
22 104 103 3
23 104 104 4
24 104 105 2
25 104 106 2
26 104 107 1
27 105 101 2
28 105 102 1
29 105 103 1
30 105 104 2
31 105 105 2
32 105 106 1
33 105 107 1
34 106 101 2
35 106 102 1
36 106 103 2
37 106 104 2
38 106 105 1
39 106 106 2
40 107 101 1
41 107 104 1
42 107 105 1
43 107 107 1
123下一页