当前位置:天才代写 > tutorial > 其他教程 > RHadoop实践系列之三 R实现MapReduce的协同过滤算法

RHadoop实践系列之三 R实现MapReduce的协同过滤算法

2017-12-04 08:00 星期一 所属: 其他教程 浏览:415

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. 矩阵计较推荐功效

同现矩阵*评分矩阵=推荐功效

alogrithm_1

图片摘自”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的任务完成,措施实现进程略有变革。

aglorithm_2

图片摘自”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下一页

 

    关键字:

天才代写-代写联系方式