mahout基于项目的协同过滤步骤

来源:互联网 发布:华为笔试java 编辑:程序博客网 时间:2024/06/05 01:51

第一阶段:

   该阶段包含三个job

   1)输入是原始数据,格式为:<userid,itemid,preference> 计算每个teamid对应的index,并保存index及其对应的teamid中的最小值,输出为<index,min(teamid)> 

   2)输入为原始数据,格式为:<userid,itemid,preference> ,生成用户矩阵,输出为:<userid,vector<IndexOfIteamid,pre>>

   3输入为(2)的结果,生成项目矩阵,输出为:<IndexOfIteamid,vector<IndexOfUserId,pre>>

 

第二阶段:

   该阶段包含5job:其中前4个属于RowSimilarityJob步骤,生成相似度矩阵,第五个为输出TextOutputFormat文件格式的相似度矩阵。

  4)输入为(3)的结果,统计数据中不同user的个数,输出为:vector<IndexOfUseridCountOfUser>

  5)输入为(3)的结果,对输入进行选样,输出(3)的样本对应的转置,

<IndexOfuserid,vector<IndexOfIteamid,pre>>,输出每个样本项目对应多的norm值,

vector<IndexOfIteamid,norm(teamid)>,如果用户设定threshold参数,而不是默认值,则还输出每个样本项目对应的用户数及对应的pref最大值,

vector<IndexOfIteamid,numNonZeroEntries> ,vector<IndexOfIteamid,maxValue>

  6)输入为(5)的输出,其中转置矩阵作为job的输入,其它利用configure的参数传递文件地址,进而通过地址操作文件,生成共生矩阵(相似度矩阵上三角),输出为:<IndexOfIteamA,vector<IndexOfIteamB,similarityValue>>如果用户设定threshold参数,而不是默认值,则similarityValue小于threshold的对应项被丢弃。由threshold参数和文件地址中的内容共同决定是否计算IteamA IteamB的相似度。

  7)输入为(6)的输出,生成完整的相似度矩阵,并保留每个项目对应的相似度最大的topk项,输出为:<IndexOfIteamA,vector<IndexOfIteamB,similarityValue>>

  8)输入为(7)的输出,生成相似度矩阵的TextOutputFormat文件,输出为:<<IteamA,IteamB>,similarityValue>

 

第三阶段:

  该阶段由一个Job完成,该Job由两个输入路径,两种不同的map,一种reduce组成。

  1. 第一个输入为(7)的输出,对应第一个map,将输入的相似度向量中与自己的相似度设为NAN,输出为:<IndexOfIteamA,vector<IndexOfIteamB,similarityValue>>;第二个输入为(2)的输出,对应第二个map,如果存在推荐用户表,则只针对需要推荐的用户生成对应的转置<IndexOfIteamid,vector<userId,pref>>,如果不存在推荐用户表,则对所有用户生成对应的转置<IndexOfIteamid,vector<userId,pref>>。注意:第二个map中只保留pref最大的前N项对应的IndexOfIteamid,其他的IndexOfIteamid对应的pref设为NAN

Reduce将上面两种map的输出作为输入,生成项目对应的相似项,用户及评分,输出为:

<IndexOfIteamid,<similarityMatrixColumnOfIndexOfIteamid,UserListOfIndexOfIteamid,prefListOfIndexOfIteamid>>

 

第四阶段:

 

 该阶段包含两个job

  1. 如何用户设定过滤文件,则进行该job,输入为该过滤文件,将过滤文件中用户-项目对应的相似项目中的对应值设为NAN(用于后面的过滤),输出为<IndexOfIteamid,<similarityMatrixColumnOfIndexOfIteamid,UserListOfIndexOfIteamid,prefListOfIndexOfIteamid>>

 

  1. 计算用户的推介项目,在计算结果后,保存结果之前进行过滤,对所有用户,根据推荐项目表,对推介项目进行过滤,同时利用过滤文件产生的结果,进行二次过滤。生成:<userid,List<iteamid,value>>

 

0 0