講義設(shè)計(jì)-mahout in action中文版_第1頁(yè)
講義設(shè)計(jì)-mahout in action中文版_第2頁(yè)
講義設(shè)計(jì)-mahout in action中文版_第3頁(yè)
講義設(shè)計(jì)-mahout in action中文版_第4頁(yè)
講義設(shè)計(jì)-mahout in action中文版_第5頁(yè)
已閱讀5頁(yè),還剩33頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

示例學(xué)習(xí):ShopitToJVMMahoutApacheMahout現(xiàn)實(shí)中系統(tǒng)引擎、聚類、分類概入機(jī)器學(xué)習(xí)或者集體智慧的范疇但是在這里Mahout主要注重協(xié)同過(guò)濾/引MahoutMahoutjavaApache這個(gè)分布式計(jì)算框架實(shí)現(xiàn)。Mahout是java庫(kù)。它不支持用戶接口,預(yù)裝好的服務(wù)器。以及安裝等功能。它Mahout適 你也許想知道-MahoutMahout大的就是將一個(gè)新算法代碼實(shí)現(xiàn),Mahout提供了一個(gè)豐富的框架,模式集如果你正在一個(gè)產(chǎn)品團(tuán)隊(duì)或者初創(chuàng)公司想利用機(jī)器學(xué)習(xí)創(chuàng)造競(jìng)爭(zhēng)優(yōu)勢(shì)這本最后,你可能想知道怎么讀“Mahout”“trout”押韻。這是一個(gè)北語(yǔ)的單詞,指的是驅(qū)使大象的人,為了解釋這個(gè)詞,下面介紹一段關(guān)于它的歷史。Mahout2008ApacheLucene子項(xiàng)目,ApacheLuceneLucene近似,像聚類、分類。所以,Lucene進(jìn)入子項(xiàng)目。后,Mahout吸收進(jìn)“Taste”開(kāi)源協(xié)同過(guò)濾的項(xiàng)目。2010.4,MahoutApacheMahouthadoopHadoopMahout字。1.Mahout(見(jiàn)附件Mahout孵化了相當(dāng)多的技術(shù)和算法,很多都是在開(kāi)發(fā)和實(shí)驗(yàn)階段。在工程的早期階段,有3個(gè):協(xié)同過(guò)濾/ 1.2系統(tǒng)引引擎是目前使用的機(jī)器學(xué)習(xí)技術(shù)中最容易識(shí)別的你可能已經(jīng)見(jiàn)過(guò)相關(guān)的服務(wù)或網(wǎng)頁(yè),基于歷史行為書、、文檔。他們嘗試推論出用戶偏好,并標(biāo)記出用戶不知曉的、感的item: 可能是最出名的使用系統(tǒng)商務(wù)?;诮灰缀途W(wǎng)頁(yè)活 像Líbímseti將一部分用戶給其他用戶社交網(wǎng)絡(luò)像用技術(shù)的變形來(lái)為用戶識(shí)別最可能成為對(duì)于Amazon和示例其他,通過(guò)這種聰明的交叉銷售,系統(tǒng)確實(shí)有具體 聚Clusteringturnsupinlessapparentbutequallywell-known(首句該如何翻譯,哪位仁兄幫個(gè)忙顧名思義,聚類技術(shù)嘗試去將大量的擁有相同相似度的事物到不同的類中。聚類是在海量或者難于理解的數(shù)據(jù)集里發(fā)現(xiàn)層次和順序,展現(xiàn)模式,或使得 News據(jù)為了根據(jù)具備邏輯性的故事 展示,而不是所有文章的行列表使用文章的 圖1.3做了說(shuō)(見(jiàn)附件搜索引擎像Clusty基于相同的原因搜索結(jié)果分某些屬性。同樣地,分類無(wú)處不在,盡管的時(shí)候隱于幕后。這些系統(tǒng)通過(guò)評(píng)估item的很多實(shí)例來(lái)學(xué)習(xí),以推導(dǎo)出分類規(guī)則。這個(gè)平常的想Yahoo!Mail決定接收的信息是不是郵件,基于先前郵件和用戶的垃圾郵件報(bào)告,以及郵件的特性。一些信息被分類為郵件,如圖1.4Picasa(http:/ /)和其他的管理應(yīng)用可以判斷一張中是否含有人臉。光學(xué)字符識(shí)別通過(guò)將小區(qū)域作為獨(dú)立字符來(lái)分類將掃描文本的若干iTunesApple’sGeniusfeature在列表。擴(kuò)展依據(jù)一些粗略估計(jì),Picasa在3年前可能已經(jīng)擁有5億張。這意味著每天需要分析數(shù)百萬(wàn)分析一張并不是一個(gè)大問(wèn)題盡管需要重復(fù)數(shù)百萬(wàn)次。但是,學(xué)習(xí)階段需要億萬(wàn)都提供相關(guān)信息--上了規(guī)模的計(jì)算,使用單機(jī)是 /archive/2007-03-12-依據(jù)一個(gè)類似的分析,News大約每天有350萬(wàn)新文章。盡管數(shù)量并不是據(jù)推測(cè),Netflix實(shí)際上擁有的和必須用于創(chuàng)建系統(tǒng)的整個(gè)數(shù)據(jù)遠(yuǎn)遠(yuǎn)大于這機(jī)處理,甚至高配置的機(jī)器也不可以。所以,任何人實(shí)現(xiàn)這些技術(shù)都不能回避Mahout的式,用于有效處理海量數(shù)據(jù)。術(shù)公司在考慮。但是,今天計(jì)算能力已經(jīng)比之前廉價(jià),借助像Hadoop這樣的開(kāi)源框架更方便。Mahout嘗試通過(guò)使用hadoop提供優(yōu)質(zhì)、開(kāi)源實(shí)現(xiàn),能夠在這個(gè)規(guī)模上解決問(wèn)題,解決這類困惑,并且將其送到所有技術(shù)組織中。MapReduceandMahout的一些部分使用了Apachehadoop工程hadoop是一個(gè)開(kāi)源的基于java的MapReduce(http /papers/mapreduce.html)實(shí)現(xiàn)。MapReduce是一種分布式計(jì)算框架,在。它是一種編程模式,開(kāi)始聽(tīng)起來(lái)感覺(jué)很奇怪,或者太簡(jiǎn)單了以至于很強(qiáng)大。MapReduce編程模式適用于輸入是key-value鍵值對(duì)集合的問(wèn)題?!癿ap”函數(shù)將這些鍵值對(duì)轉(zhuǎn)換為中間鍵值對(duì)?!癛educe”函數(shù)通過(guò)某種方式將同一個(gè)中間鍵的值合并到一起并產(chǎn)出結(jié)果。實(shí)際上,很多問(wèn)題可以設(shè)計(jì)成MapReduce問(wèn)題,或者他們的一個(gè)系列。并且這種模式非常易于并行化實(shí)現(xiàn):所有的處理過(guò)程都是獨(dú)立的,所以可以劃MapReduce,hadoop(mon/docs/current/mapred_tutorial.html)HadoopMapReduceMapReduce起來(lái)那么簡(jiǎn)單。它管理輸入數(shù)據(jù)、中間鍵值對(duì)、輸出數(shù)據(jù)的。這些數(shù)據(jù)可能是海量的,需要在多臺(tái)計(jì)算機(jī)上運(yùn)行,而不只是在某一臺(tái)機(jī)器的本地。它Hadoop是將它作為類庫(kù)添加到你的工程中,它包含很多模塊,每一個(gè)模塊都有若干類Hadoop單,但投入在可擴(kuò)展的、分布式實(shí)現(xiàn)可以讓你在之后有很大的收獲:因?yàn)槟愕膆adoop,基于這一點(diǎn),你可以hadoopAmazonElastic /elasticmapreduce/Hadoop集群、提供計(jì)算能力、提供友好的接口的服務(wù),可基于hadoop操作、大規(guī)你需要安裝很多工具在你能“可以在家里玩”后面章節(jié)提供的一些示例代碼之前。假設(shè)你已經(jīng)熟悉Java開(kāi)發(fā)。。Mahout以及和它相關(guān)的框架都是基于Java的,因此是平臺(tái)無(wú)關(guān)的,你可以在任何一臺(tái)安裝了JVM的機(jī)器上使用他。有時(shí)候,需要給出許多不同平臺(tái)的示例和介紹,特別地,命令行模式在windows和FreeBSDtcsh有一些不認(rèn)的在大部分Linux、MacOSX,一些Unix變種和Cygwin(一種windows類Unix環(huán)境)。期望使用windows的用戶很可能不方便。盡管如此,本書下面的介紹列表對(duì)你來(lái)說(shuō)應(yīng)該可以很容易的理解。。JavaJavaJavaMahoutJava6java-version。如果報(bào)告不是以“1.6”Java6。windows和Linux用戶能在h 找到Java6JVM。蘋果公司為MacOSX10.5和10.6提供Java6JVM。如果發(fā)現(xiàn)Java6沒(méi)有被應(yīng)用,在“/Applications/Utilities”打開(kāi)“javaperferences”。在這里可以選擇Java6作為默認(rèn)選項(xiàng)。你使用IDE。Eclipse()是非常常用、免費(fèi)的一款I(lǐng)DENetBeans()也是一款常用開(kāi)源IDE。In liJIDEA 例如,IDEA能從現(xiàn)有的Mavan模型中直接創(chuàng)建一個(gè)新工程;在創(chuàng)建新工程的時(shí)候,通過(guò)指定Mahout源代碼的根 ,它將用一種友好的組織方式自動(dòng)配置、展示整個(gè)工程。例如,丟掉整本書的源代碼core/src/...,然后在IDE里面運(yùn)行,只需要一次點(diǎn)擊,依賴和編譯的細(xì)節(jié)都會(huì)自動(dòng)搞定。這證明了使用IDE比人安裝和其他Apache工程一樣,Mahout的構(gòu)建、發(fā)布系統(tǒng)基于Maven()。Maven是一種命令行模式的管理代碼,打Ant但是不同Ant是一種靈活的低級(jí)別的語(yǔ)言Maven是一種高級(jí)別的工具,Mahoutmaven,maven。MacOSXmavenmavn另外,標(biāo)準(zhǔn)方式是二進(jìn)制版本,將其解壓到/usr/local/maven,然后編輯~/.bashrcmaven如果你使用IDE,像Eclipse或者InliJ,他們已經(jīng)集成了Maven。參考文檔它的文檔去了解如何將Maven整合。這將在IDE中使用Mahout變得簡(jiǎn)單一些,IDEMaven(pim.xml)配置、導(dǎo)入工程。安裝發(fā)布版本和其他介紹因?yàn)镸ahout的更新很頻繁,有規(guī)律的進(jìn)行修復(fù)、功能改進(jìn),在實(shí)際使用過(guò)程中,使用發(fā)布版本的(或者使用svn上的最近的未發(fā)布代碼)可能對(duì)你的幫助更大,詳見(jiàn)resources.html)。未來(lái)的版本應(yīng)該向后兼容本書的示例。svnIDEIDEMavenpom.xmlMaven安裝hadoop。你不需要一個(gè)集群去運(yùn)行hadoophadoop0.20.2mon/releases.html,式安裝hadoop, mon/docs/current/quickstart.html。總Mahout,ApacheMahout的探索引擎聚類分類如果你是一個(gè)機(jī)器學(xué)習(xí)領(lǐng)域的研究者正在尋一個(gè)實(shí)用指導(dǎo)、又或者你是這個(gè)領(lǐng)域的開(kāi)發(fā)者,想從其他從業(yè)者處快速學(xué)習(xí)實(shí)用方法,本書是非常適合你的。:這些技術(shù)不僅僅是路論已經(jīng)注意到很多知名的引擎、聚類、分類的樣例在現(xiàn)實(shí)世界中已經(jīng)在應(yīng)用:電子商務(wù)、郵件、、,更涉及大規(guī)模的機(jī)Mahout:已經(jīng)注意到很多時(shí)候這些技術(shù)時(shí)常伴隨著海量的數(shù)據(jù)--可擴(kuò)展性是這個(gè)領(lǐng)域特別需要持續(xù)關(guān)注的。首先來(lái)看一下MapReduce和hadoop,以及他們Mahout因?yàn)檫@是一本動(dòng)手實(shí)踐的、實(shí)籍,馬上開(kāi)始使用Mahout。此刻,你應(yīng)Mahout2器的介Mahout中的器引擎精度與質(zhì)量評(píng)基于一個(gè)真實(shí)數(shù)據(jù)集的測(cè)試每天都會(huì)對(duì)一些喜歡的、不喜歡的甚至不關(guān)心的事物進(jìn)行一些評(píng)價(jià)。于T恤、沙拉醬、滑雪場(chǎng)、發(fā)型、臉型或者電視。,我也喜歡火雞三明治,因?yàn)檫@兩種三明治很相似?;蛘哒f(shuō)可以認(rèn)為一個(gè)人,這些模式可以幫助一個(gè)人的好惡,而就是人們喜好事物的模式,可以利用它來(lái)發(fā)現(xiàn)一些新的有價(jià)值的東西。上面已經(jīng)介紹了關(guān)于的一些思路,這一章,會(huì)用Mahout來(lái)體驗(yàn)一下如何去構(gòu)建一個(gè)簡(jiǎn)單的引擎,然后了解其原理,給你一2.1 你這本書肯定是有原因的或許是因?yàn)檫@本書和你所經(jīng)常瀏覽的書挨的架上也擺著這本書,也或許這個(gè)同事直接向你過(guò)這本書。相似的人來(lái)發(fā)現(xiàn)新的你所感的東西(如:來(lái)自同事的)。另一方面,一放的很近的書)。事實(shí)上,這兩種情形就刻畫出了引擎的兩個(gè)基本算法:”user-based”和”item-based”2.1.1協(xié)同過(guò)濾(Collaborativefiltering),不是基于內(nèi)容度講這是它的一種優(yōu)勢(shì)。而且,這種技術(shù)不關(guān)心項(xiàng)目本身是什么。還有一些其他基于項(xiàng)目?jī)?nèi)容的技術(shù),這些往往被稱“content-based”。例如,一個(gè)朋友向你一本書,這本書是錢鐘書寫的,這樣就可以看做是基于內(nèi)容的因?yàn)檫@個(gè)的理由是因?yàn)檫@本書的一個(gè)屬性:作者。雖然Mahout對(duì)一些基于內(nèi)容的也提供了一些方法,但是Mahout沒(méi)有對(duì)于這種框架的直接實(shí)現(xiàn)。這些基于內(nèi)容的技術(shù)本身并沒(méi)有什么錯(cuò)相反它在一些很專門的領(lǐng)域可數(shù)、作者、商、顏色、字體等等。并且你還需要決定這些屬性的重要程度因?yàn)檫@個(gè)原因,Mahout沒(méi)有過(guò)多的去將這種技術(shù)。不過(guò)這種類型的推薦Mahout是可以構(gòu)建的,在下一章看到一個(gè)用到的相關(guān)技到此,是時(shí)候該用Mahout體驗(yàn)一下協(xié)同過(guò)濾的了構(gòu)建第一個(gè)協(xié)同過(guò)濾引Mahout包括了幾種引擎,事實(shí)上它開(kāi)始就是傳統(tǒng)的基于用戶和基于內(nèi)的器。建立輸:開(kāi)始探索的一個(gè)好的方法就是先找一個(gè)瑣碎的小例子數(shù)據(jù)的輸入時(shí)的基礎(chǔ)。這些數(shù)據(jù)會(huì)以Mahout語(yǔ)言來(lái)表示一種“偏好”程度,因?yàn)橄到y(tǒng)很擅中,用戶和項(xiàng)目顯得尤為重要。一個(gè)偏好(preference)UserID一個(gè)ItemID然后再用一個(gè)值來(lái)代表偏好的程度IDMahout中用整數(shù)表示,而偏好可以使任何數(shù)字類型的,值越大表示偏好程度越高。例如把偏好程度分為五個(gè)檔次:1-5,1,5:新建一個(gè)文本用來(lái)輸入數(shù)據(jù),用1到5的整數(shù)來(lái)表示有五個(gè)用戶,101104ID。每一項(xiàng)采用intro.csv。2.1輸入數(shù)據(jù)文件intro.csv的內(nèi)通過(guò)對(duì)文件數(shù)據(jù)的觀察,發(fā)現(xiàn)user1和5的偏好差不多,他們共同book101,10210314101103,User1User22.1戶與項(xiàng)目關(guān)系圖,虛線代表負(fù)關(guān)系(不喜歡),實(shí)線代表正關(guān)系(喜建立你會(huì)向User1那一本呢?不是101,102或103——因?yàn)樗呀?jīng)知道這些書了給他的必須是他不知道的上知道4和5和1比較像,所以給14和5都喜歡的可能比較合理。也就是說(shuō)104、105、106都在備選之列而104的偏好為4.5和4,所以猜最應(yīng)該104好吧眼見(jiàn)為實(shí),跑一下程序:2.2一個(gè)簡(jiǎn)單的基于用戶的Mahout器程序? importorg.apache.mahout.cf.taste.impl.model.file.*;importorg.apache.mahout.cf.taste.impl.neighborhood.*;importorg.apache.mahout.c importorg.apache.mahout.cf.taste.impl.similarity.*;importorg.apache.mahout.cf.taste.model.*;importorg.apache.mahout.cf.taste.neighborhood.*;importorg.apache.mah mender.*;importorg.apache.mahout.cf.taste.similarity.*;importjava.io.*;importjava.util.*; menderIntro{publicstaticvoidmain(String[]args)throwsException{DataModelmodel=newFileDataModel(newFile("intro.csv"));A

UserSimilaritysimilarity=newUserNeighborhoodneighborhoodnewNearestNUserNeighborhood(2,similarity, mender=newGen mender(model,neighborhood,similarity);BmendedItem=mend(1,Cfor( mendation: mendations){ }}}加載數(shù)據(jù)文建立引給User11個(gè)項(xiàng)為了簡(jiǎn)介,后續(xù)的代碼會(huì)省略頭部的imports、類、函數(shù)。只貼出程序中的代碼。為了更好的可視化基本組件之間的關(guān)系,請(qǐng)看圖2.2。不是所有的Mahout器都想這樣,因?yàn)槟承?huì)使用不同的組件。下圖給出的圖2.2基于用戶的器的組件簡(jiǎn)在后續(xù)章節(jié)要詳細(xì)介紹上述組件之間,可以大致的總結(jié)一下他們?cè)谡麄€(gè)器中所扮演的角色DataModel負(fù)責(zé)和提供用戶項(xiàng)目、偏好的計(jì)算所需要的數(shù)據(jù)。UserSimiliarity提供了一些基于某種算法的用戶相 mender利用所有的組件來(lái)為一個(gè)用戶產(chǎn)生一個(gè)結(jié)果,另外他也分析輸出結(jié)IDEmendedItem[item:104,這個(gè)程序的要求是獲取一個(gè)最高的結(jié)果,結(jié)果只有一個(gè)。器把104給了User1。更進(jìn)一步,器還給出了偏好的一個(gè)4.3,因?yàn)檫@個(gè)值是所有結(jié)果中最高的,所以被輸出了出來(lái)。結(jié)果看起來(lái)不太壞,值得被的107并沒(méi)有,只是因104106,1044.0451044.04.5光從數(shù)據(jù)的表面很難知道正確結(jié)果,但是引擎可以通過(guò)簡(jiǎn)單的說(shuō)像上面的小數(shù)據(jù)對(duì)于構(gòu)建系統(tǒng)是微不足道的。者文章。偏好通過(guò)點(diǎn)擊數(shù)來(lái)計(jì)算,但是這樣得來(lái)的偏好指數(shù)很可能是可能很多的點(diǎn)擊操作是在登錄之前發(fā)生的,這樣就不能把這些點(diǎn)擊數(shù)與某高效準(zhǔn)確的從數(shù)據(jù)集中得出結(jié)果是非常重要的。接下來(lái)以案例研究的方式去呈現(xiàn)Mahout是如何解決這些問(wèn)題的。這些案例將會(huì)展示為何一些標(biāo)準(zhǔn)方產(chǎn)生非常差的結(jié)果,或者了很多內(nèi)存和CPU,另Mahout(翻譯By花考拉評(píng)估好的結(jié)果?如何才能得出這樣的結(jié)果?這一章剩下的部分將停下來(lái)探索器的評(píng)估,因?yàn)檫@是用來(lái)了解特定器的有力工具。最理想的器會(huì)像巫師一樣某明奇妙的猜到你所喜歡的東偏好指數(shù)羅列出來(lái),這就是一個(gè)好的。確實(shí)為一些或者全部的項(xiàng)目打分是引擎常見(jiàn)做法。所以評(píng)估器的案就是評(píng)估它所產(chǎn)生的偏好指數(shù)——也就是評(píng)估偏好訓(xùn)練數(shù)據(jù)與打據(jù)(TestingData)來(lái)進(jìn)行模擬,剩下的則是訓(xùn)練數(shù)據(jù)(TrainingData)。除了用來(lái)訓(xùn)練的偏好指數(shù),其余的偏好指數(shù)都用來(lái)這些被去掉的偏好指數(shù)。如此,為器打分就變得十分簡(jiǎn)單了。例如,可以計(jì)低越好。因?yàn)樵降鸵馕吨町愒叫。?dāng)然0是最完美的——和真實(shí)無(wú)任何差2.1差和鈞方差試出差錯(cuò)的項(xiàng)懲罰更加嚴(yán)厲,因?yàn)镮tem2的存在。例如,Item2的差了兩個(gè)等級(jí),那么均方差會(huì)去2的平方編程了4,而差了1則還是1。這樣一下就差了2倍。由于簡(jiǎn)單的均差表達(dá)更為直接,在下一個(gè)例子中,還將使用它:運(yùn) 2.3器評(píng)估程序的配置和運(yùn)行?RandomUtils.useTestSeed();DataModelmodel=newFileDataModel(new evaluatornewAverageAbsol builder=new menderBuilder(){B mender(DataModelmodel)throwsTasteException{UserSimilaritysimilarity=newPearsonCorrelationSimilarityUserNeighborhoodneighborhoodnewNearestNUserNeighborhood(2,similarity,model); }doublescore=evaluator.evaluate(builder,null,model,0.7,1.0);C使用例子中的可重復(fù)數(shù)建立一個(gè)和上述一樣的70%的數(shù)據(jù)作為訓(xùn)練集;30%的數(shù)據(jù)作為測(cè)試evaluate()這個(gè)函數(shù)當(dāng)中。DataModel和 需要的是這個(gè)方法中不會(huì)有 這個(gè)方法需要根據(jù)訓(xùn)練集產(chǎn)生的DataModel構(gòu)造一個(gè) mender,所以調(diào)用者需要提供一個(gè)能夠利用DataModel產(chǎn)生 mender的對(duì)象— menderBuilder。他的構(gòu)造方法和之前提到的方法一樣評(píng)估結(jié)這個(gè)程序打印出評(píng)估結(jié)果:用一個(gè)分?jǐn)?shù)(數(shù)字)mender的性能如何。你會(huì)看到這個(gè)程序的結(jié)果為1.0。即使你多次的隨機(jī)RandomUtils.useTestSeed()函數(shù)每們需要保證結(jié)果的可再現(xiàn)性。但是千萬(wàn)它用在你實(shí)際的代碼中。 1.0。在1到5這樣的范圍中,平均相差1不算很多,但是的 menderEvaluatormenderEvaluatorDataModelBuilderDataModelevaluate()nullDataModelDataModelBuilder了。DataModelBuilder相當(dāng)于是把訓(xùn)練集數(shù)據(jù)注入到評(píng)估過(guò)程的一個(gè)接口。1.0成0.1,那么就用了10%的數(shù)據(jù)。這對(duì)于快速測(cè)試器的微小的變化是十分實(shí)評(píng)估查準(zhǔn)率(precision)和率可以從更廣義的角度去看待問(wèn)題它并不是嚴(yán)格的要去估計(jì)偏好指這樣來(lái)看,也可以利用經(jīng)典的信息檢索中的度量方法去索引擎正是為一個(gè)查詢返回一些較好的結(jié)果。,果所占的比例說(shuō)“10條結(jié)果的精度”就是說(shuō)前十條之中正確結(jié)果所占的意圖可以幫你大致的了解一下:,圖2.3上下文搜索中的查準(zhǔn)率和這些術(shù)語(yǔ)很容易在器上套用:查準(zhǔn)率就是在靠前的結(jié)果中準(zhǔn)確的結(jié)果所占的比例率就是在靠前結(jié)果中準(zhǔn)確的結(jié)果在整個(gè)應(yīng)該被結(jié)果中所占的比例。在下一小節(jié)中會(huì)更出更直觀的解釋2.4查準(zhǔn)率 率評(píng)估程序的配置和運(yùn)?1DataModelmodel=newFileDataModel(new2menderIRStatsEvaluatorevaluator menderIRStatsEvaluator menderBuilder= menderBuilder() mender(DataModelthrowsTasteExceptionUserSimilaritysimilarity=newUserNeighborhoodneighborhoodnewNearestNUserNeighborhood(2,similarity, 18IRStatisticsstats=menderBuilder,null,model,null, 1.0);A前兩條結(jié)果的查準(zhǔn)率 RandomUtils.useTestSeed(),那么結(jié)果將會(huì)隨著每次對(duì)訓(xùn)練集和測(cè)試集的選擇不同而發(fā)生微妙的變化但是的測(cè)試程序數(shù)結(jié)果是正確的。率為1.0;所有應(yīng)該被的結(jié)果都在結(jié)果之中。,但是,究竟什么才算應(yīng)該被的結(jié)果?其實(shí)這個(gè)框架下也沒(méi)有一個(gè)合適的定義告訴,在測(cè)試集中偏好指數(shù)最高的那些項(xiàng)目肯定是最應(yīng)該被的,而其余的則不是。,2.5試集中用戶5偏好指數(shù)?如何的。結(jié)果中顯示三個(gè)項(xiàng)目的偏好指數(shù)分別是4.0、3.0、2.0。沒(méi)錯(cuò),是可以被的,但是不是一個(gè)好的。,這個(gè)問(wèn)題需要menderEvaluator值無(wú)法知道那些是好的那些是不好的,而這個(gè)框架為每個(gè)用戶,它需要加上一個(gè)很有意義的標(biāo)準(zhǔn)差。在實(shí)踐經(jīng)驗(yàn)中,一般結(jié)果前16%的就算是較好的結(jié)果了,另外一個(gè)參數(shù)作用和之前的差不多,您可以在相關(guān)文檔中2.4.2查準(zhǔn)率和率的一些問(wèn)查準(zhǔn)率和率發(fā)揮作用的前提是如何定義什么才是“好”的結(jié)果在上面給出了一個(gè)臨界值,或者說(shuō)程序提供了這樣的定義。另外還存在一個(gè)模糊的問(wèn)題結(jié)果包含了一些用戶已經(jīng)喜歡的項(xiàng)目。其實(shí)一個(gè)好的應(yīng)該把這些用戶已經(jīng)知道的項(xiàng)目去除掉在出來(lái)。,試想為一個(gè)喜歡法國(guó)信徒的用戶做但是這種本身就很少。比如為這個(gè)人了一個(gè),但是該幾乎從來(lái)都沒(méi)有人知道,那么這也不是一個(gè)好的,雖然客觀的講這確實(shí)很了不起。一些好的應(yīng)該從所有其他用戶已知的中選取。,中選取一些應(yīng)該被的就可以了。查準(zhǔn)率和率在測(cè)試環(huán)節(jié)也有某種用途用戶喜歡一個(gè)被項(xiàng)目理論上可以認(rèn)為是一個(gè)好的但是絕不能等同于是最喜歡的然而對(duì)于這種布型的偏好程度,你只能采取查準(zhǔn)-的評(píng)估方法,均差和均方差都不能奏效。所以對(duì)數(shù)據(jù)的限制的理解還是十幾重要的。評(píng)估GroupLens的數(shù)據(jù),有了前面的基礎(chǔ)不僅能夠引擎的處理速度,也可以評(píng)估他的,提取數(shù)GroupLens()是一個(gè)可以提供一些不同大小數(shù)據(jù)集的搜索項(xiàng)目,每個(gè)數(shù)據(jù)集來(lái)自于真實(shí)的用戶對(duì)的評(píng)價(jià)。它是世界上可以獲取真實(shí)數(shù)據(jù)的項(xiàng)目之一。本書后續(xù)還將繼續(xù)使用它提供的數(shù)據(jù)。從GroupLens上“100Kdataset”,連接為 ID,ID,等級(jí)(偏好指數(shù))和一些附加信息。額外的信息。沒(méi)錯(cuò),這個(gè)文件需要配合FileDataModel對(duì)象才有意義?;氐角鍐?.3,這里構(gòu)建了一個(gè) ua.base的路徑。在運(yùn)行一下,這回大概需要幾分鐘的時(shí)間,因?yàn)樗锩姘?00,000條數(shù)據(jù)。 mender對(duì)象不是很適合這樣的數(shù)據(jù)。用其他的器進(jìn)行實(shí)來(lái)用一個(gè)叫做“slope-one”的器跑一下這個(gè)數(shù)據(jù),它在即將來(lái)臨 menderBuilder對(duì)象。把他替換成 er。就象這樣:mender的評(píng)估程? menderBuilder= menderBuilder() mender(DataModelmodel)3TasteException4

return 重新跑一遍,你發(fā)現(xiàn)它同樣很快,而且得到了一個(gè)0.748的結(jié)果。它已經(jīng)比這并不代表slope–one總是那么的快和準(zhǔn)確。每一種算法都有自己的特點(diǎn)和屬性去處理很的數(shù)據(jù)。Slope–one在運(yùn)行時(shí)是比較快的,但是它需要一好。在后續(xù)章節(jié)每種算法的優(yōu)點(diǎn)。它強(qiáng)調(diào)拿真實(shí)數(shù)據(jù)測(cè)試的重要性以及Mahout在處理這類問(wèn)題是輕而易舉??傔@一章介紹了引擎的主要思想還創(chuàng)建了一些輸入數(shù)據(jù)用然后在之前花了一些時(shí)間去分析引擎的輸出因?yàn)闀?huì)在度,以及信息檢索領(lǐng)域的查準(zhǔn)率和率在評(píng)估中的應(yīng)用。最后對(duì)擎的性能。,在深入的學(xué)習(xí)引擎之前,有一個(gè)重要概念是需要知道的在下一章介紹:數(shù)據(jù)表達(dá)(representationofdata)。,3器的數(shù)據(jù)表Mahout的數(shù)據(jù)如何呈現(xiàn)DataModel的實(shí)現(xiàn)和使用性能。、本章探索了一些關(guān)鍵的類,這些類主要負(fù)責(zé)呈現(xiàn)數(shù)據(jù)器相關(guān)數(shù)據(jù)。你Mahout本章將會(huì)詳細(xì)介紹一個(gè)Mahout中關(guān)鍵的概念,它提供了數(shù)據(jù)功能:、,最后會(huì)布爾型的偏好數(shù)據(jù),這里沒(méi)有“偏好指數(shù)”這個(gè)概念,所以它需要特殊的處理方法。接下來(lái)介紹數(shù)據(jù)的基本單元:“用戶-項(xiàng)目偏好指數(shù)”(user-itempreference)。,偏好指數(shù)的數(shù)據(jù)表Preference對(duì)PreferenceuserID、itemID1234563.0,那么你應(yīng)該這么定義:newGenericPreference(123,456,3.0f)。Collection<Preference>或Preference[],那么只能說(shuō)你錯(cuò)了,而且很多MahoutAPIPreference一個(gè)GenericPreference對(duì)象包含20個(gè)有用的字節(jié):8個(gè)字節(jié)用來(lái)用戶(javalong),8個(gè)字節(jié)用來(lái)項(xiàng)目ID(long),最后4個(gè)字節(jié)偏好指JVM的實(shí)現(xiàn)不同而變化我說(shuō)的這個(gè)數(shù)據(jù)是參照了蘋果64Java6VMforMacOSX10.6,它還包括了8字節(jié)的對(duì)象,而且由于一些其他原因還有20字節(jié)需要占用。因此GenericPreference對(duì)象已經(jīng)多消耗了140%的了,僅僅因?yàn)槟敲唇酉聛?lái)怎么辦?在器中調(diào)用這樣的對(duì)象是十分平常的事情但是不IDIDPreferenceArray的實(shí)PreferenceArrayAPI。舉IDID際內(nèi)存要求每個(gè)偏好占12字節(jié)(項(xiàng)目ID8字節(jié),偏好指數(shù)4字節(jié))。現(xiàn)在和之前的那個(gè)48字節(jié)的Preference對(duì)象,GC顯示出了四重偏好不僅僅是更快了,而且分配的對(duì)象也更加少了。比較一下圖3.1和3.2,理解這樣的節(jié)省是圖3.1低效的偏好數(shù)組的實(shí)現(xiàn)?;疑眍惖膬?nèi)存消耗,白色代表有用的 圖3.2高效的方式—GenericUserPreferenceArrayPreferenceArray3.1PreferenceArray的偏好設(shè)置方法?1PreferenceArrayuser1Prefs=new2user1Prefs.setUserID(0,1L);A3user1Prefs.setItemID(0,101L);4user1Prefs.setValue(0,2.0f);B5user1Prefs.setItemID(1,102L);6user1Prefs.setValue(1,3.0f);C7Preferencepref=user1Prefs.get(1);D設(shè)置用戶ID用戶1對(duì)項(xiàng)目101感,偏好指數(shù)用戶1對(duì)項(xiàng)目102感,偏好指數(shù)為項(xiàng)目2實(shí)例化一個(gè)偏好對(duì)加速收你可能覺(jué)得萬(wàn)事大吉了,Mahout了,這還沒(méi)有完。你還記得之前提到過(guò)規(guī)模的重要性嗎?但愿你已經(jīng)說(shuō)服自己你將要的問(wèn)題都是非比尋常的大數(shù)據(jù)所以需要一個(gè)非比尋常的答案。PreferenceArray75%的內(nèi)存不僅僅是減少了百萬(wàn)字節(jié)。其實(shí)在適當(dāng)?shù)膱?chǎng)合它可以減少萬(wàn)兆字節(jié),這就是內(nèi)存條或者重新搞一臺(tái)服務(wù)器的區(qū)別了。改動(dòng)雖小,但是真的很低碳環(huán)保!FastByIDMap與Mahoutmapset,請(qǐng)不要吃驚,當(dāng)然JavaTreeSetHashMapAPIFastByIDMapFastIDSetMapSet。但是它們是專門為器設(shè)計(jì)的其目的是為了減少內(nèi)存占用而不是提升性能JavaMahoutFastByIDMapHashMap一樣,也是基于哈希的。它使用了線性散列而不是分離所過(guò)的,對(duì)象往往會(huì)消耗掉很多內(nèi)存空間Set的底層實(shí)現(xiàn)并沒(méi)用使用MapFastByIDMap可以被用作是緩存,因?yàn)樗幸粋€(gè)最大容量的概念。當(dāng)超過(guò)這個(gè)容另外,方面有很大的不同:FastIDSet每個(gè)成員需要大概14個(gè)字節(jié),而HashSet84FastByIDMap28HashMap84的。它們?yōu)槠鞴?jié)約了很多空間,而這一點(diǎn)優(yōu)化意義也超出了優(yōu)化本身。那內(nèi)存中的數(shù)據(jù)模DataMode是器總輸入數(shù)據(jù)的一種抽象。算法需要用它來(lái)實(shí)現(xiàn)高效的數(shù)據(jù)。例如,DataModel可以在輸入數(shù)據(jù)中提供一列用戶,或者提供與某項(xiàng)目關(guān)聯(lián)的所有偏好值,也或者提供對(duì)一個(gè)項(xiàng)目集合感的所有用戶ID。本小節(jié)精選出一些關(guān)于DataModelAPI來(lái)做一番介紹,這些API可以再GenericDataModel數(shù)據(jù)庫(kù)。它所接收的偏好是以FastByIDMap用戶ID去PreferenceArrays3.2用GenericDataModel去定義輸入數(shù)據(jù)模型的示例代FastByIDMap<PreferenceArray>preferences=newFastByIDMap<PreferenceArray>();PreferenceArrayprefsForUser1=newGenericUserPreferenceArray(10);AprefsForUser1.setUserID(0,1L);prefsForUser1.setItemID(0,101L);BprefsForUser1.setValue(0,3.0f);BprefsForUser1.setItemID(1,102L);prefsForUser1.setValue(1,4.5f);…(8preferences.put(1L,prefsForUser1);DataModelmodel=newGenericDataModel(preferences);為用1定義一10個(gè)偏將偏好集合與用戶1關(guān)創(chuàng)建數(shù)據(jù)模型對(duì)象GenericDataModel會(huì)占用多少內(nèi)存呢?偏好是其主要的內(nèi)存消耗。相關(guān)測(cè)試表明,每個(gè)偏好平均在Javaheap中占28字節(jié)。其中除了包含這些信息還包含了一些索引。如果你愿意的話可以在加載一個(gè)GenericDataModel后調(diào)用System.gc()幾次,然后比較Runtime.totalMemory()和Runtime.freeMemory()的結(jié)果。雖然方法比較粗糙,但是它給出了對(duì)數(shù)據(jù)內(nèi)存消耗合理的解釋。基于文件的數(shù)GenericDataModel,而你在使用GenericDataModel一行都包括一個(gè)用戶ID、項(xiàng)目ID、偏好指數(shù)。文件(Tab-separated)、Refreshable組為Refreshable。它由一些相關(guān)組件實(shí)現(xiàn)。它僅僅有一個(gè)方法簡(jiǎn)單的請(qǐng)求重新載入組件、重新計(jì)算以及刷新自己的狀態(tài)。例如,一個(gè)算索引。循環(huán)依賴和共享依賴被很好的處理,如圖3.3所示:圖3.3基于用戶的系統(tǒng)各組件之間的簡(jiǎn)單依賴關(guān)系,箭頭所示為組件刷新FileDataModel載數(shù)據(jù)文件,它不會(huì)自動(dòng)的檢測(cè)文件更新或者定期的去加載文件。這也正是為refresh()FileDataModel其他依賴于數(shù)據(jù)的對(duì)象去調(diào)用refresh()那么用器直接去調(diào)用可能是個(gè)錯(cuò)的選擇: 系統(tǒng)觸發(fā)一次更DataModeldataModel=newFileDataModel(newFile("input.csv"); mender=new mender.refresh(null);A先更DataMode,然后再更新它自,關(guān)于規(guī)模的遍及本書的每個(gè)角落強(qiáng)調(diào)一個(gè)關(guān)于FileDataModel,“更新文件”(UpdateFileDataModel支持一種“更新文件”這是一種在主數(shù)據(jù)文件之后新,而被刪除的數(shù)據(jù)吧偏好指數(shù)置空即可。3.4更新文件樣例1103 主數(shù)據(jù)文件的前綴相一致。如果主數(shù)據(jù)文件名為foo.txt.gz,那么更新文件的基于數(shù)據(jù)庫(kù)的數(shù)級(jí)別,內(nèi)存就需要幾千兆字節(jié)的空間。這樣的內(nèi)存在一些條件下是的。需要注意的是,在數(shù)據(jù)庫(kù)中運(yùn)行不同量級(jí)的器要比在內(nèi)存運(yùn)行慢得多。大提升了算法的速度。除了在別無(wú)選擇或者數(shù)據(jù)量不大并且因?yàn)榧尚枰狫DBC與可以通過(guò)JDBCDataModel來(lái)偏好數(shù)據(jù)。它的唯一子類MySQLJDBCDataModel.用來(lái)MySQL5.x。它可以很好的這一系列版本的MySQL,甚至其他的數(shù)據(jù)庫(kù),因?yàn)樗薃NSISQL。如果需要的話,創(chuàng)建SQL3.1‘taste_preferencesMySQL中的默認(rèn)表模taste_preferencesuser_id、item_id、preferenceIDID由JNDI進(jìn)行配另外假設(shè)包含這個(gè)表的數(shù)據(jù)庫(kù)也可以被一些在JNDI中的DataSource對(duì)象,叫做jdbte。JNDI,你會(huì)有這個(gè)疑問(wèn)嗎?如果你在一個(gè)Web應(yīng)用程序中應(yīng)用引擎而且用了servlet容器像Tomcat據(jù)庫(kù)(server.xml),JNDI的數(shù)據(jù)庫(kù)配置成jdbte,這樣JDBCDataModel就可以用了。下面是一Tomcat:3.5Tomcat的JNDI由代碼方式配JNDIMySQLJDBCDataModelMySQL 用代碼配置DataSourceMysqlDataSourcedataSource=newMysqlDataSource();JDBCDataModeldataModel=newMySQLJDBCDataModel(dataSource,"my_prefs_table","my_user_column","my_item_column",上面是為引擎數(shù)據(jù)庫(kù)的所有代碼。你通過(guò)它會(huì)得到一個(gè)匹配的用戶ID和項(xiàng)目ID都不能為空,而且需要建立索引用戶ID項(xiàng)目ID聯(lián)合主鍵列的數(shù)據(jù)類型在Java中應(yīng)為longfloatMySQL中應(yīng)為BIGINT類注意調(diào)優(yōu)緩存和查詢緩存(查看使用MySQL的連接驅(qū)動(dòng)時(shí),應(yīng)該注意一些參數(shù)值的設(shè)置,例cachePreparedStatements要設(shè)置為true。然后參照javadoc查看建議值設(shè)上述內(nèi)容基本涵蓋了DataModel在引擎框架中的基本應(yīng)用另外有一點(diǎn)條記錄的最的數(shù)據(jù)。然而有時(shí)候這種表達(dá)也是相當(dāng)有用的。處理偏好值為空的數(shù)據(jù)(布爾偏好是并沒(méi)有關(guān)聯(lián)程度舉了例子一個(gè)根據(jù)用戶已閱讀內(nèi)容為用讀之外的其他什么事了。所以僅僅知道用戶和那些文章關(guān)聯(lián)了,而再也沒(méi),面對(duì)這樣的情形別無(wú)選擇。這里不會(huì)有偏好值。后續(xù)幾章將會(huì)依然提,丟掉用戶和項(xiàng)目之間的聯(lián)系很容易或者說(shuō)可以直接忽略偏好值就可以1034.5”圖3.4帶偏好值的數(shù)據(jù)(左)與布爾偏好數(shù)據(jù)(有)的區(qū)用Mahout的語(yǔ)言,沒(méi)有不帶偏好值的記錄就是布爾偏好,因?yàn)橐粋€(gè)關(guān)聯(lián)只什么時(shí)候應(yīng)該忽略偏好過(guò)(比如金屬音樂(lè)(Norwegiandeathmetal))。這樣只得到了他與15,和其余未知作家相比,這樣的偏好值是沒(méi)有什么意義的,以為二者在某種程度上是對(duì)等的。所以索性不要這個(gè)偏好值,僅僅你可能會(huì)說(shuō)這都是用戶的錯(cuò)難道他就不能為拉赫瑪尼諾夫打4分而為金屬打1分也以但你還是認(rèn)了吧因?yàn)槭聦?shí)上所需要輸入的數(shù)據(jù)是當(dāng)你要向他古典作曲家時(shí)該依據(jù)哪些數(shù)據(jù)呢?沒(méi)錯(cuò)在某領(lǐng)域中的好的解決方案一般不會(huì)公開(kāi)出來(lái)。布爾偏好在內(nèi)存中的數(shù)據(jù)表內(nèi)存像看我之前了解的在Mahout中需要用4個(gè)字節(jié)的浮點(diǎn)數(shù) 偏好值至少如果沒(méi)有偏好值也就意味著每一條會(huì)少用4個(gè)字節(jié)在內(nèi)存方面的測(cè)試424GenericDataModel好值。事實(shí)上,它僅僅用FastIDSets去一個(gè)用戶和項(xiàng)目的關(guān)聯(lián)。例如,只為每個(gè)用戶和他關(guān)聯(lián)的所有項(xiàng)目ID,這里不會(huì)再出現(xiàn)偏好值。因?yàn)镚enericBooleanPrefDataModel也是DataModel對(duì)象所以它完全可以GenericDataModel。一些數(shù)據(jù)模型的方法在這種實(shí)現(xiàn)下會(huì)變得快速高getPreferenceValue()在這里可以返回什么?因?yàn)檫@里不是沒(méi)有偏好值嗎?你調(diào)用該方法并不會(huì)拋出UnsupportedOperationException一個(gè)偏好值,它們必須從DataModel對(duì)象中獲取一個(gè)。這些而且固定的值讓在文章最后來(lái)觀察一下GroupLens例子的結(jié)果。下面是使用GenericBooleanPrefDataModel3.7用布爾偏好值創(chuàng)建和評(píng)估一個(gè)器DataModelmodelnewGenericBooleanPrefDataModel(newFileDataModel(newFile("ua.base"))));AmenderEvaluatorevaluator=new menderBuilder=new menderBuilder(){ mender(DataModelmodel)throwsTasteExceptionUserSimilaritysimilarity=newPearsonCorrelationSimilarity(model);UserNeighborhoodneighborhood=newNearestNUserNeighborhood(10,similarity,model);new mender(model,neighborhood,}DataModelBuildermodelBuilder=newDataModelBuilder(){publicDataModelbuildDataModel(FastByIDMap<PreferenceArray>trainingData){returnnewGenericBooleanPrefDataModel(GenericBooleanPrefDataModel.toDataMap(trainingData));B}doublescore=menderBuilder,modelBuilder,model,0.9,1.0);基于相同的數(shù)據(jù),使用建立一個(gè)DataMod

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論