Apache Mahout 简介
Apache Mahout 簡(jiǎn)介
通過(guò)可伸縮、商業(yè)友好的機(jī)器學(xué)習(xí)來(lái)構(gòu)建智能應(yīng)用程序
當(dāng)研究院和企業(yè)能獲取足夠的專項(xiàng)研究預(yù)算之后,能從數(shù)據(jù)和用戶輸入中學(xué)習(xí)的智能應(yīng)用程序?qū)⒆兊酶映R?jiàn)。人們對(duì)機(jī)器學(xué)習(xí)技巧(比如說(shuō)集群、協(xié)作篩選和分類)的需求前所未有地增長(zhǎng),無(wú)論是查找一大群人的共性還是自動(dòng)標(biāo)記海量 Web 內(nèi)容。Apache Mahout 項(xiàng)目旨在幫助開(kāi)發(fā)人員更加方便快捷地創(chuàng)建智能應(yīng)用程序。Mahout 的創(chuàng)始者 Grant Ingersoll 介紹了機(jī)器學(xué)習(xí)的基本概念,并演示了如何使用 Mahout 來(lái)實(shí)現(xiàn)文檔集群、提出建議和組織內(nèi)容。
4評(píng)論:
2009 年 10 月 12 日
- 內(nèi)容
在 IBM Bluemix 云平臺(tái)上開(kāi)發(fā)并部署您的下一個(gè)應(yīng)用。
在信息時(shí)代,公司和個(gè)人的成功越來(lái)越依賴于迅速有效地將大量數(shù)據(jù)轉(zhuǎn)化為可操作的信息。無(wú)論是每天處理數(shù)以千計(jì)的個(gè)人電子郵件消息,還是從海量博客文章中推測(cè)用戶的意圖,都需要使用一些工具來(lái)組織和增強(qiáng)數(shù)據(jù)。這其中就蘊(yùn)含著機(jī)器學(xué)習(xí)領(lǐng)域以及本文章所介紹項(xiàng)目的前景:Apache Mahout(見(jiàn) 參考資料)。
機(jī)器學(xué)習(xí)是人工智能的一個(gè)分支,它涉及通過(guò)一些技術(shù)來(lái)允許計(jì)算機(jī)根據(jù)之前的經(jīng)驗(yàn)改善其輸出。此領(lǐng)域與數(shù)據(jù)挖掘密切相關(guān),并且經(jīng)常需要使用各種技巧,包括統(tǒng)計(jì)學(xué)、概率論和模式識(shí)別等。雖然機(jī)器學(xué)習(xí)并不是一個(gè)新興領(lǐng)域,但它的發(fā)展速度是毋庸置疑的。許多大型公司,包括 IBM?、Google、Amazon、Yahoo! 和 Facebook,都在自己的應(yīng)用程序中實(shí)現(xiàn)了機(jī)器學(xué)習(xí)算法。此外,還有許多公司在自己的應(yīng)用程序中應(yīng)用了機(jī)器學(xué)習(xí),以便學(xué)習(xí)用戶以及過(guò)去的經(jīng)驗(yàn),從而獲得收益。
在簡(jiǎn)要概述機(jī)器學(xué)習(xí)的概念之后,我將介紹 Apache Mahout 項(xiàng)目的特性、歷史和目標(biāo)。然后,我將演示如何使用 Mahout 完成一些有趣的機(jī)器學(xué)習(xí)任務(wù),這需要使用免費(fèi)的 Wikipedia 數(shù)據(jù)集。
機(jī)器學(xué)習(xí) 101
機(jī)器學(xué)習(xí)可以應(yīng)用于各種目的,從游戲、欺詐檢測(cè)到股票市場(chǎng)分析。它用于構(gòu)建類似于 Netflix 和 Amazon 所提供的系統(tǒng),可根據(jù)用戶的購(gòu)買歷史向他們推薦產(chǎn)品,或者用于構(gòu)建可查找特定時(shí)間內(nèi)的所有相似文章的系統(tǒng)。它還可以用于根據(jù)類別(體育、經(jīng)濟(jì)和戰(zhàn)爭(zhēng)等)對(duì)網(wǎng)頁(yè)自動(dòng)進(jìn)行分類,或者用于標(biāo)記垃圾電子郵件。本文無(wú)法完全列出機(jī)器學(xué)習(xí)的所有應(yīng)用。如果您希望更加深入地探究該領(lǐng)域,我建議您參閱參考資料。
可以采用一些機(jī)器學(xué)習(xí)方法來(lái)解決問(wèn)題。我將重點(diǎn)討論其中最常用的兩個(gè) —監(jiān)管和 無(wú)監(jiān)管學(xué)習(xí) —因?yàn)樗鼈兪?Mahout 支持的主要功能。
監(jiān)管學(xué)習(xí)的任務(wù)是學(xué)習(xí)帶標(biāo)簽的訓(xùn)練數(shù)據(jù)的功能,以便預(yù)測(cè)任何有效輸入的值。監(jiān)管學(xué)習(xí)的常見(jiàn)例子包括將電子郵件消息分類為垃圾郵件,根據(jù)類別標(biāo)記網(wǎng)頁(yè),以及識(shí)別手寫輸入。創(chuàng)建監(jiān)管學(xué)習(xí)程序需要使用許多算法,最常見(jiàn)的包括神經(jīng)網(wǎng)絡(luò)、Support Vector Machines (SVMs) 和 Naive Bayes 分類程序。
無(wú)監(jiān)管學(xué)習(xí)的任務(wù)是發(fā)揮數(shù)據(jù)的意義,而不管數(shù)據(jù)的正確與否。它最常應(yīng)用于將類似的輸入集成到邏輯分組中。它還可以用于減少數(shù)據(jù)集中的維度數(shù)據(jù),以便只專注于最有用的屬性,或者用于探明趨勢(shì)。無(wú)監(jiān)管學(xué)習(xí)的常見(jiàn)方法包括 k-Means、分層集群和自組織地圖。
在本文中,我將重點(diǎn)討論 Mahout 當(dāng)前已實(shí)現(xiàn)的三個(gè)具體的機(jī)器學(xué)習(xí)任務(wù)。它們正好也是實(shí)際應(yīng)用程序中相當(dāng)常見(jiàn)的三個(gè)領(lǐng)域:
- 協(xié)作篩選
- 集群
- 分類
在研究它們?cè)?Mahout 中的實(shí)現(xiàn)之前,我將從概念的層面上更加深入地討論這些任務(wù)。
協(xié)作篩選
協(xié)作篩選(CF) 是 Amazon 等公司極為推崇的一項(xiàng)技巧,它使用評(píng)分、單擊和購(gòu)買等用戶信息為其他站點(diǎn)用戶提供推薦產(chǎn)品。CF 通常用于推薦各種消費(fèi)品,比如說(shuō)書(shū)籍、音樂(lè)和電影。但是,它還在其他應(yīng)用程序中得到了應(yīng)用,主要用于幫助多個(gè)操作人員通過(guò)協(xié)作來(lái)縮小數(shù)據(jù)范圍。您可能已經(jīng)在 Amazon 體驗(yàn)了 CF 的應(yīng)用,如圖 1所示:
圖 1. Amazon 上的協(xié)作篩選示例
CF 應(yīng)用程序根據(jù)用戶和項(xiàng)目歷史向系統(tǒng)的當(dāng)前用戶提供推薦。生成推薦的 4 種典型方法如下:
- 基于用戶:通過(guò)查找相似的用戶來(lái)推薦項(xiàng)目。由于用戶的動(dòng)態(tài)特性,這通常難以定量。
- 基于項(xiàng)目:計(jì)算項(xiàng)目之間的相似度并做出推薦。項(xiàng)目通常不會(huì)過(guò)多更改,因此這通常可以離線完成。
- Slope-One:非常快速簡(jiǎn)單的基于項(xiàng)目的推薦方法,需要使用用戶的評(píng)分信息(而不僅僅是布爾型的首選項(xiàng))。
- 基于模型:通過(guò)開(kāi)發(fā)一個(gè)用戶及評(píng)分模型來(lái)提供推薦。
所有 CF 方法最終都需要計(jì)算用戶及其評(píng)分項(xiàng)目之間的相似度。可以通過(guò)許多方法來(lái)計(jì)算相似度,并且大多數(shù) CF 系統(tǒng)都允許您插入不同的指標(biāo),以便確定最佳結(jié)果。
集群
對(duì)于大型數(shù)據(jù)集來(lái)說(shuō),無(wú)論它們是文本還是數(shù)值,一般都可以將類似的項(xiàng)目自動(dòng)組織,或 集群,到一起。舉例來(lái)說(shuō),對(duì)于全美國(guó)某天內(nèi)的所有的報(bào)紙新聞,您可能希望將所有主題相同的文章自動(dòng)歸類到一起;然后,可以選擇專注于特定的集群和主題,而不需要閱讀大量無(wú)關(guān)內(nèi)容。另一個(gè)例子是:某臺(tái)機(jī)器上的傳感器會(huì)持續(xù)輸出內(nèi)容,您可能希望對(duì)輸出進(jìn)行分類,以便于分辨正常和有問(wèn)題的操作,因?yàn)槠胀ú僮骱彤惓2僮鲿?huì)歸類到不同的集群中。
與 CF 類似,集群計(jì)算集合中各項(xiàng)目之間的相似度,但它的任務(wù)只是對(duì)相似的項(xiàng)目進(jìn)行分組。在許多集群實(shí)現(xiàn)中,集合中的項(xiàng)目都是作為矢量表示在 n維度空間中的。通過(guò)矢量,開(kāi)發(fā)人員可以使用各種指標(biāo)(比如說(shuō)曼哈頓距離、歐氏距離或余弦相似性)來(lái)計(jì)算兩個(gè)項(xiàng)目之間的距離。然后,通過(guò)將距離相近的項(xiàng)目歸類到一起,可以計(jì)算出實(shí)際集群。
可以通過(guò)許多方法來(lái)計(jì)算集群,每種方法都有自己的利弊。一些方法從較小的集群逐漸構(gòu)建成較大的集群,還有一些方法將單個(gè)大集群分解為越來(lái)越小的集群。在發(fā)展成平凡集群表示之前(所有項(xiàng)目都在一個(gè)集群中,或者所有項(xiàng)目都在各自的集群中),這兩種方法都會(huì)通過(guò)特定的標(biāo)準(zhǔn)退出處理。流行的方法包括 k-Means 和分層集群。如下所示,Mahout 也隨帶了一些不同的集群方法。
分類
分類(通常也稱為 歸類)的目標(biāo)是標(biāo)記不可見(jiàn)的文檔,從而將它們歸類不同的分組中。機(jī)器學(xué)習(xí)中的許多分類方法都需要計(jì)算各種統(tǒng)計(jì)數(shù)據(jù)(通過(guò)指定標(biāo)簽與文檔的特性相關(guān)),從而創(chuàng)建一個(gè)模型以便以后用于分類不可見(jiàn)的文檔。舉例來(lái)說(shuō),一種簡(jiǎn)單的分類方法可以跟蹤與標(biāo)簽相關(guān)的詞,以及這些詞在某個(gè)標(biāo)簽中的出現(xiàn)次數(shù)。然后,在對(duì)新文檔進(jìn)行分類時(shí),系統(tǒng)將在模型中查找文檔中的詞并計(jì)算概率,然后輸出最佳結(jié)果并通過(guò)一個(gè)分類來(lái)證明結(jié)果的正確性。
分類功能的特性可以包括詞匯、詞匯權(quán)重(比如說(shuō)根據(jù)頻率)和語(yǔ)音部件等。當(dāng)然,這些特性確實(shí)有助于將文檔關(guān)聯(lián)到某個(gè)標(biāo)簽并將它整合到算法中。
機(jī)器學(xué)習(xí)這個(gè)領(lǐng)域相當(dāng)廣泛和活躍。理論再多終究需要實(shí)踐。接下來(lái),我將繼續(xù)討論 Mahout 及其用法。
回頁(yè)首
Mahout 簡(jiǎn)介
Apache Mahout 是 Apache Software Foundation (ASF) 開(kāi)發(fā)的一個(gè)全新的開(kāi)源項(xiàng)目,其主要目標(biāo)是創(chuàng)建一些可伸縮的機(jī)器學(xué)習(xí)算法,供開(kāi)發(fā)人員在 Apache 在許可下免費(fèi)使用。該項(xiàng)目已經(jīng)發(fā)展到了它的最二個(gè)年頭,目前只有一個(gè)公共發(fā)行版。Mahout 包含許多實(shí)現(xiàn),包括集群、分類、CP 和進(jìn)化程序。此外,通過(guò)使用 Apache Hadoop 庫(kù),Mahout 可以有效地?cái)U(kuò)展到云中(見(jiàn)參考資料)。
Mahout 的歷史
背景知識(shí)
mahout的意思是大象的飼養(yǎng)者及驅(qū)趕者。Mahout 這個(gè)名稱來(lái)源于該項(xiàng)目(有時(shí))使用 Apache Hadoop —其徽標(biāo)上有一頭黃色的大象 —來(lái)實(shí)現(xiàn)可伸縮性和容錯(cuò)性。
Mahout 項(xiàng)目是由 Apache Lucene(開(kāi)源搜索)社區(qū)中對(duì)機(jī)器學(xué)習(xí)感興趣的一些成員發(fā)起的,他們希望建立一個(gè)可靠、文檔翔實(shí)、可伸縮的項(xiàng)目,在其中實(shí)現(xiàn)一些常見(jiàn)的用于集群和分類的機(jī)器學(xué)習(xí)算法。該社區(qū)最初基于 Ng et al. 的文章 “Map-Reduce for Machine Learning on Multicore”(見(jiàn)參考資料),但此后在發(fā)展中又并入了更多廣泛的機(jī)器學(xué)習(xí)方法。Mahout 的目標(biāo)還包括:
- 建立一個(gè)用戶和貢獻(xiàn)者社區(qū),使代碼不必依賴于特定貢獻(xiàn)者的參與或任何特定公司和大學(xué)的資金。
- 專注于實(shí)際用例,這與高新技術(shù)研究及未經(jīng)驗(yàn)證的技巧相反。
- 提供高質(zhì)量文章和示例。
特性
雖然在開(kāi)源領(lǐng)域中相對(duì)較為年輕,但 Mahout 已經(jīng)提供了大量功能,特別是在集群和 CF 方面。Mahout 的主要特性包括:
Map-Reduce 簡(jiǎn)介
Map-Reduce 是 Google 開(kāi)發(fā)的一種分布式編程 API,并在 Apache Hadoop 項(xiàng)目中得到了實(shí)現(xiàn)。與分布式文件系統(tǒng)相結(jié)合,它可以為程序員提供一個(gè)定義良好的用于描述計(jì)算任務(wù)的 API,從而幫助他們簡(jiǎn)化并行化問(wèn)題的任務(wù)。(有關(guān)更多信息,請(qǐng)參見(jiàn)參考資料)。
- Taste CF。Taste 是 Sean Owen 在 SourceForge 上發(fā)起的一個(gè)針對(duì) CF 的開(kāi)源項(xiàng)目,并在 2008 年被贈(zèng)予 Mahout。
- 一些支持 Map-Reduce 的集群實(shí)現(xiàn)包括 k-Means、模糊 k-Means、Canopy、Dirichlet 和 Mean-Shift。
- Distributed Naive Bayes 和 Complementary Naive Bayes 分類實(shí)現(xiàn)。
- 針對(duì)進(jìn)化編程的分布式適用性功能。
- Matrix 和矢量庫(kù)。
- 上述算法的示例。
Mahout 入門
Mahout 的入門相對(duì)比較簡(jiǎn)單。首先,您需要安裝以下軟件:
- JDK 1.6 或更高版本
- Ant 1.7 或更高版本
- 如果要編譯 Mahout 源代碼,還需要安裝 Maven 2.0.9 或 2.0.10
您還需要本文的示例代碼(見(jiàn) 下載部分),其中包括一個(gè) Mahout 副本及其依賴關(guān)系。依照以下步驟安裝示例代碼:
步驟 3 將下載必要的 Wikipedia 文件將編譯代碼。所使用的 Wikipedia 文件大約為 2.5 GB,因此下載時(shí)間將由您的寬帶決定。
回頁(yè)首
建立一個(gè)推薦引擎
Mahout 目前提供了一些工具,可用于通過(guò) Taste 庫(kù)建立一個(gè)推薦引擎 —針對(duì) CF 的快速且靈活的引擎。Taste 支持基于用戶和基于項(xiàng)目的推薦,并且提供了許多推薦選項(xiàng),以及用于自定義的界面。Taste 包含 5 個(gè)主要組件,用于操作用戶、項(xiàng)目和 首選項(xiàng):
- DataModel:用于存儲(chǔ) 用戶、項(xiàng)目和 首選項(xiàng)
- UserSimilarity:用于定義兩個(gè)用戶之間的相似度的界面
- ItemSimilarity:用于定義兩個(gè)項(xiàng)目之間的相似度的界面
- Recommender:用于提供推薦的界面
- UserNeighborhood:用于計(jì)算相似用戶鄰近度的界面,其結(jié)果隨時(shí)可由 Recommender使用
借助這些組件以及它們的實(shí)現(xiàn),開(kāi)發(fā)人員可以構(gòu)建復(fù)雜的推薦系統(tǒng),提供基于實(shí)時(shí)或者離線的推薦。基于實(shí)時(shí)的推薦經(jīng)常只能處理數(shù)千用戶,而離線推薦具有更好的適用性。Taste 甚至提供了一些可利用 Hadoop 離線計(jì)算推薦的工具。在許多情況中,這種合適的方法可以幫助您滿足包含大量用戶、項(xiàng)目和首選項(xiàng)的大型系統(tǒng)的需求。
為了演示如何構(gòu)建一個(gè)簡(jiǎn)單的推薦系統(tǒng),我需要一些用戶、項(xiàng)目和評(píng)分。為此,我們會(huì)使用 cf.wikipedia.GenerateRatings中的代碼(包含在示例代碼的源代碼中)為 Wikipedia 文檔(Taste 稱之為項(xiàng)目)隨機(jī)生成大量 用戶和 首選項(xiàng),然后再手動(dòng)補(bǔ)充一些關(guān)于特定話題(Abraham Lincoln)的評(píng)分,從而創(chuàng)建示例中的最終 recommendations.txt 文件。此方法的內(nèi)涵是展示 CF 如何將對(duì)某特定話題感興趣的人導(dǎo)向相關(guān)話題的其他文檔。此示例的數(shù)據(jù)來(lái)源于 990(標(biāo)記為從 0 到 989)個(gè)隨機(jī)用戶,他們隨機(jī)為集合中的所有文章隨機(jī)分配了一些評(píng)分,以及 10 個(gè)用戶(標(biāo)記為從 990 到 999),他們對(duì)集合中包含Abraham Lincoln關(guān)鍵字的 17 篇文章中的部分文章進(jìn)行了評(píng)分。
注意虛構(gòu)數(shù)據(jù)!
本文中的示例完全使用的是虛構(gòu)數(shù)據(jù)。我自己完成了所有評(píng)分,模擬了 10 個(gè)對(duì) Abraham Lincoln 感興趣的實(shí)際用戶。雖然我相信數(shù)據(jù)內(nèi)部的概念很有趣,但數(shù)據(jù)本身以及所使用的值并非如此。如果您希望獲得實(shí)際數(shù)據(jù),我建議您參閱 University of Minnesota 的 GroupLens 項(xiàng)目,以及 Taste 文檔(見(jiàn)參考資料)。我選擇虛構(gòu)數(shù)據(jù)的原因是希望在所有示例中都使用單一數(shù)據(jù)集。
首先,我將演示如何為在 recommendations.txt 文件中指定了分?jǐn)?shù)的用戶創(chuàng)建推薦。這是 Taste 最為常見(jiàn)的應(yīng)用,因此首先需要載入包含推薦的數(shù)據(jù),并將它存儲(chǔ)在一個(gè)DataModel中。Taste 提供了一些不同的 DataModel實(shí)現(xiàn),用于操作文件和數(shù)據(jù)庫(kù)。在本例中,為簡(jiǎn)便起見(jiàn),我選擇使用FileDataModel類,它對(duì)各行的格式要求為:用戶 ID、項(xiàng)目 ID、首選項(xiàng) —其中,用戶 ID 和項(xiàng)目 ID 都是字符串,而首選項(xiàng)可以是雙精度型。建立了模型之后,我需要通知 Taste 應(yīng)該如何通過(guò)聲明一個(gè)UserSimilarity實(shí)現(xiàn)來(lái)比較用戶。根據(jù)所使用的 UserSimilarity實(shí)現(xiàn),您可能還需要通知 Taste 如何在未指定明確用戶設(shè)置的情況下推斷首選項(xiàng)。清單 1 實(shí)現(xiàn)了以上代碼。(示例代碼 中的cf.wikipedia.WikipediaTasteUserDemo包含了完整的代碼清單)。
清單 1. 創(chuàng)建模型和定義用戶相似度
//create the data model FileDataModel dataModel = new FileDataModel(new File(recsFile)); UserSimilarity userSimilarity = new PearsonCorrelationSimilarity(dataModel); // Optional: userSimilarity.setPreferenceInferrer(new AveragingPreferenceInferrer(dataModel));在 清單 1中,我使用了 PearsonCorrelationSimilarity,它用于度量?jī)蓚€(gè)變量之間的關(guān)系,但是也可以使用其他UserSimilarity度量。應(yīng)該根據(jù)數(shù)據(jù)和測(cè)試類型來(lái)選擇相似度度量。對(duì)于此數(shù)據(jù),我發(fā)現(xiàn)這種組合最為合適,但仍然存在一些問(wèn)題。有關(guān)如何選擇相似度度量的更多信息,請(qǐng)?jiān)L問(wèn) Mahout 網(wǎng)站(見(jiàn)參考資料)。
為了完成此示例,我需要構(gòu)建一個(gè) UserNeighborhood和一個(gè) Recommender。UserNeighborhood可以識(shí)別與相關(guān)用戶類似的用戶,并傳遞給Recommender,后者將負(fù)責(zé)創(chuàng)建推薦項(xiàng)目排名表。清單 2 實(shí)現(xiàn)了以下想法:
清單 2. 生成推薦
//Get a neighborhood of users UserNeighborhood neighborhood = new NearestNUserNeighborhood(neighborhoodSize, userSimilarity, dataModel); //Create the recommender Recommender recommender = new GenericUserBasedRecommender(dataModel, neighborhood, userSimilarity); User user = dataModel.getUser(userId); System.out.println("-----"); System.out.println("User: " + user); //Print out the users own preferences first TasteUtils.printPreferences(user, handler.map); //Get the top 5 recommendations List<RecommendedItem> recommendations = recommender.recommend(userId, 5); TasteUtils.printRecs(recommendations, handler.map);您可以在命令行中運(yùn)行整個(gè)示例,方法是在包含示例的目錄中執(zhí)行 ant user-demo。運(yùn)行此命令將打印輸出虛構(gòu)用戶 995 的首選項(xiàng)和推薦,該用戶只是 Lincoln 的愛(ài)好者之一。清單 3 顯示了運(yùn)行ant user-demo的輸出:
清單 3. 用戶推薦的輸出
[echo] Getting similar items for user: 995 with a neighborhood of 5 [java] 09/08/20 08:13:51 INFO file.FileDataModel: Creating FileDataModel for file src/main/resources/recommendations.txt [java] 09/08/20 08:13:51 INFO file.FileDataModel: Reading file info... [java] 09/08/20 08:13:51 INFO file.FileDataModel: Processed 100000 lines [java] 09/08/20 08:13:51 INFO file.FileDataModel: Read lines: 111901 [java] Data Model: Users: 1000 Items: 2284 [java] ----- [java] User: 995 [java] Title: August 21 Rating: 3.930000066757202 [java] Title: April Rating: 2.203000068664551 [java] Title: April 11 Rating: 4.230000019073486 [java] Title: Battle of Gettysburg Rating: 5.0 [java] Title: Abraham Lincoln Rating: 4.739999771118164 [java] Title: History of The Church of Jesus Christ of Latter-day Saints Rating: 3.430000066757202 [java] Title: Boston Corbett Rating: 2.009999990463257 [java] Title: Atlanta, Georgia Rating: 4.429999828338623 [java] Recommendations: [java] Doc Id: 50575 Title: April 10 Score: 4.98 [java] Doc Id: 134101348 Title: April 26 Score: 4.860541 [java] Doc Id: 133445748 Title: Folklore of the United States Score: 4.4308662 [java] Doc Id: 1193764 Title: Brigham Young Score: 4.404066 [java] Doc Id: 2417937 Title: Andrew Johnson Score: 4.24178從清單 3 中可以看到,系統(tǒng)推薦了一些信心級(jí)別不同的文章。事實(shí)上,這些項(xiàng)目的分?jǐn)?shù)都是由其他 Lincoln 愛(ài)好者指定的,而不是用戶 995 一人所為。如果您希望查看其他用戶的結(jié)構(gòu),只需要在命令行中傳遞-Duser.id=USER-ID參數(shù),其中 USER-ID是 0和 999之間的編號(hào)。您還可以通過(guò)傳遞 -Dneighbor.size=X來(lái)更改鄰近空間,其中,X是一個(gè)大于 0 的整型值。事實(shí)上,將鄰近空間更改為10可以生成極為不同的結(jié)果,這是因?yàn)殛t近范圍內(nèi)存在一個(gè)隨機(jī)用戶。要查看鄰近用戶以及共有的項(xiàng)目,可以向命令行添加 -Dcommon=true。
現(xiàn)在,如果您所輸入的編號(hào)恰好不在用戶范圍內(nèi),則會(huì)注意到示例生成了一個(gè) NoSuchUserException。確實(shí),應(yīng)用程序需要處理新用戶進(jìn)入系統(tǒng)的情況。舉例來(lái)說(shuō),您可以只顯示 10 篇最熱門的文章,一組隨機(jī)文章,或者一組 “不相關(guān)” 的文章 —或者,與其這樣,還不如不執(zhí)行任何操作。
如前所述,基于用戶的方法經(jīng)常不具有可伸縮性。在本例中,使用基于項(xiàng)目的方法是更好的選擇。幸運(yùn)的是,Taste 可以非常輕松地實(shí)現(xiàn)基于項(xiàng)目的方法。處理項(xiàng)目相似度的基本代碼并沒(méi)有很大差異,如清單 4 所示:
清單 4. 項(xiàng)目相似度示例(摘錄自 cf.wikipedia.WikipediaTasteItemItemDemo)
//create the data model FileDataModel dataModel = new FileDataModel(new File(recsFile)); //Create an ItemSimilarity ItemSimilarity itemSimilarity = new LogLikelihoodSimilarity(dataModel); //Create an Item Based Recommender ItemBasedRecommender recommender = new GenericItemBasedRecommender(dataModel, itemSimilarity); //Get the recommendations List<RecommendedItem> recommendations = recommender.recommend(userId, 5); TasteUtils.printRecs(recommendations, handler.map);與 清單 1相同,我根據(jù)推薦文件創(chuàng)建了一個(gè) DataModel,但這次并未實(shí)例化 UserSimilarity實(shí)例,而是使用LogLikelihoodSimilarity創(chuàng)建了一個(gè) ItemSimilarity,它可以幫助處理不常見(jiàn)的事件。然后,我將ItemSimilarity提供給一個(gè) ItemBasedRecommender,最后請(qǐng)求推薦。完成了!您可以通過(guò)ant item-demo命令在示例中代碼運(yùn)行它。當(dāng)然,在此基礎(chǔ)上,您可以讓系統(tǒng)支持離線執(zhí)行這些計(jì)算,您還可以探索其他的 ItemSimilarity度量。注意,由于本示例中的數(shù)據(jù)是隨機(jī)的,所推薦的內(nèi)容可能并不符合用戶的期望。事實(shí)上,您應(yīng)該確保在測(cè)試過(guò)程中計(jì)算結(jié)果,并嘗試不同的相似度指標(biāo),因?yàn)樵S多常用指標(biāo)在一些邊界情況中會(huì)由于數(shù)據(jù)不足而無(wú)法提供合適的推薦。
我們?cè)賮?lái)看新用戶的例子,當(dāng)用戶導(dǎo)航到某個(gè)項(xiàng)目之后,缺少用戶首選項(xiàng)時(shí)的操作就比較容易實(shí)現(xiàn)了。對(duì)于這種情況,您可以利用項(xiàng)目計(jì)算并向 ItemBasedRecommender請(qǐng)求與相當(dāng)項(xiàng)目最相似的項(xiàng)目。清單 5 展示了相關(guān)代碼:
清單 5. 相似項(xiàng)目演示(摘錄自 cf.wikipedia.WikipediaTasteItemRecDemo)
//create the data model FileDataModel dataModel = new FileDataModel(new File(recsFile)); //Create an ItemSimilarity ItemSimilarity itemSimilarity = new LogLikelihoodSimilarity(dataModel); //Create an Item Based Recommender ItemBasedRecommender recommender = new GenericItemBasedRecommender(dataModel, itemSimilarity); //Get the recommendations for the Item List<RecommendedItem> simItems = recommender.mostSimilarItems(itemId, numRecs); TasteUtils.printRecs(simItems, handler.map);您可以通過(guò)在命令中執(zhí)行 ant sim-item-demo來(lái)運(yùn)行 清單 5。它與 清單 4之間的唯一差異就是,清單 5并沒(méi)有請(qǐng)求推薦,而是請(qǐng)求輸出最相似的項(xiàng)目。
現(xiàn)在,您可以繼續(xù)深入探索 Taste。要了解更多信息,請(qǐng)閱讀 Taste 文檔和 mahout-user@lucene.apache.org 郵件列表(見(jiàn) 參考資料)。接下來(lái),我將討論如何通過(guò)利用 Mahout 的集群功能來(lái)查找相似文章。
回頁(yè)首
使用 Mahout 實(shí)現(xiàn)集群
Mahout 支持一些集群算法實(shí)現(xiàn)(都是使用 Map-Reduce 編寫的),它們都有一組各自的目標(biāo)和標(biāo)準(zhǔn):
- Canopy:一種快速集群算法,通常用于為其他集群算法創(chuàng)建初始種子。
- k-Means(以及 模糊 k-Means):根據(jù)項(xiàng)目與之前迭代的質(zhì)心(或中心)之間的距離將項(xiàng)目添加到 k 集群中。
- Mean-Shift:無(wú)需任何關(guān)于集群數(shù)量的 推理知識(shí)的算法,它可以生成任意形狀的集群。
- Dirichlet:借助基于多種概率模型的集群,它不需要提前執(zhí)行特定的集群視圖。
從實(shí)際的角度來(lái)說(shuō),名稱和實(shí)現(xiàn)并不如它們生成的結(jié)果重要。了解了這一點(diǎn)之后,我將展示 k-Means 的運(yùn)行原理,而其余內(nèi)容將由您自己去研究。請(qǐng)記住,要有效運(yùn)行每個(gè)算法,您需要滿足它們各自的的需求。
簡(jiǎn)單來(lái)說(shuō)(詳細(xì)信息見(jiàn)下文),使用 Mahout 創(chuàng)建數(shù)據(jù)集群的步驟包括:
首先,集群算法要求數(shù)據(jù)必需采用適合處理的格式。在機(jī)器學(xué)習(xí)中,數(shù)據(jù)通常被表示為 矢量,有時(shí)也稱作 特征矢量。在集群中,矢量是表示數(shù)據(jù)的一組權(quán)重值。我將使用通過(guò) Wikipedia 文檔生成的矢量來(lái)演示集群,但是也可以從其他地方獲取矢量,比如說(shuō)傳感器數(shù)據(jù)或用戶資料。Mahout 隨帶了兩個(gè)Vector表示:DenseVector和 SparseVector。根據(jù)所使用的數(shù)據(jù),您需要選擇合適的實(shí)現(xiàn),以便實(shí)現(xiàn)良好的性能。通常而言,基于文本的問(wèn)題是很少的,因此應(yīng)該使用SparseVector來(lái)處理文本。另一方面,如果大多數(shù)矢量的大多數(shù)值都是非零的,則比較適合使用 DenseVector。如果您對(duì)此不確定,可以嘗試這兩種實(shí)現(xiàn)來(lái)處理數(shù)據(jù)的一個(gè)子集,然后確定哪種實(shí)現(xiàn)的運(yùn)行速度更快。
通過(guò) Wikipedia 內(nèi)容生成矢量的方法如下(我已經(jīng)完成了此工作):
運(yùn)行這兩個(gè)步驟的結(jié)果是生成一個(gè)文件,該文件類似于與您從 Getting started with Mahout 入門部分下載的 n2.tar.gz 文件。需要說(shuō)明一下,n2.tar.gz 文件中的矢量是通過(guò)由 ant install方法之前下載的 Wikipedia “塊” 文件中的所有文件的索引創(chuàng)建的。矢量將被格式化為 Euclidean 格式(或者 L2格式;請(qǐng)參見(jiàn)參考資料)。在使用 Mahout 時(shí),您可能希望嘗試采用不同的方法來(lái)創(chuàng)建矢量,以確定哪種方法的效果最好。
評(píng)估結(jié)果
可以采用多種方法來(lái)評(píng)估集群結(jié)果。許多人最開(kāi)始都是使用手動(dòng)檢查與隨機(jī)測(cè)試相結(jié)合的方法。但是,要實(shí)現(xiàn)令人滿足的結(jié)果,通常都需要使用一些更加高級(jí)的計(jì)算技巧,比如說(shuō)使用一些準(zhǔn)則開(kāi)發(fā)一個(gè)黃金標(biāo)準(zhǔn)。有關(guān)評(píng)估結(jié)果的更多信息,請(qǐng)參見(jiàn)參考資料。在本例中,我使用手動(dòng)檢查來(lái)判斷結(jié)果集群是否有意義。如果要投入生產(chǎn),則應(yīng)該使用更加嚴(yán)格的流程。
創(chuàng)建了一組矢量之后,接下來(lái)需要運(yùn)行 k-Means 集群算法。Mahout 為所有集群算法都提供了驅(qū)動(dòng)程序,包括 k-Means 算法,更合適的名稱應(yīng)該是 KMeansDriver。可以直接將驅(qū)動(dòng)程序作為單獨(dú)的程序使用,而不需要 Hadoop 的支持,比如說(shuō)您可以直接運(yùn)行 ant k-means。有關(guān)KMeansDriver可接受的參數(shù)的更多信息,請(qǐng)查看 build.xml 中的 Ant k-means 目標(biāo)。完成此操作之后,您可以使用ant dump命令打印輸出結(jié)果。
成功在獨(dú)立模式中運(yùn)行驅(qū)動(dòng)程序之后,您可以繼續(xù)使用 Hadoop 的分布式模式。為此,您需要 Mahout Job JAR,它位于示例代碼的 hadoop 目錄中。Job JAR 包可以將所有代碼和依賴關(guān)系打包到一個(gè) JAR 文件中,以便于加載到 Hadoop 中。您還需要下載 Hadoop 0.20,并依照 Hadoop 教程的指令,首先在準(zhǔn)分布式模式(也就是一個(gè)集群)中運(yùn)行,然后再采用完全分布式模式。有關(guān)更多信息,請(qǐng)參見(jiàn) Hadoop 網(wǎng)站及資源,以及 IBM 云計(jì)算資源(參見(jiàn)參考資料)。
回頁(yè)首
使用 Mahout 實(shí)現(xiàn)內(nèi)容分類
Mahout 目前支持兩種根據(jù)貝氏統(tǒng)計(jì)來(lái)實(shí)現(xiàn)內(nèi)容分類的方法。第一種方法是使用簡(jiǎn)單的支持 Map-Reduce 的 Naive Bayes 分類器。Naive Bayes 分類器為速度快和準(zhǔn)確性高而著稱,但其關(guān)于數(shù)據(jù)的簡(jiǎn)單(通常也是不正確的)假設(shè)是完全獨(dú)立的。當(dāng)各類的訓(xùn)練示例的大小不平衡,或者數(shù)據(jù)的獨(dú)立性不符合要求時(shí),Naive Bayes 分類器會(huì)出現(xiàn)故障。第二種方法是 Complementary Naive Bayes,它會(huì)嘗試糾正 Naive Bayes 方法中的一些問(wèn)題,同時(shí)仍然能夠維持簡(jiǎn)單性和速度。但在本文中,我只會(huì)演示 Naive Bayes 方法,因?yàn)檫@能讓您看到總體問(wèn)題和 Mahout 中的輸入。
簡(jiǎn)單來(lái)講,Naive Bayes 分類器包括兩個(gè)流程:跟蹤特定文檔及類別相關(guān)的特征(詞匯),然后使用此信息預(yù)測(cè)新的、未見(jiàn)過(guò)的內(nèi)容的類別。第一個(gè)步驟稱作 訓(xùn)練(training),它將通過(guò)查看已分類內(nèi)容的示例來(lái)創(chuàng)建一個(gè)模型,然后跟蹤與特定內(nèi)容相關(guān)的各個(gè)詞匯的概率。第二個(gè)步驟稱作 分類,它將使用在訓(xùn)練階段中創(chuàng)建的模型以及新文檔的內(nèi)容,并結(jié)合 Bayes Theorem 來(lái)預(yù)測(cè)傳入文檔的類別。因此,要運(yùn)行 Mahout 的分類器,您首先需要訓(xùn)練模式,然后再使用該模式對(duì)新內(nèi)容進(jìn)行分類。下一節(jié)將演示如何使用 Wikipedia 數(shù)據(jù)集來(lái)實(shí)現(xiàn)此目的。
運(yùn)行 Naive Bayes 分類器
在運(yùn)行訓(xùn)練程序和分類器之前,您需要準(zhǔn)備一些用于訓(xùn)練和測(cè)試的文檔。您可以通過(guò)運(yùn)行 ant prepare-docs來(lái)準(zhǔn)備一些 Wikipedia 文件(通過(guò)install目標(biāo)下載的文件)。這將使用 Mahout 示例中的 WikipediaDatasetCreatorDriver類來(lái)分開(kāi) Wikipedia 輸入文件。分開(kāi)文檔的標(biāo)準(zhǔn)是它們的類似是否與某個(gè)感興趣的類別相匹配。感興趣的類別可以是任何有效的 Wikipedia 類別(或者甚至某個(gè) Wikipedia 類別的任何子字符串)。舉例來(lái)說(shuō),在本例中,我使用了兩個(gè)類別:科學(xué)(science)和歷史(history)。因此,包含單詞science或 history的所有 Wikipedia 類別都將被添加到該類別中(不需要準(zhǔn)確匹配)。此外,系統(tǒng)為每個(gè)文檔添加了標(biāo)記并刪除了標(biāo)點(diǎn)、Wikipedia 標(biāo)記以及此任務(wù)不需要的其他特征。最終結(jié)果將存儲(chǔ)在一個(gè)特定的文件中(該文件名包含類別名),并采用每行一個(gè)文檔的格式,這是 Mahout 所需的輸入格式。同樣,運(yùn)行ant prepare-test-docs代碼可以完成相同的文檔測(cè)試工作。需要確保測(cè)試和訓(xùn)練文件沒(méi)有重合,否則會(huì)造成結(jié)果不準(zhǔn)確。從理論上說(shuō),使用訓(xùn)練文檔進(jìn)行測(cè)試應(yīng)該能實(shí)現(xiàn)最的結(jié)果,但實(shí)際情況可能并非如此。
設(shè)置好訓(xùn)練和測(cè)試集之后,接下來(lái)需要通過(guò) ant train目標(biāo)來(lái)運(yùn)行 TrainClassifier類。這應(yīng)該會(huì)通過(guò) Mahout 和 Hadoop 生成大量日志。完成后,ant test將嘗試使用在訓(xùn)練時(shí)建立的模型對(duì)示例測(cè)試文檔進(jìn)行分類。這種測(cè)試在 Mahout 中輸出的數(shù)據(jù)結(jié)構(gòu)是混合矩陣。混合矩陣可以描述各類別有多少正確分類的結(jié)果和錯(cuò)誤分類的結(jié)果。
總的來(lái)說(shuō),生成分類結(jié)果的步驟如下:
運(yùn)行所有這些命令(Ant 目標(biāo) classifier-example將在一次調(diào)用中捕獲所有它們),這將生成如清單 6 所示的匯總和混合矩陣:
清單 6. 運(yùn)行 Bayes 分類器對(duì)歷史和科學(xué)主題進(jìn)行分類的結(jié)果
[java] 09/07/22 18:10:45 INFO bayes.TestClassifier: history 95.458984375 3910/4096.0 [java] 09/07/22 18:10:46 INFO bayes.TestClassifier: science 15.554072096128172 233/1498.0 [java] 09/07/22 18:10:46 INFO bayes.TestClassifier: ================= [java] Summary [java] ------------------------------------------------------- [java] Correctly Classified Instances : 4143 74.0615% [java] Incorrectly Classified Instances : 1451 25.9385% [java] Total Classified Instances : 5594 [java] [java] ======================================================= [java] Confusion Matrix [java] ------------------------------------------------------- [java] a b <--Classified as [java] 3910 186 | 4096 a = history [java] 1265 233 | 1498 b = science [java] Default Category: unknown: 2中間過(guò)程的結(jié)果存儲(chǔ)在 base 目錄下的 wikipedia 目錄中。
獲取了結(jié)果之后,顯然還有一個(gè)問(wèn)題:“我應(yīng)該如何做?”匯總結(jié)果表明,正確率和錯(cuò)誤率大概分別為 75 % 和 25 %。這種結(jié)果看上去非常合理,特別是它比隨機(jī)猜測(cè)要好很多。但在仔細(xì)分析之后,我發(fā)現(xiàn)對(duì)歷史信息的預(yù)測(cè)(正確率大約為 95 %)相當(dāng)出色,而對(duì)科學(xué)信息的預(yù)測(cè)則相當(dāng)糟糕(大約 15 %)。為了查找其原因,我查看了訓(xùn)練的輸入文件,并發(fā)現(xiàn)與歷史相關(guān)的示例要比科學(xué)多很多(文件大小幾乎差了一倍),這可能是一個(gè)潛在的問(wèn)題。
對(duì)于測(cè)試,您可以向 ant test添加 -Dverbose=true選項(xiàng),這會(huì)顯示關(guān)于各測(cè)試輸入的信息,以及它的標(biāo)簽是否正確。仔細(xì)研究此輸出,您可以查找文檔并分析它分類錯(cuò)誤的原因。我還可以嘗試不同的輸入?yún)?shù),或者使用更加科學(xué)數(shù)據(jù)來(lái)重新訓(xùn)練模型,以確定是否能夠改善此結(jié)果。
在訓(xùn)練模型時(shí)考慮使用特征選擇也是很重要的。對(duì)于這些示例,我使用 Apache Lucene 中的 WikipediaTokenizer來(lái)標(biāo)記初始文檔,但是我沒(méi)有盡力刪除可能標(biāo)記錯(cuò)誤的常用術(shù)語(yǔ)或垃圾術(shù)語(yǔ)。如果要將此分類器投入生產(chǎn),那么我會(huì)更加深入地研究輸入和其他設(shè)置,以彌補(bǔ)性能的每個(gè)方面。
為了確定 Science 結(jié)果是否是個(gè)意外,我嘗試了一組不同的類別:共和(Republican)與民主(Democrat)。在本例中,我希望預(yù)測(cè)新文檔是否與 Republicans 或者 Democrats 相關(guān)。為了幫助您獨(dú)立實(shí)現(xiàn)此功能,我在 src/test/resources 中創(chuàng)建了 repubs-dems.txt 文件。然后,通過(guò)以下操作完成分類步驟:
ant classifier-example -Dcategories.file=./src/test/resources/repubs-dems.txt -Dcat.dir=rd兩個(gè) -D值僅僅指向類別文件以及 wikipedia 目錄中存儲(chǔ)中間結(jié)果的目錄。此結(jié)果概要和混合矩陣如清單 7 所示:
清單 7. 運(yùn)行 Bayes 分別器查找 Republicans 和 Democrats 的結(jié)果
[java] 09/07/23 17:06:38 INFO bayes.TestClassifier: -------------- [java] 09/07/23 17:06:38 INFO bayes.TestClassifier: Testing: wikipedia/rd/prepared-test/democrats.txt [java] 09/07/23 17:06:38 INFO bayes.TestClassifier: democrats 70.0 21/30.0 [java] 09/07/23 17:06:38 INFO bayes.TestClassifier: -------------- [java] 09/07/23 17:06:38 INFO bayes.TestClassifier: Testing: wikipedia/rd/prepared-test/republicans.txt [java] 09/07/23 17:06:38 INFO bayes.TestClassifier: republicans 81.3953488372093 35/43.0 [java] 09/07/23 17:06:38 INFO bayes.TestClassifier: [java] Summary [java] ------------------------------------------------------- [java] Correctly Classified Instances : 56 76.7123% [java] Incorrectly Classified Instances : 17 23.2877% [java] Total Classified Instances : 73 [java] [java] ======================================================= [java] Confusion Matrix [java] ------------------------------------------------------- [java] a b <--Classified as [java] 21 9 | 30 a = democrats [java] 8 35 | 43 b = republicans [java] Default Category: unknown: 2雖然最終結(jié)果在正確性方面差不多是相同的,但您可以看到我在這兩個(gè)類別中進(jìn)行選擇時(shí)采取更好的方式。查看包含輸入文檔的 wikipedia/rd/prepared 目錄,我們發(fā)現(xiàn)兩個(gè)訓(xùn)練文件在訓(xùn)練示例方面更加平衡了。 此外,與 “歷史 / 科學(xué)” 結(jié)果相比,得到了示例也少了很多,因?yàn)槊總€(gè)文件都比歷史或科學(xué)訓(xùn)練集小很多。總的來(lái)說(shuō),結(jié)果至少表明平衡性得到了顯著改善。更大的訓(xùn)練集可能會(huì)抵消 Republicans 和 Democrats 之間的差異,即便不行也可以暗示某個(gè)分組堅(jiān)持其在 Wikipedia 上的消息是較好的選擇 —但是,我選擇將這留給政治學(xué)者來(lái)決定。
現(xiàn)在,我已經(jīng)展示了如何在獨(dú)立模式中執(zhí)行分類,接下來(lái)需要將代碼添加到云中,并在 Hadoop 集群上運(yùn)行。與集群代碼相同,您需要 Mahout Job JAR。除此之外,我之前提到的所有算法都是支持 Map-Reduce 的,并且能夠在 Hadoop 教程所述的 Job 提交流程中運(yùn)行。
回頁(yè)首
結(jié)束語(yǔ)
Apache Mahout 在一年多的時(shí)間中走過(guò)了漫長(zhǎng)的道路,為集群、分類和 CF 提供了許多重要的功能,但它還存在很大的發(fā)展空間。日益強(qiáng)大起來(lái)的還有 Map-Reduce 的隨機(jī)決策實(shí)現(xiàn),它提供了分類、關(guān)聯(lián)規(guī)則、用于識(shí)別文檔主題的 Latent Dirichlet Allocation 以及許多使用 HBase 和其他輔助存儲(chǔ)選項(xiàng)的類別選項(xiàng)。除了這些新的實(shí)現(xiàn)之外,還可以找到許多演示、文檔和 bug 修復(fù)包。
最后,就像實(shí)際驅(qū)象者(mahout)利用大象的力量一樣,Apache Mahout 也可以幫助您利用小黃象 Apache Hadoop 的強(qiáng)大功能。下次在需要集群、分類或推薦內(nèi)容時(shí),特別是規(guī)模很大時(shí),一定要考慮使用 Apache Mahout。
致謝
特別感謝 Ted Dunning 和 Sean Owen 對(duì)本文的審閱和建議。
回頁(yè)首
下載
| j-mahout.zip | 90MB |
參考資料
學(xué)習(xí)
- 機(jī)器學(xué)習(xí)
- 機(jī)器學(xué)習(xí):Wikipedia 頁(yè)面提供了一些有用的入門信息和優(yōu)秀的參考資料,可幫助您了解關(guān)于機(jī)器學(xué)習(xí)(包含監(jiān)管學(xué)習(xí)等方法)的更多信息。
- Programming Collective Intelligence(Toby Segaran,O'Reilly,2007 年):本書(shū)可以幫助您迅速掌握許多機(jī)器任務(wù)。
- Artificial Intelligence | Machine Learning:使用斯坦福大學(xué)教授 Andrew Ng 開(kāi)發(fā)的這個(gè)類。
- Evaluation of clustering:了解關(guān)于評(píng)估集群的更多信息。另請(qǐng)參閱 Mahout 郵件列表上的討論。
- Bayes Theorem:了解 Bayes Theorem 的運(yùn)行原理。
- Lp空間:理解 Lp格式。
- Apache Mahout 和 Apache Lucene
- Mahout 項(xiàng)目主頁(yè):搜索關(guān)于 Mahout 的所有內(nèi)容。
- “Map-Reduce for Machine Learning on Multicore”:這篇文章將幫助您啟動(dòng) Mahout。
- “MapReduce: Simplified Data Processing on Large Clusters”(Google Research Publications):閱讀關(guān)于 Map-Reduce 初級(jí)文章。
- Taste:閱讀 Taste 文檔。
- Apache Lucene:了解關(guān)于 Lucene 的更多信息。
- Apache Lucene on developerWorks:通過(guò)這些文章探索 Lucene 的世界。
- Creating Vectors from Text:閱讀 Mahout Wiki 中的這個(gè)條目,了解如何將數(shù)據(jù)轉(zhuǎn)換為 Mahout 的Vector類。
- Cluster Your Data:閱讀此 Mahout Wiki 頁(yè)面,了解關(guān)于如何實(shí)現(xiàn)數(shù)據(jù)集群的更多信息。
- Apache Hadoop:
- Apache Hadoop:了解關(guān)于 Hadoop 的更多信息。
- Hadoop 快速入門教程:了解如何運(yùn)行 Hadoop Job。
- HBase:理解 Hadoop 數(shù)據(jù)庫(kù)。
- 瀏覽 技術(shù)書(shū)店,閱讀有關(guān)這些主題和其他技術(shù)主題的圖書(shū)。
- Cloud Computing:訪問(wèn) developerWorks 云計(jì)算空間。
- developerWorks Java 技術(shù)專區(qū):數(shù)百篇關(guān)于 Java 編程各個(gè)方面的文章。
獲得產(chǎn)品和技術(shù)
- 下載 Hadoop 0.20.0。
- 下載 Wikipedia 的子集。
- 下載 Wikipedia 的子集作為矢量。
- 從 GroupLens項(xiàng)目獲取真實(shí)的電影評(píng)分?jǐn)?shù)據(jù)。
討論
- 加入 Mahout 社區(qū):mahout-user@lucene.apache.org。
- 加入 My developerWorks 社區(qū)。
from: http://www.ibm.com/developerworks/cn/java/j-mahout/
總結(jié)
以上是生活随笔為你收集整理的Apache Mahout 简介的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 数字图像处理:附录-程序实例、参考文献、
- 下一篇: Machine Learning wee