推荐引擎根据用户的特定需求帮助用户缩小选择范围。在这篇文章中,我们一起来探秘推荐引擎各部分是如何协同工作的。我们将根据电影评分数据,用协同过滤的方法来推荐电影。其关键部分是基于Apache Mahout的协同过滤算法来建立和训练机器学习模型,以及基于Elasticsearch的搜索技术来简化推荐系统的开发。
什么是推荐?
推荐(Recommendation)是机器学习的一个分支,通过分析数据来预测用户的喜好或者给物品评分。推荐系统在业界被广泛运用:
Netflix的推荐引擎
电影推荐依赖于以下的观点:
推荐引擎架构
推荐引擎的架构
推荐引擎的架构如下所示:
推荐引擎的架构
基于Mahout的协同过滤
基于Mahout的协同过滤引擎着眼于用户的历史行为,并试图猜测在今后某个场景下用户可能喜欢什么。这是通过分析用户过去交互过的产品和内容来完成的。Mahout尤其关注物品是如何在用户历史记录中共同出现的。共同出现是Apache Mahout计算被推荐物品显著性标识的基础。假设Ted喜欢电影A、B和C,Carol喜欢电影A和B。在给Bob推荐电影时,我们注意到Bob喜欢电影B,由于Ted 和Carol也很喜欢电影B,因而电影A是一个备选推荐项。当然,这是一个很小的例子。在实际生活中,我们将通过海量数据来挖掘信息。
推荐网格
为了获得推荐有用的标识符,Mahout的物品相似度(ItemSimilarity)项目根据用户历史行为建立了三个矩阵:
1. 历史矩阵 :包含用户和物品的交互信息,用户X物品的二维矩阵结构。
历史矩阵
2. 共生矩阵 :把历史矩阵转化为物品和物品间关系的矩阵,记录哪些物品在用户历史记录中共同出现过。
共生矩阵
在这个例子中,电影A和电影B共同出现一次,而电影A和电影C 共同出现两次。共生矩阵不能直接用作推荐的标识符,因为极其常见的物品总是会伴随着大量的其它物品出现。
3. 标识符矩阵 :标识符矩阵只记录能作为推荐线索的异常(令人关注的)同现。有些物品(这里指电影)由于广受欢迎,几乎每个人都喜欢它们,意味着它们将伴随所有物品出现。它们对于推荐系统而言就不值得关注(非异常)。而过于稀疏的共同出现也不可靠,因此也不记录在标识符矩阵中。在这个例子中,电影A是电影B的标识符之一。
标识符矩阵
Mahout同时并行地运行多个MapReduce作业来计算物品的共同出现(Mahout 1.0运行在 Apache Spark之上)。Mahout的 ItemSimilarity作业用对数似然比检验(LLR)来确定哪些共同出现足够反常可以作为推荐标识符。系统输出相似度大于设定阈值的那些物品间。
Mahout ItemSimilarity作业的输出,给出了物品两两之间哪些总是共同出现、哪些能作为推荐依据。例如,电影B这一行的电影A这一列被标记,这意味着喜欢电影A可以作为你也喜欢电影B的一个标识符。
标识符矩阵
Elasticsearch搜索引擎
Elasticsearch搜索引擎
Elasticsearch是建立在全文搜索引擎库Apache Lucene之上的开源搜索引擎。全文搜索使用准确度(Precision)和召回率(Recall)评估搜索结果:
Elasticsearch存储的文档由多个不同的字段组成。每个字段都有对应的名字和内容。
对于我们的推荐引擎,我们存储电影的元数据(如id、标题、流派和电影推荐标识符)到一个JSON文档中:
{ “id”: "65006", "title": "Electric Horseman", "year": "2008", "genre": ["Mystery","Thriller"] }
标识符矩阵的数据,那些标识显著性或是共同出现兴趣度的信息,被存放在Elasticsearch电影文件标识符字段。例如,由于电影A是电影B的一个标识符,电影A就会被存储在电影B文件的标识符字段中。这意味着,当我们搜索电影A为标识符的电影,电影B就会被推荐给我们。
推荐矩阵
搜索引擎已经对搜索和查询词相关的字段做过优化。我们就根据和查询词最匹配的标识符字段,用搜索引擎来寻找电影。
了解更多搭建推荐引擎的信息,我们建议您查看以下资源: