mahout数据各步骤转换

原始数据:
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.5
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




第一阶段:将输入数据转化成矩阵


1.1 itemIDIndex 
说明:itemIDIndex 将Long型的itemID转成一个int型的index
input:启动计算时指定的--input路径  
output:***/preparePreferenceMatrix/itemIDIndex
101 101
102 102
103 103
104 104
105 105
106 106
107 107


1.2 toUserVectors
说明:转成user向量 USER_VECTORS (userId, VectorWritable<itemId, pref>)
input:启动计算时指定的--input路径  
output:***/preparePreferenceMatrix/userVectors
1 {103:2.5,102:3.0,101:5.0}
2 {104:2.0,103:5.0,102:2.5,101:2.0}
3 {107:5.0,105:4.5,104:4.0,101:2.5}
4 {106:4.0,104:4.5,103:3.0,101:5.0}
5 {106:4.0,105:3.5,104:4.0,103:2.0,102:3.0,101:4.0}
注:在此job的reducer中会累加计数user的数量到一个变量中。然后在此job完成后将用户数写到numUsers.bin中,便于后续job读取用户数。


1.3 toItemVectors
说明:使用 USER_VECTORS 构建item向量 RATING_MATRIX (itemId,VectorWritable<userId,pref>)
input:***/preparePreferenceMatrix/userVectors(1.2的输出)
output:***/preparePreferenceMatrix/ratingMatrix
101 {5:4.0,4:5.0,3:2.5,2:2.0,1:5.0}
102 {5:3.0,2:2.5,1:3.0}
103 {5:2.0,4:3.0,2:5.0,1:2.5}
104 {5:4.0,4:4.5,3:4.0,2:2.0}
105 {5:3.5,3:4.5}
106 {5:4.0,4:4.0}
107 {3:5.0}




第二阶段:计算相似性
RowSimilarityJob


2.1 normsAndTranspose
说明:计算每个item的norm,并转成user向量
(1)使用similarity.normalize处理每个item向量,使用similarity.norm计算每个item的norm,写到hdfs;
(2)根据item向量进行转置,即输入:item-(user,pref),输出:user-(item,pref)。
这一步的目的是将同一个user喜欢的item对找出来,因为只有两个item有相同的user喜欢,我们才认为它们是相交的,下面才有对它们计算相似度的必要。
input:***/preparePreferenceMatrix/ratingMatrix(1.3的输出)
output:***/weights


1 {103:2.5,102:3.0,101:5.0}
2 {101:2.0,104:2.0,103:5.0,102:2.5}
3 {101:2.5,107:5.0,105:4.5,104:4.0}
4 {101:5.0,106:4.0,104:4.5,103:3.0}
5 {106:4.0,105:3.5,104:4.0,103:2.0,102:3.0,101:4.0}


2.2 pairwiseSimilarity(大数据量测试运行很慢,运行约1小时)
说明:计算item对之间的相似度
input:***/weights(2.1的输出)  
output:***/pairwiseSimilarity


mapper:
CooccurrencesMapper extends Mapper<IntWritable, VectorWritable, IntWritable, VectorWritable>


101 {107:1.0,106:2.0,105:2.0,104:4.0,103:4.0,102:3.0}
102 {106:1.0,105:1.0,104:2.0,103:3.0}
103 {106:2.0,105:1.0,104:3.0}
104 {107:1.0,106:2.0,105:2.0}
105 {107:1.0,106:1.0}
106 {}
107 {}


2.3 asMatrix(大数据量测试运行很慢,运行约40分钟)
说明:构造完整的相似度矩阵(上面得到的只是一个斜半部分)
input:***/pairwiseSimilarity(2.2的输出)  
output:***/similarityMatrix


101 {107:1.0,106:2.0,105:2.0,104:4.0,103:4.0,102:3.0}
102 {101:3.0,106:1.0,105:1.0,104:2.0,103:3.0}
103 {101:4.0,106:2.0,105:1.0,104:3.0,102:3.0}
104 {107:1.0,106:2.0,105:2.0,103:3.0,102:2.0,101:4.0}
105 {107:1.0,106:1.0,104:2.0,103:1.0,102:1.0,101:2.0}
106 {101:2.0,105:1.0,104:2.0,103:2.0,102:1.0}
107 {105:1.0,104:1.0,101:1.0}




