apache mahout

最近, 我们一直在为Yap.TV实施推荐系统:您可以在安装应用程序并转到“ Just for you”标签后才能看到它的运行情况。 我们以Apache Mahout为基础进行建议。 Mahout是一个“可扩展的机器学习库”,包含使用协作过滤算法的基于用户和项目的推荐者的本地和分布式实现。

现在,我们将专注于本地单机实施。 如果您拥有多达数千万的首选项值,它应该会很好地工作。 除此之外,您可能应该考虑基于Hadoop的实现,因为数据根本无法放入内存中。

用Mahout编写基本的推荐器非常简单; 由于Mahout的可配置性很强,因此通常有不同的实现方式可供选择。 我只是描述一下我认为是“好的起点”。

基本

首先,您需要一个包含输入数据的文件。 格式非常简单:以逗号分隔的(用户ID,商品ID)对或(用户ID,商品ID,偏好值)三倍。 这表示您已经知道:哪些用户喜欢哪些项目,以及可选多少(例如1-5比例)。 id必须为整数,首选项值被视为浮点型。

让我们首先创建一个基于用户的推荐器:这是一个推荐器,当被问及用户A的推荐时,它首先查找与“ A”相似的用户,然后尝试查找这些相似用户已评价过的最佳商品,但A还没有。 为此,我们需要创建4个组件:

  • 数据模型 :这将使用文件
  • 用户相似度 :给定两个用户的度量,将返回代表他们相似度的数字
  • 邻域 :用于查找给定用户的邻域
  • 推荐者 :将这些片段组合在一起以产生推荐

对于一元输入数据(用户喜欢商品或我们不知道的商品),一个好的起点是:

val dataModel = new FileDataModel(file)
val userSimilarity = new LogLikelihoodSimilarity(dataModel)
val neighborhood = new NearestNUserNeighborhood(25, userSimilarity, dataModel)
val recommender = new GenericBooleanPrefUserBasedRecommender(dataModel, neighborhood, userSimilarity)

如果我们有偏好值(输入数据中的三倍):

val dataModel = new FileDataModel(file)
val userSimilarity = new PearsonCorrelationSimilarity(dataModel)
val neighborhood = new NearestNUserNeighborhood(25, userSimilarity, dataModel)
val recommender = new GenericUserBasedRecommender(dataModel, neighborhood, userSimilarity)

现在我们准备得到一些建议; 这很简单:

// Gets 10 recommendations
val result = recommender.recommend(userId, 10)// We get back a list of item-estimated preference value,
// sorted from the highest score
result.foreach(r => println(r.getItemID() + ": " + r.getValue()))

线上

在线方面呢? 以上内容对现有用户非常有用; 在服务中注册的新用户呢? 当然,我们也希望为他们提供一些合理的建议。 创建推荐器实例非常昂贵(肯定会比“正常”网络请求花费更长的时间),因此我们不能每次都创建一个新的推荐器。

幸运的是Mahout可以将临时用户添加到数据模型中。 常规设置如下:

  • 使用当前数据定期重新创建整个推荐器(例如每天或每小时-取决于需要多长时间)
  • 进行推荐时,请检查用户是否存在于系统中
  • 如果是,请像往常一样做建议
  • 如果不是,请创建一个临时用户,填写首选项,然后进行建议

如果内存有限,第一部分(定期重新创建推荐器)实际上可能非常棘手:创建新推荐器时,您需要在内存中保存两个数据副本(以便仍然能够处理来自服务器的请求老)。 但这实际上与建议没有任何关系,因此在这里我将不做详细介绍。

对于临时用户,我们可以使用PlusAnonymousConcurrentUserDataModel实例包装数据模型。 此类允许获取临时用户ID。 该ID必须稍后发布,以便可以重复使用(此类ID数量有限)。 获取ID后,我们必须填写首选项,然后我们可以像往常一样继续进行推荐:

