今天想帮助别人吗? 根据用户之前的回答历史,我们可以把Stack Exchange的新问题推荐给一个能够回答的用户,这与亚马逊通过你之前的购买记录给你提供推荐很相似。不知道Stack Exchange是做什么的? - 它运行了很多的Q&A网站,包括广受欢迎的Stack Overflow。 我们目前的任务是如何分析用户之前的回答,从而预测该用户今后所能回答的问题。Stack Exchange目前的推荐逻辑可能比我们的好很多,但这不会阻止我们以个人学习目的去帮助他们;)。 我们将会做以下任务.
但是,一切从基础开始!如果你是第一次接触Apache Hadoop和Azure上的Hadoop,我建议你在开始之前阅读这些介绍性的文章,在我介绍HDInsight和Map Reduce模式时以便知道更详细的情况。 幕后让我们开始吧,先做一些分布式机器学习应用的“数据实验”,酷!
“大数据”这个术语通常在你需要处理一个非常大的数据集时使用。本文中,我们将从一个大的数据集中提取一些数据,然后根据我们提取的数据建立一个推荐。 推荐是什么?从广义上讲,我们可以通过如下方式建立推荐:
第一中技术手段称为基于用户的推荐,第二种称为基于产品的推荐。 在第一种情况下,会尝试确定你与该用户共同回答了多少问题(你们俩都回答的问题)。例如,现在有User1、User2、User3和User4 - 回答了Q1、Q2、Q3和Q4这几个问题。右边的图显示了用户及他们所回答的问题 根据这个图,User1和User2回答了Q1、Q2和Q3 - User2回答了Q2和Q3但没有回答Q1。现在,在一定程度上,我们可以放心地假设User3会有兴起回答Q1 - 因为两个和他一样都回答过Q2和Q3的用户已经回答过Q1。有点感觉了,是不是?所以,如果你有一个{用户名,问题ID}的对应数组 - 建立一个推荐所需的数据基本已经满足了。 逻辑表现在,我们究竟该怎样建立一个问题推荐呢?事实上,它是相当简单的。 首先,我们需要找出用户与问题对共同出现的次数。请注意,该矩阵与用户无关。例如,如果Q1和Q2共同出现了2次(在上面的图中),则共同发生值{Q1,Q2}即为2。这是个共生矩阵(希望我是对的)。
上面的矩阵显示了上面我们所讨论的问题(回答)对发生的次数。现在还没有映射到用户。现在,我们如何将这个联系到用户喜好呢?要找出一个问题匹配用户的程度我们只需要:
第一步,我们需要将上述矩阵变更成用户的偏好矩阵。 让我们拿User3做个示范,对User3来说,因为他已回答了问题Q2、Q3而没有回答Q1、Q4,所以他对问题[Q1,Q2,Q3,Q4]的偏好映射为[0,1,1,0],现在,让我们把这个数据与上面的矩阵合并,注意这是一个点积矩阵。结果显示了用户连带回答各个问题的频率(权重)。 我们可以在结果中忽略Q2和Q3,因为我们已经知道用户回答了它们。现在剩下Q1和Q4 – Q1具有更高的值(4)更匹配User3。换种方式讲,这表明Q1相比Q4来说与User3已回答的问题(Q2和Q3)关联性更大–所以相比Q4,User3将更有兴趣回答Q1。在实际的应用中需要注意:随着用户的回答会逐渐集中,用户的偏好矩阵是将会是稀疏矩阵(主要是零)。该逻辑的优点:我们可以使用多个任务使用分布式的MapReduce模型来计算用户矩阵,找到每个用户的点积矩阵等。 |