Mahout In Action-第一章:初識Mahout
1. 初識Mahout
本章涵蓋以下內容:
- Apache Mahout是什么?
- 現實中推薦系統引擎、聚類、分類概述
- 配置mahout
讀者可能從本書的標題中猜測到,本書是一本講解如何將mahout應用于業界的工具書。他有三個特性:
一是Mahout是Apache開源的機器學習庫。它實現的算法都被歸入機器學習或者集體智慧的范疇,但是在這里Mahout主要注重協同過濾/推薦引擎、聚類和分類。
再者,Mahout是可伸縮的。Mahout致力于實現海量數據,單機無法處理情況下的機器學習工具。在目前階段,這種可伸縮性由java實現,有些部分基于Apache Hadoop這個分布式計算框架實現。
最后,Mahout是java庫。它不支持用戶接口,預裝好的服務器。以及安裝等功能。它是一個利于開發者使用的工具框架。
1.1 Mahout的歷史
你可能想知道怎么讀“Mahout” – 這是一個常用的英式,它與“trout”押韻。這是一個北印度語的單詞,指的是驅使大象的人,為了解釋這個詞,下面介紹一段關于它的歷史。
Mahout項 目開始于2008年,作為Apache Lucene的子項目,Apache Lucene項目是大家熟知的開源搜索引擎。Lucene提供了搜索、文本挖掘和信息檢索的高級實現。在計算機科學領域,這些概念和機器學習技術近似,像 聚類、分類。所以,Lucene貢獻者的一部分機器學習相關工作被剝離進入子項目。不久后,Mahout吸收進“Taste”開源協同過濾的項目。
自2010.4月起,Mahout成為Apache的頂級項目。
Mahout的大量工作不只是傳統的實現這些算法,也實現將這些算法,讓它們工作在hadoop之上。Hadoop的吉祥物是一頭大象,這也解釋了Mahout的工程名字。
圖1. Mahout以及相關項目
Mahout孵化了相當多的技術和算法,很多都是在開發和實驗階段。在工程的早期階段,有3個核心主題:協同過濾/推薦引擎、聚類和分類。這并不是Mahout中所有內容,但卻是最顯著、成熟的主題(在本書寫作時),因此,這是本書的范圍。
如果你讀了以上內容,說明你已經對這3個系列的技術有潛在的興趣。但是為以防萬一,請繼續閱讀下面的內容。
Tips:
如果你在找一本機器學習的教材,那本書就不適合了。本書沒有嘗試去全面解釋各種算法和展現技術的理論基礎和來源。閱讀本書可以,但不保證,能夠對機器學習技術,類似矩陣、向量等相關概念的熟悉。
如果你正在開發現代智能應用,那本書很適合。這本書提供了一種實踐非理論的處理方式,有完整的實例、解決方法指南。這本書在展示Mahout如何展示解決這些問題的時候,證明了一些被有經驗的開發者收集的獨特見解。
如果你是一個人工智能、機器學習以及相關領域的研究者,也適合用本書。你最大的挑戰就是將一個新算法代碼實現,Mahout提供了一個豐富的框架,模式集合以及測試、部署大規模新算法的現成模塊。這本書是一張快車票,讓你的機器學習算法運行在復雜的分布式計算框架上。
如果你正在領導一個產品團隊或者初創公司想利用機器學習創造競爭優勢,這本書也適合你。通過真實世界的例子,這本書可以啟發你很多技術可能有多種實 現方式的想法。它可以幫助你充滿斗志的技術團隊成員直接跳到很劃算的實現能處理大量數據的應用,而在放在以前必須組織大量的技術資源才可以實現。
1.2 Mahout 機器學習主題
雖然理論上Mahout可以實現所有的機器學習技術,但是在生產環境中我們主要還是用在三個角色上面:協同過濾/推薦引擎、聚類和分類。
推薦引擎是目前我們使用的機器學習技術中最容易識別的。你可能已經見過相關的服務或網頁,基于歷史行為推薦書、電影、文檔。他們嘗試推論出用戶偏好,并標記出用戶不知曉的、感興趣的item:
- Amazon.com可能是最出名的使用推薦系統商務網站。基于交易和網頁活性,Amazon推薦給用戶可能感興趣的書籍和其他item。請參見圖1.2(見附件)
- Netflix類似于推薦用戶感興趣的DVDs,并且為研究者提供百萬大獎去提升推薦質量。
- 約會網站像Líbímseti將一部分用戶推薦給其他用戶。
- 社交網絡網站像非死book用推薦技術的變形來為用戶識別最可能成為一個尚未建立聯系的朋友。
對于Amazon和示例其他網站,通過這種聰明的交叉銷售,推薦系統確實有具體的經濟價值,同一家公司的報告指出推薦產品給用戶能夠帶來8-12%的銷售增長。
http://www.practicalecommerce.com/articles/1942-10-Questions-on-Product-Recommendations
1.2.2
1.2.2聚類
聚類的使用略少,但是不輸其他的用途。顧名思義,聚類技術嘗試去將大量的擁有相同相似度的事物聚集到不同的類中。聚類是在海量或者難于理解的數據集里發現層次和順序,展現興趣模式,或使得數據集容易被理解。
- Google News根據具備邏輯性的故事聚集展示新聞,而不是所有文章的行列表,使用新聞文章的Topic聚集新聞。圖1.3做了說明(見附件)。
- 搜索引擎Clusty基于相同的原因聚集搜索結果。
- 使用聚類技術,基于消費者屬性,收入、位置、購買習慣,可將不用用戶分到不用的類中。
1.2.3 分類
分類技術用于決定一個事物是不是屬于一種類型、類目,或者該事物是不是含有某些屬性。同樣地,分類無處不在,盡管更多的時候隱于幕后。
這些系統通過評估item的很多實例來學習,以推導出分類規則。這個平常的想法可以找到很多應用:
- Yahoo! Mail決定接收的信息是不是垃圾郵件,基于先前郵件和用戶的垃圾郵件報告,以及郵件的特性。一些信息被分類為垃圾郵件,如圖1.4所示(見附件)。
- Picasa (http://picasa.google.com/)和其他的照片管理應用可以判斷一張照片中是否含有人臉。
- 光學字符識別軟件通過將小區域作為獨立字符來分類,將掃描文本的若干小區域歸類到獨立的字符上。
- 在iTunes中Apple’s Genius feature使用分類將歌曲劃分到不同的潛在播放列表。
分類有助于判斷一個新進入事物是否匹配先前發現的模式, 也常用于分類行為或者模式。分類也可用來檢測可疑的網絡活動或欺詐。也可用于根據用戶發信息判定表示失望或者滿意。
1.5 擴展性
當有海量、高質量的數據輸入時,這些技術都能夠達到最佳效果。在一些情況下,這些技術不僅要將海量數據作為輸入,而且需要很快計算出結果。很快,這些因素使得可擴展性成為一個很大的問題。
依據一些粗略估計,Picasa在3年前可能已經擁有5億張照片。這意味著每天需要分析數百萬圖片。分析一張圖片并不是一個大問題,盡管需要重復數百萬次。但是,學習階段需要億萬圖片都提供相關信息 — 上了規模的計算,使用單機是不行的。
http://blogoscoped.com/archive/2007-03-12-n67.html
依據一個類似的分析,Google News大約每天有350萬新文章。盡管數量并不是很大,考慮到這些文章必須和目前其他文章同時聚類,為了及時響應計算時間需要在幾分鐘內。
Netflix為Netflix大獎發布的子集中包含1億的打分。這只是適合競賽的數據,據推測,Netflix實際上擁有的和必須用于創建推薦系統的整個數據遠遠大于這個這個量級。
http://archive.ics.uci.edu/ml/machine-learning-databases/netflix/
這些技術非常有必要應用于輸入數據量很大的情形–因為很大,所有不適用于單機處理,甚至高配置的機器也不可以。所以,任何人實現這些技術都不能回避 可擴展性問題。這就是為什么Mahout將可擴展性作為最高優先級,也是為何本書關注可擴展性問題,別人所沒有涉獵的一種方式,用于有效處理海量數據。
復雜的機器學習技術,上規模的應用,直到目前為止,只是一些大的、先進的技術公司在考慮。但是,今天計算能力已經比之前廉價,借助像Hadoop這 樣的開源框架更方便。Mahout嘗試通過使用hadoop提供優質、開源實現,能夠在這個規模上解決問題,解決這類困惑,并且將其送到所有技術組織的手 中。
1.5.1 MapReduce and Hadoop
Mahout的一些部分使用了Apache hadoop工程,hadoop是一個開源的、基于java的MapReduce(http://labs.google.com/papers/mapreduce.html ) 實現。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提供的Elastic MapReduce(http://aws.amazon.com/elasticmapreduce/ )是一種管理Hadoop集群、提供計算能力、提供友好的接口的服務,可基于hadoop操作、監控大規模復雜任務。
1.6 安裝Mahout
你需要安裝很多工具,在你能“可以在家里玩”我們后面章節提供的一些示例代碼之前。我們假設你已經熟悉Java開發。
Mahout以及和它相關的框架都是基于Java的,因此是平臺無關的,你可以在任何一臺安裝了JVM的機器上使用他。有時候,我們需要給出許 多不同平臺的示例和介紹,特別地,命令行模式在windows腳本和FreeBSD tcsh腳本有一些不同。我們使用命令行和與bash一起的句法,是一種類Unix平臺的腳本。這是默認的在大部分Linux、 Mac OS X, 一些Unix變種和Cygwin(一種windows上的類Unix環境)。期望使用windows腳本的用戶很可能不方便。盡管如此,本書下面的介紹列 表對你來說應該可以很容易的理解。
1.6.1 Java和IDE
你如果之前做過任何Java開發的工作,你的個人電腦上已經裝上Java了。注意Mahout需要使用Java6。如果有所疑慮,打開一個終端并鍵入java -version。如果報告不是以“1.6”開頭,你仍需要安裝Java6。
windows和Linux用戶能在 http://java.sun.com 找 到Java 6 JVM。蘋果公司為Mac OS X 10.5 和 10.6提供Java 6 JVM。如果發現Java 6沒有被應用,在“/Applications/Utilities”打開“java perferences”。在這里可以選擇Java 6作為默認選項。
大部分人能發現在IDE的幫助下,非常好編輯、編譯和運行這些示例;所以強烈推薦你使用IDE。Eclipse(http://www.eclipse.org)是非常常用、免費的一款Java IDE,安裝配置Eclipse不在本書的講解范圍內,你可以花點時間去熟悉它。NetBeans (http://netbeans.org/) 也是一款常用開源IDE。 IntelliJ IDEA (http://www.jetbrains.com/idea/index.html)是一款強大的、流行的IDE,它有一個免費的社區版本。
例如,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。Mac OS X用戶會發現maven是默認安裝,如果沒有,安裝蘋果開發工具包。在命令行鍵入mvn –version。如果你能看到版本號,這個版本號最低2.2,那么可以繼續進行。否則,你需要安裝mavn的本地拷貝。
linux用戶可以使用系統帶有的包管理系統可以非常快的獲取最近的maven版本。另外,標準方式是下載二進制版本,將其解壓到/usr /local/maven,然后編輯bash配置文件~/.bashrc,添加一行export PATH=/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官網行獲取hadoop 0.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的代碼吧。繼續讀下去。
來自: http://blog.csdn.net//mrcharles/article/details/50437616