第三阶段:还是转化数据格式,为计算预测、推荐做准备
3.1 prePartialMultiply1
说明:只是添加了自身的相似度为NAN
input:***/similarityMatrixPath(2.3的输出)
output:***/prePartialMultiplyPath1


101 {107:1.0,106:2.0,105:2.0,104:4.0,103:4.0,102:3.0,101:NaN}
102 {106:1.0,105:1.0,104:2.0,103:3.0,102:NaN,101:3.0}
103 {106:2.0,105:1.0,104:3.0,103:NaN,102:3.0,101:4.0}
104 {107:1.0,106:2.0,105:2.0,104:NaN,103:3.0,102:2.0,101:4.0}
105 {107:1.0,106:1.0,105:NaN,104:2.0,103:1.0,102:1.0,101:2.0}
106 {106:NaN,105:1.0,104:2.0,103:2.0,102:1.0,101:2.0}
107 {101:1.0,107:NaN,105:1.0,104:1.0}


3.2 prePartialMultiply2
说明:对user,以每个item为key,userID和对应这个item的prefValue包装成一个VectorOrPrefWritable为value。
在此只是如果有usersToRecommendFor的话就只输出usersToRecommendFor中的用户的评分向量,没有的话默认是输出全部的用户评分向量。
还有过滤下每个用户的评分数量,默认是去10个评分,来预测。
input:***/preparePreferenceMatrix/userVectors(1.2的输出)  
output:***/prePartialMultiplyPath2


101 4:5.0
101 5:4.0
101 1:5.0
101 2:2.0
101 3:2.5
102 5:3.0
102 1:3.0
102 2:2.5
103 1:2.5
103 2:5.0
103 4:3.0
103 5:2.0
104 4:4.5
104 2:2.0
104 5:4.0
104 3:4.0
105 5:3.5
105 3:4.5
106 4:4.0
106 5:4.0
107 3:5.0




3.3 partialMultiply 
说明:以3.1和3.2的输出为输入,聚合到一起,生成item为key,VectorAndPrefsWritable为value为value。
VectorAndPrefsWritable包含了相似度矩阵中某个item一列和一个List<Long> userIDs,一个List<Float> values。
input:***/prePartialMultiplyPath1、2(3.1和3.2的输出)
output:***/prePartialMultiplyPath


101 {107:1.0,106:2.0,105:2.0,104:4.0,103:4.0,102:3.0,101:NaN} [5, 1, 4, 2, 3] [4.0, 5.0, 5.0, 2.0, 2.5]
102 {106:1.0,105:1.0,104:2.0,103:3.0,102:NaN,101:3.0} [5, 1, 2] [3.0, 3.0, 2.5]
103 {106:2.0,105:1.0,104:3.0,103:NaN,102:3.0,101:4.0} [4, 1, 2, 5] [3.0, 2.5, 5.0, 2.0]
104 {107:1.0,106:2.0,105:2.0,104:NaN,103:3.0,102:2.0,101:4.0} [4, 2, 5, 3] [4.5, 2.0, 4.0, 4.0]
105 {107:1.0,106:1.0,105:NaN,104:2.0,103:1.0,102:1.0,101:2.0} [5, 3] [3.5, 4.5]
106 {106:NaN,105:1.0,104:2.0,103:2.0,102:1.0,101:2.0} [4, 5] [4.0, 4.0]
107 {101:1.0,107:NaN,105:1.0,104:1.0} [3] [5.0]




第四阶段:预测并推荐
4.1 itemFiltering 
说明:推荐商品过滤,较简单,只是最后聚合输出成VectorAndPrefsWritable类型,跟3.3保持一致
input:***/filterFile(启动时指定的路径)  
output:***/explicitFilterPath


4.2 aggregateAndRecommend 聚合推荐(关键的一步)(大数据量测试运行很慢,运行约40分钟)
说明:聚合推荐,最后通过writeRecommendedItems(userID, recommendationVector, context)采用优先队列取到topK的推荐数据,并且将index转成真正的itemID,最终完成。
input:***/prePartialMultiplyPath(3.3的输出)  
output:启动时指定的路径


1 [105:3.875,104:3.7222223,106:3.6]
2 [106:2.9285715,105:2.5833333,107:2.0]
3 [106:3.5,102:3.3333333,103:3.3125]
4 [107:4.75,105:4.3333335,102:4.111111]
5 [107:3.8333333]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值