val dataModel = new PlusAnonymousConcurrentUserDataModel(new FileDataModel(file),100)val recommender: org.apache.mahout.cf.taste.recommender.Recommender = ...// we are assuming a unary model: we only know which items a user likes
def recommendFor(userId: Long, userPreferences: List[Long]) = {if (userExistsInDataModel(userId)) {recommendForExistingUser(userId)} else {recommendForNewUser(userPreferences)}
}def recommendForNewUser(userPreferences: List[Long]) = {val tempUserId = dataModel.takeAvailableUser()try {// filling in a Mahout data structure with the user's preferencesval tempPrefs = new BooleanUserPreferenceArray(userPreferences.size)tempPrefs.setUserID(0, tempUserId)userPreferences.zipWithIndex.foreach { case (preference, idx) => tempPrefs.setItemID(idx, preference) }dataModel.setTempPrefs(tempPrefs, tempUserId)recommendForExistingUser(tempUserId)} finally {dataModel.releaseUser(tempUserId)}
}def recommendForExistingUser(userId: Long) = {recommender.recommend(userId, 10)
}

整合业务逻辑

由于某些业务规则,我们常常想提高所选项目的得分。 在我们的用例中,例如,如果某个节目有新剧集,我们希望给它更高的分数。 使用Mahout的IDRescorer接口可以实现。 调用Recommender.recommend时,提供了一个rescorer实例。 例如:

val rescorer = new IDRescorer {def rescore(id: Long, originalScore: Double) = {if (showIsNew(id)) {originalScore * 1.2 } else {originalScore}}def isFiltered(id: Long) = false
}// Gets 10 recommendations
val result = recommender.recommend(userId, 10, rescorer)

摘要

Mahout是创建推荐器的重要基础。 它是非常可配置的,并提供许多扩展点。 选择正确的配置参数值,设置评分和评估推荐结果还有很多工作要做,但是算法是可靠的,因此无需担心。

还有一本非常好的书《 Mahout in Action》 ,其中涵盖了推荐系统和Mahout的其他组件。 它基于版本0.5(当前版本为0.8),但是代码示例大部分有效,并且项目的主要逻辑是相同的。

参考:在Adam Warski博客的Blog中 ,我们的JCG合作伙伴 Adam Warski 使用Apache Mahout创建了一个在线推荐系统 。

翻译自: https://www.javacodegeeks.com/2013/10/creating-an-on-line-recommender-system-with-apache-mahout.html

apache mahout

apache mahout_使用Apache Mahout创建在线推荐系统相关推荐

  1. 使用Apache Mahout创建在线推荐系统

    最近, 我们一直在为Yap.TV实施推荐系统:在安装应用程序并转到" Just for you"选项卡后,您可以看到它的运行情况. 我们以Apache Mahout为基础进行建议. ...

  2. Mahout构建图书推荐系统

    前言 本文是Mahout实现推荐系统的又一案例,用Mahout构建图书推荐系统.与之前的两篇文章,思路上面类似,侧重点在于图书的属性如何利用.本文的数据在自于Amazon网站,由爬虫抓取获得. 目录 ...

  3. 如何基于 Apache Doris 与 Apache Flink 快速构建极速易用的实时数仓

    随着大数据应用的不断深入,企业不再满足离线数据加工计算的时效,实时数据需求已成为数据应用新常态.伴随着实时分析需求的不断膨胀,传统的数据架构面临的成本高.实时性无法保证.组件繁冗.运维难度高等问题日益 ...

  4. 用Apache Hadoop和Apache Solr处理和索引医学图像

    原文链接:Processing and Indexing Medical Images With Apache Hadoop and Apache Solr 作者:Justin Kestelyn 译者 ...

  5. Apache Kylin VS Apache Doris

    作者: 康凯森 日期: 2018-04-17 分类: OLAP 1 系统架构 1.1 What is Kylin 1.2 What is Doris 2 数据模型 2.1 Kylin的聚合模型 2.2 ...

  6. Mahout的taste推荐系统里的几种Recommender分析

    Taste简介 看自:http://blog.csdn.net/zhoubl668/article/details/13297583 Mahout 是apache下的一个java语言的开源大数据机器学 ...

  7. apache ignite_使用Apache Storm和Apache Ignite进行复杂事件处理(CEP)

    apache ignite 在本文中, "使用Apache Ignite进行高性能内存计算"一书的作者将讨论使用Apache Strom和Apache Ignite进行复杂的事件处 ...

  8. apache cxf_Wildfly,Apache CXF和@SchemaValidation

    apache cxf 在过去的几天中,我一直在进行从JBoss 4到Wildfly 8的应用程序迁移. 该应用程序使用了不同的技术,但是我们这里将重点放在XML Web Services JAX-WS ...

  9. apache mesos_在Twitter上使用Apache Mesos和Apache Aurora进行资源调度和任务启动

    apache mesos 播客的第23集是与Bill Farner的谈话 Bill解释了Twitter如何使用Apache Mesos和Apache Aurora在硬件上获得更多收益,并通过在整个基础 ...

最新文章

  1. BigDecimal相除异常
  2. 设计模式学习笔记(1)之单例模式
  3. 小米网关控制空调伴侣_小爱同学怎么控制灯?
  4. Flask开发VIP版HttpServer #华为云·寻找黑马程序员#
  5. 安装和启动mysql
  6. 了解NLP(自然语言处理)技术
  7. 【VSCode PlatformIO】 STC单片机开发头文件制作与添加方法
  8. 自动控制原理_卢京潮_自动控制一般概念及数学模型_学习笔记
  9. 傅立叶变换的实质-正交之美
  10. 设置页面高度为浏览器可视窗口大小
  11. TNMT新交通排行榜
  12. @ComponentScan
  13. 最新千万级中文语音语料开源数据整理分享
  14. 1.pymysql Warning: (1366, Incorrect string value: '\\xD6\\xD0\\xB9\\xFA\\xB1\\xEA...' 解决办法
  15. 高光谱遥感图像处理(14)-----ENVI使用教程之监督分类与非监督分类
  16. 交换机常用命令(1)
  17. 【报告分享】2021年K12在线教育行业分析报告-CTR(附下载)
  18. 如何让JOIN跑得更快?
  19. Kattis - monotony状压dp
  20. CV中的transformer模型创新思路总结

热门文章

  1. 【树形DP】没有上司的晚会 (ssl 1607)
  2. 5、mybatis中的映射器
  3. Dubbo(七)之自动加载环境变量
  4. 汇编语言(二十一)之数值交换与自增
  5. 聊聊并发(四)深入分析ConcurrentHashMap
  6. 推荐算法-关联分析(关联规则)
  7. Java正确获取客户端真实IP方法整理
  8. ssm使用全注解实现增删改查案例——Emp
  9. React前端格式化时间
  10. ubuntu ifconfig_Ubuntu 设置固定 IP 最简单的方法!