最近, 我们一直在为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创建在线推荐系统相关推荐

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

    apache mahout 最近, 我们一直在为Yap.TV实施推荐系统:您可以在安装应用程序并转到" Just for you"标签后才能看到它的运行情况. 我们以Apache ...

  2. Apache Mahout:适合所有人的可扩展机器学习框架

    原文链接:http://blog.csdn.net/gdp5211314/article/details/7173505 简介: Apache Mahout 专家 Grant Ingersoll 引领 ...

  3. elastic 修改map_Amazon Elastic Map Reduce使用Apache Mahout计算建议

    elastic 修改map Apache Mahout是一个"可扩展的机器学习库",其中包括各种单节点和分布式推荐算法的实现. 在上一篇博客文章中, 我描述了如何在单个节点上实现在 ...

  4. Amazon Elastic Map Reduce使用Apache Mahout计算建议

    Apache Mahout是一个"可扩展的机器学习库",其中包含各种单节点和分布式推荐算法的实现. 在我的上一篇博客文章中, 我描述了如何在单个节点上实现在线推荐系统来处理数据. ...

  5. Apache Mahout 简介 通过可伸缩、商业友好的机器学习来构建智能应用程序

    在信息时代,公司和个人的成功越来越依赖于迅速有效地将大量数据转化为可操作的信息.无论是每天处理数以千计的个人电子邮件消息,还是从海量博客文章中推测用户的意图,都需要使用一些工具来组织和增强数据. 这其 ...

  6. Apache Mahout 简介

    Apache Mahout 简介 通过可伸缩.商业友好的机器学习来构建智能应用程序 当研究院和企业能获取足够的专项研究预算之后,能从数据和用户输入中学习的智能应用程序将变得更加常见.人们对机器学习技巧 ...

  7. Apache Mahout:构建垃圾邮件过滤器服务器

    Lucene发生了一些相当有趣的事情. 它最初是作为一个库,然后其开发人员开始基于它添加新项目. 他们开发了另一个开源项目,该项目将向Lucene添加爬网功能(以及其他功能). Nutch实际上是任何 ...

  8. 基于 Apache Mahout 构建社会化推荐引擎

    http://www.ibm.com/developerworks/cn/java/j-lo-mahout/ Web 2.0 的一个核心思想就是"群体智慧",即基于大众行为,为每个 ...

  9. Mahout构建图书推荐系统

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

最新文章

  1. 在MAC上搭建eclipse+android开发环境以及eclipse的svn插件的安装
  2. 联想拯救者开机自动修复_设计师群体的创作利器,联想拯救者Y9000X 2021图赏
  3. 架构漫谈 - 数据治理核心思路及解决方案探讨
  4. 代码实现sql编译器_TiDB-Wasm 原理与实现 | Hackathon 优秀项目介绍
  5. 二 ASP.NET AutoPostBack
  6. 软碟通 UltraISO U启替代品 Win32DiskImager 无设备 无盘符 无u盘 无优盘 解决方案 之diskpart
  7. 谷歌宣布将向四川雅安地震灾区捐款500万元
  8. ISIS出现(Project2.sct(7): error: L6236E: No section matches selector - no section to be FIRST/LAST.)异常
  9. ResNet网络模型
  10. 实验室新生成长指南[2.2.1] · 连接器
  11. 获取iOS设备的型号(iPhone4,iphone5,iPhone5s......)
  12. 传统数据处理技术如何与大数据处理技术有机结合
  13. vmd安装包_浅谈VMD(变分模态分解)
  14. C++写的简易的控制台游戏
  15. unity:瞄准镜制作
  16. 学习笔记(一)Mobilenetv1的解读
  17. 苹果CMS海螺模版V4.0修复版
  18. Java如何实现证件照换底色| 背景换色
  19. IE和FireFox关于CSS的兼容性
  20. 三菱plc与计算机无协议通讯,三菱FX系列PLC与计算机无协议通讯.doc

热门文章

  1. java version 和javac版本不一致_解决linux下javac -version和java -version版本显示不一致...
  2. pt939g联通_尝试修改友华PT939G的省份设置,成功!
  3. python调用webservice接口实例_python调用webservice接口的实现
  4. 基于centos8搭建zookeeper集群
  5. Redis学习之缓存穿透、缓存击穿和缓存雪崩详解
  6. java hipster!_通过Java Hipster升级Spring Security OAuth和JUnit测试
  7. c++ 嵌套私有类_嵌套类和私有方法
  8. Java中的复合设计模式
  9. openshift_在WildFly和OpenShift上的WebSocket聊天
  10. jvm虚拟机 基于栈_守护基于JVM的应用程序