使用Windows Azure HDInsight, Hadoop和Mahout机器学习建立一个推荐引擎

13-07-16 banq
                   

Stack Exchange/Stack Overflow能够基于用户回答问题的历史提示他能够回答的问题,亚马逊能够基于你之前购买历史推荐产品给你。那么这后面的推荐机制是如何实现的?

Building A Recommendation Engine - Machine Learning Using Windows Azure HDInsight, Hadoop And Mahout一文谈了如何使用Windows Azure HDInsight, Hadoop和Mahout机器学习建立一个推荐引擎。

需求场景是:根据用户过去回答的问题,推测他将来能够回答的问题。

用户和问题之间关系如下图:

首先我们需要发现一对问题出现多少次,注意这个矩阵是和用户没有关系,跨越用户的,例如 Q1 和 Q2一起在上图出现了两次, 那么 {Q1,Q2}将是 2. 同理我们得出其他一对问题出现次数,如下图:

上面是问题出现次数,无关用户,下面我们将其和用户喜好联系起来:

1.因为是配对问题,有两个问题,如果其中一个问题被某个用户回答了,那么我们就可发现另外一个问题出现的频率。

2.清除已经被用户回答的问题

对于第一步实现,我们需要用用户喜好矩阵和上面矩阵相乘。

比如以User3为例,其对应问题矩阵[Q1,Q2,Q3,Q4] 是[0,1,1,0],也就是说他已经回答了Q2和Q3问题,但是Q1和Q4没有回答,那么就用上面问题次数的矩阵相乘。结果如下:

用User3的[0,1,1,0]和第一行Q1的[2,2,2,0]相乘后累计得4;[0,1,1,0]再和第二行Q2相乘后后累计得6,以此类推。

既然Q2和Q3已经被User3回答了,这个删除不算,剩余的是Q1和Q4,因为Q1的值是4, 大于Q4的值2,那么我们就认为Q1和User3的相关性要高于Q4。

注意:用户喜爱矩阵将是一个稀疏矩阵sparse matrix (主要是0),因为用户将要回答的问题只是过去问题的一个子集。(稀疏矩阵用于语言处理:http://www.jdon.com/45591)

上述逻辑的优势在于,我们可以使用一个分布式 map reduce模型实现,构建一个发生矩阵,然后发现每个用户的商品喜好。。

[该贴被admin于2013-07-22 07:09修改过]

                   

2
banq
2013-07-16 20:47

下面是该推荐系统实现:

1. 准备设定一个Hadoop集群

2.需要有样本数据用来分析 (使用Stack Overflow data)

Job 1 – 用来Extract数据 - 每行用 {UserId, QuestionId} 代表用户回答的所有问题

Job 2 – 建立推荐- 用上面Map Reduce输出结果建立推荐模型,每个用户可能相关的条目列表。

原文具体演示了.NET的hadoop SDK安装以及一些代码。

原文演示手工上传文件到HDFS,然后触发推荐任务,其实可以自动化这个工作,真实世界的数据分析还有很多工作要做,包括写一个 map/reducers用来extracting 和dumping数据到HDFS, 自动创建hive表, 使用HiveQL /PIG执行操作等。

yuanhotel
2013-07-19 17:47

学习了,原来还真没仔细想过推荐是怎么实现了。

BrightSpring
2013-09-13 14:34

.net我喜欢,有空试试