首页技术文章正文

初步了解Mahout,浅谈下推荐系统引擎

更新时间:2018-07-18 来源:黑马程序员JavaEE培训学院 浏览量:

Mahout是Apache开源的机器学习库。它实现的算法都被归入机器学习或者集体智慧的范畴,但是在这里Mahout主要注重协同过滤/推荐引擎、聚类和分类。

Mahout是可伸缩的。Mahout致力于实现海量数据,单机无法处理情况下的机器学习工具。在目前阶段,这种可伸缩性由java实现,有些部分基于Apache Hadoop这个分布式计算框架实现。

Mahout是java库。它不支持用户接口,预装好的服务器。以及安装等功能。它是一个利于开发者使用的工具框架。

自2010.4月起,Mahout成为Apache的顶级项目。

Mahout的大量工作不只是传统的实现这些算法,也实现将这些算法,让它们工作在hadoop之上。Hadoop的吉祥物是一头大象,这也解释了Mahout的工程名字。

 Mahout孵化了相当多的技术和算法,很多都是在开发和实验阶段。在工程的早期阶段,有3个核心主题:协同过滤/推荐引擎、聚类和分类。这并不是Mahout中所有内容,但却是最显著、成熟的主题。

推荐系统引擎

推荐引擎是目前我们使用的机器学习技术中最容易识别的。你可能已经见过相关的服务或网页,基于历史行为推荐书、电影、文档。他们尝试推论出用户偏好,并标记出用户不知晓的、感兴趣的item:

Amazon.com可能是最出名的使用推荐系统商务网站。基于交易和网页活性,Amazon推荐给用户可能感兴趣的书籍和其他item。

约会网站像Líbímseti将一部分用户推荐给其他用户。

社交网络网站像Facebook用推荐技术的变形来为用户识别最可能成为一个尚未建立联系的朋友。

对于Amazon和示例其他网站,通过这种聪明的交叉销售,推荐系统确实有具体的经济价值,同一家公司的报告指出推荐产品给用户能够带来8-12%的销售增长。

聚类

聚类技术尝试去将大量的拥有相同相似度的事物聚集到不同的类中。聚类是在海量或者难于理解的数据集里发现层次和顺序,展现兴趣模式,或使得数据集容易被理解。

Google News据为了根据具备逻辑性的故事聚集展示新闻,而不是所有文章的行列表,使用新闻文章的Topic聚集新闻。图1.3做了说明(见附件)。

搜索引擎像Clusty基于相同的原因聚集搜索结果。

使用聚类技术,基于消费者属性,收入、位置、购买习惯,可将不用用户分到不用的类中。

聚类有助于在海量的、很难弄懂的事物集合中,发现结构,甚至层次。企业可以使用聚类去发现用户中的隐藏组,更有效的组织海量文档集合,或者根据网站日志发现用户的经常使用模式。

分类

分类技术用于决定一个事物是不是属于一种类型、类目,或者该事物是不是含有某些属性。同样地,分类无处不在,尽管更多的时候隐于幕后。

这些系统通过评估item的很多实例来学习,以推导出分类规则。这个平常的想法可以找到很多应用:

Yahoo! Mail决定接收的信息是不是垃圾邮件,基于先前邮件和用户的垃圾邮件报告,以及邮件的特性。一些信息被分类为垃圾邮件。
Picasa (http://picasa.google.com/)和其他的照片管理应用可以判断一张照片中是否含有人脸。

光学字符识别软件通过将小区域作为独立字符来分类,将扫描文本的若干小区域归类到独立的字符上。

在iTunes中Apple’s Genius feature使用分类将歌曲划分到不同的潜在播放列表。

分类有助于判断一个新进入事物是否匹配先前发现的模式, 也常用于分类行为或者模式。分类也可用来检测可疑的网络活动或欺诈。也可用于根据用户发信息判定表示失望或者满意。

扩展性

当有海量、高质量的数据输入时,这些技术都能够达到最佳效果。在一些情况下,这些技术不仅要将海量数据作为输入,而且需要很快计算出结果。很快,这些因素使得可扩展性成为一个很大的问题。

依据一些粗略估计,Picasa在3年前可能已经拥有5亿张照片。这意味着每天需要分析数百万图片。分析一张图片并不是一个大问题,尽管需要重复数百万次。但是,学习阶段需要亿万图片都提供相关信息 -- 上了规模的计算,使用单机是不行的。

依据一个类似的分析,Google News大约每天有350万新文章。尽管数量并不是很大,考虑到这些文章必须和目前其他文章同时聚类,为了及时响应计算时间需要在几分钟内。

Netflix为Netflix大奖发布的子集中包含1亿的打分。这只是适合竞赛的数据,据推测,Netflix实际上拥有的和必须用于创建推荐系统的整个数据远远大于这个这个量级。

这些技术非常有必要应用于输入数据量很大的情形--因为很大,所有不适用于单机处理,甚至高配置的机器也不可以。所以,任何人实现这些技术都不能回 避可扩展性问题。这就是为什么Mahout将可扩展性作为最高优先级,关注可扩展性问题,别人所没有涉猎的一种方式,用于有效处理海量数据。

复杂的机器学习技术,上规模的应用,直到目前为止,只是一些大的、先进的技术公司在考虑。但是,今天计算能力已经比之前廉价,借助像Hadoop这 样的开源框架更方便。Mahout尝试通过使用hadoop提供优质、开源实现,能够在这个规模上解决问题,解决这类困惑,并且将其送到所有技术组织的手中。

              

MapReduce and Hadoop

Mahout的一些部分使用了Apache hadoop工程,hadoop是一个开源的、基于java的MapReduce(http://labs.google.com/papers/mapreduce.html )实现。MapReduce是一种分布式计算框架,在Google内部使用。它是一种编程模式,开始听起来感觉很奇怪,或者太简单了以至于很强大。 MapReduce编程模式适用于输入是key-value键值对集合的问题。“map”函数将这些键值对转换为中间键值对。“Reduce”函数通过某 种方式将同一个中间键的值合并到一起并产出结果。实际上,很多问题可以设计成MapReduce问题,或者他们的一个系列。并且这种模式非常易于并行化实 现:所有的处理过程都是独立的,所以可以划分到不同机器上去。

Hadoop实现了MapReduce模式,这是一个不小的壮举,甚至让MapReduce像听起来那么简单。它管理输入数据、中间键值对、输 出数据的存储。这些数据可能是海量的,需要在多台计算机上运行,而不只是存储在某一台机器的本地。它管理不同机器之间的划分、数据传输。它负责检测、恢复 单个机器失败的情况。理解了有很多工作在幕后进行能够帮助你准备使用Hadoop的相对复杂性。不只是将它作为类库添加到你的工程中,它包含很多模块,每 一个模块都有若干类库和独立的服务器进程,可能运行在几台机器上。基于Hadoop的操作处理不简单,但投入在可扩展的、分布式实现可以让你在之后有很大 的收获:因为你的数据可能成倍的增长,这种可扩展的性质对你的应用来说是一种面向未来的方式。

你可以探索操作完整聚类的重点和细节,调整整个框架。因为这个需要大量 计算能力的复杂框架变的越来越流行,所以一点都不奇怪,云计算已经开始提供hadoop相关的支持。

本文版权归黑马程序员JavaEE学院所有,欢迎转载,转载请注明作者出处。谢谢!

作者:黑马程序员JavaEE培训学院

首发:http://java.itheima.com/

分享到:
在线咨询 我要报名
和我们在线交谈!