Mahoutinaction中文版Word文档下载推荐.docx
《Mahoutinaction中文版Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《Mahoutinaction中文版Word文档下载推荐.docx(34页珍藏版)》请在冰豆网上搜索。
C.资源
1.初识Mahout
本章涵盖以下内容:
ApacheMahout是什么?
现实中推荐系统引擎、聚类、分类概述
配置mahout
读者可能从本书的标题中依然知晓,本书是一本使用的工具书,讲解如何将mahout应用于业界。
Mahout是Apache开源的机器学习库。
它实现的算法都被归入机器学习或者集体智慧的范畴,但是在这里Mahout主要注重协同过滤/推荐引擎、聚类和分类。
Mahout是可伸缩的。
Mahout致力于实现海量数据,单机无法处理情况下的机器学习工具。
在目前阶段,这种可伸缩性由java实现,有些部分基于ApacheHadoop这个分布式计算框架实现。
Mahout是java库。
它不支持用户接口,预装好的服务器。
以及安装等功能。
它是一个利于开发者使用的工具框架。
1.1Mahout适合你吗?
你也许想知道-Mahout是一个什么工程,或者是一本什么书?
如果你在找一本机器学习的教材,那本书就不适合了。
本书没有尝试去全面解释各种算法和展现技术的理论基础和来源。
阅读本书可以,但不保证,能够对机器学习技术,类似矩阵、向量等相关概念的熟悉。
如果你正在开发现代智能应用,那本书很适合。
这本书提供了一种实践非理论的处理方式,有完整的实例、解决方法指南。
这本书在展示Mahout如何展示解决这些问题的时候,证明了一些被有经验的开发者收集的独特见解。
如果你是一个人工智能、机器学习以及相关领域的研究者,也适合用本书。
你最大的挑战就是将一个新算法代码实现,Mahout提供了一个丰富的框架,模式集合以及测试、部署大规模新算法的现成模块。
这本书是一张快车票,让你的机器学习算法运行在复杂的分布式计算框架上。
如果你正在领导一个产品团队或者初创公司想利用机器学习创造竞争优势,这本书也适合你。
通过真实世界的例子,这本书可以启发你很多技术可能有多种实现方式的想法。
它可以帮助你充满斗志的技术团队成员直接跳到很划算的实现能处理大量数据的应用,而在放在以前必须组织大量的技术资源才可以实现。
最后,你可能想知道怎么读“Mahout”-这是一个常用的英式,它与“trout”押韵。
这是一个北印度语的单词,指的是驱使大象的人,为了解释这个词,下面介绍一段关于它的历史。
Mahout项目开始于2008年,作为ApacheLucene的子项目,ApacheLucene项目是大家熟知的开源搜索引擎。
Lucene提供了搜索、文本挖掘和信息检索的高级实现。
在计算机科学领域,这些概念和机器学习技术近似,像聚类、分类。
所以,Lucene贡献者的一部分机器学习相关工作被剥离进入子项目。
不久后,Mahout吸收进“Taste”开源协同过滤的项目。
自2010.4月起,Mahout成为Apache的顶级项目。
Mahout的大量工作不只是传统的实现这些算法,也实现将这些算法,让它们工作在hadoop之上。
Hadoop的吉祥物是一头大象,这也解释了Mahout的工程名字。
图1.Mahout以及相关项目(见附件)
Mahout孵化了相当多的技术和算法,很多都是在开发和实验阶段。
在工程的早期阶段,有3个核心主题:
协同过滤/推荐引擎、聚类和分类。
这并不是Mahout中所有内容,但却是最显著、成熟的主题(在本书写作时),因此,这是本书的范围。
如果你读了以上内容,说明你已经对这3个系列的技术有潜在的兴趣。
但是为以防万一,请继续阅读下面的内容。
1.2推荐系统引擎
推荐引擎是目前我们使用的机器学习技术中最容易识别的。
你可能已经见过相关的服务或网页,基于历史行为推荐书、电影、文档。
他们尝试推论出用户偏好,并标记出用户不知晓的、感兴趣的item:
A可能是最出名的使用推荐系统商务网站。
基于交易和网页活性,Amazon推荐给用户可能感兴趣的书籍和其他item。
请参见图1.2(见附件)
Netflix类似于推荐用户感兴趣的DVDs,并且为研究者提供百万大奖去提升推荐质量。
约会网站像Lí
bí
mseti将一部分用户推荐给其他用户。
社交网络网站像Facebook用推荐技术的变形来为用户识别最可能成为一个尚未建立联系的朋友。
对于Amazon和示例其他网站,通过这种聪明的交叉销售,推荐系统确实有具体的经济价值,同一家公司的报告指出推荐产品给用户能够带来8-12%的销售增长。
1.3聚类
Clusteringturnsupinlessapparentbutequallywell-knowncontexts.(首句该如何翻译,哪位仁兄帮个忙?
)
顾名思义,聚类技术尝试去将大量的拥有相同相似度的事物聚集到不同的类中。
聚类是在海量或者难于理解的数据集里发现层次和顺序,展现兴趣模式,或使得数据集容易被理解。
GoogleNews据为了根据具备逻辑性的故事聚集展示新闻,而不是所有文章的行列表,使用新闻文章的Topic聚集新闻。
图1.3做了说明(见附件)。
搜索引擎像Clusty基于相同的原因聚集搜索结果。
使用聚类技术,基于消费者属性,收入、位置、购买习惯,可将不用用户分到不用的类中。
聚类有助于在海量的、很难弄懂的事物集合中,发现结构,甚至层次。
企业可以使用聚类去发现用户中的隐藏组,更有效的组织海量文档集合,或者根据网站日志发现用户的经常使用模式。
1.4分类
分类技术用于决定一个事物是不是属于一种类型、类目,或者该事物是不是含有某些属性。
同样地,分类无处不在,尽管更多的时候隐于幕后。
这些系统通过评估item的很多实例来学习,以推导出分类规则。
这个平常的想法可以找到很多应用:
Yahoo!
Mail决定接收的信息是不是垃圾邮件,基于先前邮件和用户的垃圾邮件报告,以及邮件的特性。
一些信息被分类为垃圾邮件,如图1.4所示(见附件)。
Picasa(
光学字符识别软件通过将小区域作为独立字符来分类,将扫描文本的若干小区域归类到独立的字符上。
在iTunes中Apple’sGeniusfeature使用分类将歌曲划分到不同的潜在播放列表。
分类有助于判断一个新进入事物是否匹配先前发现的模式,也常用于分类行为或者模式。
分类也可用来检测可疑的网络活动或欺诈。
也可用于根据用户发信息判定表示失望或者满意。
1.5扩展性
当有海量、高质量的数据输入时,这些技术都能够达到最佳效果。
在一些情况下,这些技术不仅要将海量数据作为输入,而且需要很快计算出结果。
很快,这些因素使得可扩展性成为一个很大的问题。
依据一些粗略估计,Picasa在3年前可能已经拥有5亿张照片。
这意味着每天需要分析数百万图片。
分析一张图片并不是一个大问题,尽管需要重复数百万次。
但是,学习阶段需要亿万图片都提供相关信息--上了规模的计算,使用单机是不行的。
依据一个类似的分析,GoogleNews大约每天有350万新文章。
尽管数量并不是很大,考虑到这些文章必须和目前其他文章同时聚类,为了及时响应计算时间需要在几分钟内。
Netflix为Netflix大奖发布的子集中包含1亿的打分。
这只是适合竞赛的数据,据推测,Netflix实际上拥有的和必须用于创建推荐系统的整个数据远远大于这个这个量级。
http:
//archive.ics.uci.edu/ml/machine-learning-databases/netflix/
这些技术非常有必要应用于输入数据量很大的情形--因为很大,所有不适用于单机处理,甚至高配置的机器也不可以。
所以,任何人实现这些技术都不能回避可扩展性问题。
这就是为什么Mahout将可扩展性作为最高优先级,也是为何本书关注可扩展性问题,别人所没有涉猎的一种方式,用于有效处理海量数据。
复杂的机器学习技术,上规模的应用,直到目前为止,只是一些大的、先进的技术公司在考虑。
但是,今天计算能力已经比之前廉价,借助像Hadoop这样的开源框架更方便。
Mahout尝试通过使用hadoop提供优质、开源实现,能够在这个规模上解决问题,解决这类困惑,并且将其送到所有技术组织的手中。
1.5.1MapReduceandHadoop
Mahout的一些部分使用了Apachehadoop工程,hadoop是一个开源的、基于java的MapReduce()实现。
MapReduce是一种分布式计算框架,在Google内部使用。
它是一种编程模式,开始听起来感觉很奇怪,或者太简单了以至于很强大。
MapReduce编程模式适用于输入是key-value键值对集合的问题。
“map”函数将这些键值对转换为中间键值对。
“Reduce”函数通过某种方式将同一个中间键的值合并到一起并产出结果。
实际上,很多问题可以设计成MapReduce问题,或者他们的一个系列。
并且这种模式非常易于并行化实现:
所有的处理过程都是独立的,所以可以划分到不同机器上去。
这里不再详细叙述MapReduce,hadoop提供的教程(http:
//hadoop.apache.org/common/docs/current/mapred_tutorial.html)。
Hadoop实现了MapReduce模式,这是一个不小的壮举,甚至让MapReduce像听起来那么简单。
它管理输入数据、中间键值对、输出数据的存储。
这些数据可能是海量的,需要在多台计算机上运行,而不只是存储在某一台机器的本地。
它管理不同机器之间的划分、数据传输。
它负责检测、恢复单个机器失败的情况。
理解了有很多工作在幕后进行能够帮助你准备使用Hadoop的相对复杂性。
不只是将它作为类库添加到你的工程中,它包含很多模块,每一个模块都有若干类库和独立的服务器进程,可能运行在几台机器上。
基于Hadoop的操作处理不简单,但投入在可扩展的、分布式实现可以让你在之后有很大的收获:
因为你的数据可能成倍的增长,这种可扩展的性质对你的应用来说是一种面向未来的方式。
稍后,本书将试着剪掉一些复杂性让你很快熟悉hadoop,基于这一点,你可以探索操作完整聚类的重点和细节,调整整个框架。
因为这个需要大量计算能力的复杂框架变的越来越流行,所以一点都不奇怪,云计算已经开始提供hadoop相关的支持。
例如Amazon提供的ElasticMapReduce()是一种管理Hadoop集群、提供计算能力、提供友好的接口的服务,可基于hadoop操作、监控大规模复杂任务。
1.6安装Mahout
你需要安装很多工具,在你能“可以在家里玩”我们后面章节提供的一些示例代码之前。
我们假设你已经熟悉Java开发。
Mahout以及和它相关的框架都是基于Java的,因此是平台无关的,你可以在任何一台安装了JVM的机器上使用他。
有时候,我们需要给出许多不同平台的示例和介绍,特别地,命令行模式在windows脚本和FreeBSDtcsh脚本有一些不同。
我们使用命令行和与bash一起的句法,是一种类Unix平台的脚本。
这是默认的在大部分Linux、MacOSX,一些Unix变种和Cygwin(一种windows上的类Unix环境)。
期望使用windows脚本的用户很可能不方便。
尽管如此,本书下面的介绍列表对你来说应该可以很容易的理解。
1.6.1Java和IDE
你如果之前做过任何Java开发的工作,你的个人电脑上已经装上Java了。
注意Mahout需要使用Java6。
如果有所疑虑,打开一个终端并键入java-version。
如果报告不是以“1.6”开头,你仍需要安装Java6。
windows和Linux用户能在找到Java6JVM。
苹果公司为MacOSX10.5和10.6提供Java6JVM。
如果发现Java6没有被应用,在“/Applications/Utilities”打开“javaperferences”。
在这里可以选择Java6作为默认选项。
大部分人能发现在IDE的帮助下,非常好编辑、编译和运行这些示例;
所以强烈推荐你使用IDE。
Eclipse(http:
//www.eclipse.org)是非常常用、免费的一款JavaIDE,安装配置Eclipse不在本书的讲解范围内,你可以花点时间去熟悉它。
NetBeans(http:
//netbeans.org/)也是一款常用开源IDE。
IntelliJIDEA(
例如,IDEA能从现有的Mavan模型中直接创建一个新工程;
在创建新工程的时候,通过指定Mahout源代码的根目录,它将用一种友好的组织方式自动配置、展示整个工程。
例如,丢掉整本书的源代码core/src/...,然后在IDE里面运行,只需要一次点击,依赖和编译的细节都会自动搞定。
这证明了使用IDE比人工编译、运行容易很多。
1.6.2安装Maven
和其他Apache工程一样,Mahout的构建、发布系统基于Maven(http:
//maven.apache.org)。
Maven是一种命令行模式的管理代码,打包发布,生成文档,发布正式版本的工具。
尽管它和Ant工具有一些相同之处,但是不同。
Ant是一种灵活的、低级别的脚本语言,Maven是一种高级别的工具,其目标倾向于发布管理。
因为Mahout使用maven,你应该先安装maven。
MacOSX用户会发现maven是默认安装,如果没有,安装苹果开发工具包。
在命令行键入mvn--version。
如果你能看到版本号,这个版本号最低2.2,那么可以继续进行。
否则,你需要安装mavn的本地拷贝。
linux用户可以使用系统带有的包管理系统可以非常快的获取最近的maven版本。
另外,标准方式是下载二进制版本,将其解压到/usr/local/maven,然后编辑bash配置文件~/.bashrc,添加一行exportPATH=/usr/local/maven/bin:
$PATH。
保证maven命令行一直有效。
如果你使用IDE,像Eclipse或者IntelliJ,他们已经集成了Maven。
参考文档它的文档去了解如何将Maven整合。
这将在IDE中使用Mahout变得简单一些,因为IDE可以根据那个Maven配置文件(pim.xml)配置、导入工程。
1.6.3安装Mahout
Mahout仍在开发过程中,这本书写的时候Mahout是0.4版本。
可以在这里下载发布版本和其他介绍http:
//lucene.apache.org/mahout/releases.html
源文件可以解压到你电脑的任何地方。
因为Mahout的更新很频繁,有规律的进行漏洞修复、功能改进,在实际使用过程中,使用最新发布版本的软件(或者使用svn上的最近的未发布代码)可能对你的帮助更大,详见http:
//lucene.apache.org/mahout/developer-resources.html)。
未来的发行版本应该向后兼容本书的示例。
一旦你从svn或者发布的归档文件中获取了源代码,在IDE中创建一个Mahout的新工程。
这个对不同IDE是过程不同的,需根据如何完成创建的文档细节区别对待。
使用IDE的Maven整合用工程根目录下的pom.xml导入Maven工程是很简单的。
一旦配置完成,你可以很容易的创建一个新的源代码文件夹来管理下面章节提到的样例代码。
随着工程的配置完成,你应该可以透明的编译和运行代码,不需要再做其他工作。
1.6.4安装hadoop
本书后面的一些行为,你需要在本机安装hadoop。
你不需要一个集群去运行hadoop。
配置hadoop不是很麻烦、繁琐。
不重复这个过程,我们直接指导你在hadoop官网行获取hadoop0.20.2版本的副本,http:
//hadoop.apache.org/common/releases.html,然后使用“伪分布式”方式安装hadoop,详见http:
//hadoop.apache.org/common/docs/current/quickstart.html。
1.7总结
Mahout是一个年轻的、开源的、可扩展的,Apache的机器学习库,本书是一本使用Mahout中的机器学习算法解决现实问题的使用指南。
尤其是,你可以很快的探索推荐引擎、聚类、分类。
如果你是一个机器学习领域的研究者,正在寻找一个实用指导、又或者你是这个领域的开发者,想从其他从业者处快速学习实用方法,本书是非常适合你的。
这些技术不仅仅是路论:
我们已经注意到很多知名的推荐引擎、聚类、分类的样例在现实世界中已经在应用:
电子商务、邮件、视频、图片,更涉及大规模的机器学习算法。
这些技术已经用来解决现实问题,甚至为企业产生了价值--这些现在在Mahout中都是可以触及的。
我们已经注意到很多时候这些技术时常伴随着海量的数据--可扩展性是这个领域特别需要持续关注的。
我们首先来看一下MapReduce和hadoop,以及他们如何为Mahout提供可扩展支持。
因为这是一本动手实践的、实用书籍,我们马上开始使用Mahout。
此刻,你应该已经安装好了Mahout需要的工具并且马上开始行动。
因为这本书以实用为主,所以将这些开幕词收起来去见识一下Mahout的代码吧。
继续读下去。
2推荐器的介绍
本章概要:
Mahout中的推荐器
推荐器实战一瞥
推荐引擎精度与质量评估
基于一个真实数据集的测试:
GroupLens
每天我们都会对一些喜欢的、不喜欢的甚至不关心的事物进行一些评价。
这中行为往往是无意识的。
你在收音机上听到一首歌,你可能会因为它的美妙或者难听而注意到它,也可能直接忽略。
这样的情形也会非常普遍的发生在人们对于T恤、沙拉酱、滑雪场、发型、脸型或者电视节目。
尽管人们的口味多种多样,但是它遵从一定的模式。
人们往往会喜欢和他们偏好相似的事物。
比如我爱吃培根生菜番茄三明治,你可以猜到我也喜欢火鸡三明治,因为这两种三明治很相似。
或者说,我们可以认为一个人很可能会喜欢一些相似的东西。
这些模式可以帮助我们预测一个人的好恶,而推荐就是预测人们喜好事物的模式,我们可以利用它来发现一些新的有价值的东西。
上面已经介绍了关于推荐的一些思路,这一章,我们将会用Mahout来体验一下如何去构建一个简单的推荐引擎,然后了解其原理,给你一个直观的感受。
2.1什么是推荐(recommendation)
你购买这本书肯定是有原因的。
或许是因为这本书和你所经常浏览的书挨的很近,于是翻了翻发现很有用,或许你看到和你一样很喜欢机器学习的同事的书架上也摆着这本书,也或许这个同事直接向你推荐过这本书。
虽然原因各不相同,但是最终效果都是你发现了新的东西:
你通过和你兴趣相似的人来发现新的你所感兴趣的东西(如:
来自同事的推荐)。
另一方面,一些和你所喜欢的东西相似的事物,你往往也会喜欢(如:
在书架和你喜欢的书摆放的很近的书)。
事实上,这两种情形就刻画出了推荐引擎的两个基本算法:
”user-based”和”item-based”。
2.1.1协同过滤(Collaborativefiltering),不是基于内容的推荐
严格的说,上述场景是协同过滤的例子——它仅仅基于已知的用户(users)与项目(items)的关系。
这种技术不需要知道项目本身的属性特征,从某种角度讲这是它的一种优势。
而且,这种推荐技术不关心项目本身是什么。
还有一些其他基于项目内容的推荐技术,这些往往被称作“content-based”。
例如,一个朋友向你推荐一本书,这本书是钱钟书写的,这样就可以看做是基于内容的,因为这个推荐的理由是因为这本书的一个属性:
作者。
虽然Mahout对一些基于内容的推荐也提供了一些方法,但是Mahout没有对于这种框架的推荐直接实现。
这些基于内容的推荐技术本身并没有什么错,相反它在一些很专门的领域可以有很好的效果。
而且也可以被当做很有意义的框架去实现。
在构建一个关于书的”Content-Based”的框架时,首先要选定书的哪些特征作为属性,比如:
页数、作者、出版商、颜色、字体等等。
并且你还需要决定这些属性的重要程度如何。
然而这种技术就很难在其他的推荐领域中适用,比如你用它去推荐一个披萨,显然不合适,因为披萨没有“页数”这样的属性。
因为这个原因,Mahout没有过多的去将这种推荐技术。
不过这种类型的推荐Mahout是可以构建的,我们将在下一章看到一个约会网站用到的相关推荐技术。
到此,是时候该用Mahout体验一下协同过滤的威力了!
2.2构建第一个协同过滤引擎
Mahout包括了几种推荐引擎,事实上它开始就是传统的基于用户和基于内容的推荐,当然它也实现了其他几种算法。
不过现在我们要先探索一个基于用户的推荐器。
2.2.1建立输入
开始探索的一个好的方法就是先找一个琐碎的小例子。
数据的输入时推荐的基础。
这些数据会以Mahout语言来表示一种“偏好”程度,因为推荐系统很擅长表示用户与项目之间的关联程度,这种“关联”即是所谓的“偏好”。
在数据中,用户和项目显得尤为重要。
一个偏好(preference)包含一个UserID和一个ItemID,然后再用一个值来代表偏好的程度。
ID在Mahout中用整数表示,而偏好可以使任何数字类型的,值越大表示偏好程度越高。
例如:
我们把偏好程度分为五个档次:
1-5,那么1可以表示非常讨厌,5代表非常喜欢。
新建一个文本用来存储输入数据,我们用1到5的整数来表示有五个用户,101到104来代表四本书,也就是说这些整数分别是用户个书的ID。
每一项采用逗号隔开的方式写入。
下面是一个数据的样例,文件名为intro.csv。
清单2.1输入数据文件intro.csv的内容
通过对文件数据的观察,我们发现user1和5的偏好差不多,他们共同喜欢book101,而对102就差一些,对103更差。
同样的1和4都喜欢101和103,User1和