摘要:是什么是一個(gè)用編寫的開源機(jī)器學(xué)習(xí)服務(wù)器應(yīng)用,可以幫助你方便地使用搭建推薦引擎。是一個(gè)可伸縮的機(jī)器學(xué)習(xí)庫(kù),它提供眾多聚集分類過濾算法。我為什么要關(guān)心我決定學(xué)習(xí)是因?yàn)槲蚁胧褂靡粋€(gè)可以幫助我加上機(jī)器學(xué)習(xí)功能的庫(kù)。
編者注:我們發(fā)現(xiàn)了比較有趣的系列文章《30天學(xué)習(xí)30種新技術(shù)》,準(zhǔn)備翻譯,一天一篇更新,年終禮包。下面是第四天的內(nèi)容。
今天是“30天學(xué)習(xí)30種新技術(shù)”的第4天。到目前為止我很享受,而且周圍開發(fā)者反響也很不錯(cuò)。我現(xiàn)在更有動(dòng)力在30天內(nèi)完成它了。在這篇文章中,我將介紹如何在Java下使用PredictionIO來簡(jiǎn)單地構(gòu)建一個(gè)博客推薦引擎。我沒找到太多在Java下使用PredictionIO的文檔。所以,本文對(duì)那些尋找在Java下使用PredictionIO的完整教程的人可能會(huì)有用?!?0天學(xué)習(xí)30種新技術(shù)”系列文章的目錄可以在這里找到。
PredictionIO是什么?PredictionIO是一個(gè)用Scala編寫的開源機(jī)器學(xué)習(xí)服務(wù)器應(yīng)用,可以幫助你方便地使用REST API搭建推薦引擎。它同時(shí)也提供了客戶端SDK,封裝了REST API。Java、Python、Ruby和PHP都有客戶端SDK。PredictionIO的核心使用Apache Mahout。Apache Mahout是一個(gè)可伸縮的機(jī)器學(xué)習(xí)庫(kù),它提供眾多聚集、分類、過濾算法。Apache Mahout可以在分布式的Hapoop集群上運(yùn)行這些算法。
作為用戶,我們不需要操心這些細(xì)節(jié)。我們只需安裝PredictionIO然后使用它就是了。欲知詳情,請(qǐng)讀文檔。
我為什么要關(guān)心PredictionIO?我決定學(xué)習(xí)PredictionIO是因?yàn)槲蚁胧褂靡粋€(gè)可以幫助我加上機(jī)器學(xué)習(xí)功能的庫(kù)。PredictionIO有助于實(shí)施諸如推薦有意思的內(nèi)容、發(fā)現(xiàn)相似內(nèi)容之類的功能。
安裝PredictionIO在文檔中提及了很多安裝PredictionIO的方法。我使用Vagrant,這樣我就不會(huì)搞亂我的系統(tǒng),同時(shí)不用自己配置所有的東西。
下載適合你的操作系統(tǒng)的最新版的vagrant:http://downloads.vagrantup.com/
下載并安裝 VirtualBox。 請(qǐng)參考 https://www.virtualbox.org/wiki/Downloads
下載最新的包含 PredictionIO 的 vagrant包: https://github.com/PredictionIO/PredictionIO-Vagrant/releases
解壓縮 PredictionIO-x.x.x.zip。其中包括了設(shè)置PredictionIO所需要的腳本。打開命令行終端,轉(zhuǎn)到PredictionIO-x.x.x目錄。
vagrant腳本將首先下載Ubuntu vagrant box,接著安裝依賴——MongoDB、Java、Hadoop和PredictionIO服務(wù)器。這很耗時(shí)間(取決于網(wǎng)速)。如果你所在的位置網(wǎng)絡(luò)不穩(wěn)定,我建議你使用wget下載。wget命令支持?jǐn)帱c(diǎn)續(xù)傳。使用如下命令將precise64 box下載到適當(dāng)?shù)奈恢茫?/p>
wget -c http://files.vagrantup.com/precise64.box
等待下載完成之后,打開Vagrantfile,修改config.vm.box_url,指向下載目錄,例如:
config.vm.box_url = "/Users/shekhargulati/tools/vagrant/precise64.box"
現(xiàn)在只需vagrant up就可以開始安裝進(jìn)程了。取決于你的網(wǎng)速,這會(huì)花一些時(shí)間。
接著我們將按照文檔所言創(chuàng)建一個(gè)管理員賬戶 http://docs.prediction.io/current/installation/install-predictionio-with-virtualbox-vagrant.html#create-an-administrator-account
可以通過 http://localhost:9000/ 訪問應(yīng)用。閱讀以下文檔了解詳情 http://docs.prediction.io/current/installation/install-predictionio-with-virtualbox-vagrant.html#accessing-predictionio-server-vm-from-the-host-machine PredictionIO應(yīng)用會(huì)要求你登錄。登錄之后,你會(huì)見到如下所見的面板。
創(chuàng)建PredictionIO應(yīng)用作為開始,我們創(chuàng)建一個(gè)博客推薦應(yīng)用。點(diǎn)擊“Add an App”按鈕,輸入應(yīng)用名“blog-recommender”。
應(yīng)用創(chuàng)建后,你可以在如下所示的Applications里看到。
接著點(diǎn)擊Develop,你將看到應(yīng)用的詳情。重要的信息是App Key。你編寫應(yīng)用的時(shí)候需要這個(gè)。
應(yīng)用案例我們正要實(shí)現(xiàn)的用例和亞馬遜的“購(gòu)買此商品的顧客也同時(shí)購(gòu)買”功能很相似。我們要實(shí)現(xiàn)的是“瀏覽此博客的讀者也同時(shí)瀏覽”功能。
開發(fā)博客推薦的Java應(yīng)用既然我們已經(jīng)創(chuàng)建了PredictionIO應(yīng)用,那么該是時(shí)候編寫我們的Java應(yīng)用了。我們使用Eclipse來開發(fā)這個(gè)應(yīng)用。我使用的是Eclipse Kepler,內(nèi)建了m2eclipse集成。通過 文件 > 新建 > Maven項(xiàng)目 創(chuàng)建一個(gè)基于Maven的項(xiàng)目。選擇maven-archetype-quickstart,然后輸入Maven項(xiàng)目的詳細(xì)信息。用下面的內(nèi)容替換pom.xml。
4.0.0 com.shekhar blog-recommender 0.0.1-SNAPSHOT jar blog-recommender http://maven.apache.org UTF-8 io.prediction client 0.6.1 org.apache.maven.plugins maven-compiler-plugin 3.1 1.7
上面的內(nèi)容中值得注意的是PredictionIO Java API和Maven的依賴關(guān)系。
現(xiàn)在我們將編寫一個(gè)類,在PredictionIO中插入數(shù)據(jù)。這個(gè)類是這樣子的。
package com.shekhar.blog_recommender; import io.prediction.Client; import io.prediction.CreateItemRequestBuilder; public class BlogDataInserter { private static final String API_KEY = "wwoTLn0FR7vH6k51Op8KbU1z4tqeFGZyvBpSgafOaSSe40WqdMf90lEncOA0SB13"; public static void main(String[] args) throws Exception { Client client = new Client(API_KEY); addUsers(client); addBlogs(client); userItemViews(client); client.close(); } private static void addUsers(Client client) throws Exception { String[] users = { "shekhar", "rahul"}; for (String user : users) { System.out.println("Added User " + user); client.createUser(user); } } private static void addBlogs(Client client) throws Exception { CreateItemRequestBuilder blog1 = client.getCreateItemRequestBuilder("blog1", new String[]{"machine-learning"}); client.createItem(blog1); CreateItemRequestBuilder blog2 = client.getCreateItemRequestBuilder("blog2", new String[]{"javascript"}); client.createItem(blog2); CreateItemRequestBuilder blog3 = client.getCreateItemRequestBuilder("blog3", new String[]{"scala"}); client.createItem(blog3); CreateItemRequestBuilder blog4 = client.getCreateItemRequestBuilder("blog4", new String[]{"artificial-intelligence"}); client.createItem(blog4); CreateItemRequestBuilder blog5 = client.getCreateItemRequestBuilder("blog5", new String[]{"statistics"}); client.createItem(blog5); CreateItemRequestBuilder blog6 = client.getCreateItemRequestBuilder("blog6", new String[]{"python"}); client.createItem(blog6); CreateItemRequestBuilder blog7 = client.getCreateItemRequestBuilder("blog7", new String[]{"web-development"}); client.createItem(blog7); CreateItemRequestBuilder blog8 = client.getCreateItemRequestBuilder("blog8", new String[]{"security"}); client.createItem(blog8); CreateItemRequestBuilder blog9 = client.getCreateItemRequestBuilder("blog9", new String[]{"ruby"}); client.createItem(blog9); CreateItemRequestBuilder blog10 = client.getCreateItemRequestBuilder("blog10", new String[]{"openshift"}); client.createItem(blog10); } private static void userItemViews(Client client) throws Exception { client.identify("shekhar"); client.userActionItem("view","blog1"); client.userActionItem("view","blog4"); client.userActionItem("view","blog5"); client.identify("rahul"); client.userActionItem("view","blog1"); client.userActionItem("view","blog4"); client.userActionItem("view","blog6"); client.userActionItem("view","blog7"); } }
上面展示的類主要做了這些事:
我們創(chuàng)建了一個(gè)Client類的實(shí)例。Client類封裝了PredictionIO的REST API。我們需要將PredictionIO博客推薦應(yīng)用的 API_KEY 提供給它。
接著我們利用Client實(shí)例創(chuàng)建了兩個(gè)用戶。這兩個(gè)用戶在PredictionIO應(yīng)用中創(chuàng)建。只有userId是必須要填上的。
在此之后我們利用Clinet實(shí)例添加了10個(gè)博客。博客同樣在PredictionIO應(yīng)用中創(chuàng)建。當(dāng)創(chuàng)建一項(xiàng)事物的時(shí)候,你只需傳遞兩樣?xùn)|西——itemId和itemType。blog1,...blog10是itemId,而javascript、scala等是itemType。
然后我們對(duì)創(chuàng)建的事物施加一些行動(dòng)。用戶shekhar瀏覽了blog1、blog2和blog4,而用戶rahul則瀏覽了blog1、blog4、blog6和blog7。
最后,我們關(guān)閉了cilent實(shí)例。
將這個(gè)類作為Java應(yīng)用程序運(yùn)行。它會(huì)在PredictionIO中插入記錄,你可以通過查看面板來確認(rèn)這一點(diǎn)。
既然數(shù)據(jù)已經(jīng)插入了我們的PredictionIO應(yīng)用了,我們需要在我們的應(yīng)用中添加引擎。點(diǎn)擊Add an Engine按鈕。如下所示,選擇Item Similarity Engine。
然后創(chuàng)建Item Similarity Engine,輸入engine1作為名稱。
按下Create按鈕之后Item Similarity Engine就創(chuàng)建好了?,F(xiàn)在你可以改動(dòng)一些配置,不過我們將使用默認(rèn)配置。進(jìn)入Algorithms標(biāo)簽,你會(huì)看到引擎尚未運(yùn)行。點(diǎn)擊Train Data Model Now可運(yùn)行引擎。
等上一段時(shí)間。數(shù)據(jù)模型訓(xùn)練完成之后,你會(huì)看到狀態(tài)已經(jīng)變成Running了。
我們要解決的問題是基于用戶訪問過的博客向用戶推薦博客。在下面的代碼中,我們獲取了對(duì)userId shekhar 而言 blog1 的相似項(xiàng)。
import io.prediction.Client; import java.util.Arrays; public class BlogrRecommender { public static void main(String[] args) throws Exception { Client client = new Client("wwoTLn0FR7vH6k51Op8KbU1z4tqeFGZyvBpSgafOaSSe40WqdMf90lEncOA0SB13"); client.identify("shekhar"); String[] recommendedItems = client.getItemSimTopN("engine1", "blog1", 5); System.out.println(String.format("User %s is recommended %s", "shekhar", Arrays.toString(recommendedItems))); client.close(); } }
運(yùn)行此Java程序,你會(huì)看到結(jié)果:blog4、blog5、blog6和blog7。
正如你在上面的例子中看到的,為應(yīng)用增加推薦功能很容易。我會(huì)在我未來的項(xiàng)目中使用PredictionIO,我也會(huì)花更多的時(shí)間學(xué)習(xí)和使用PredictionIO。
這就是今天的內(nèi)容。請(qǐng)多多回饋。
原文 Day 4: PredictionIO--How to Build A Blog Recommender
翻譯 SegmentFault
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/63997.html
摘要:合并日期和時(shí)間這個(gè)復(fù)合類名叫,是和的合體。截至目前,我們介紹的這些日期時(shí)間對(duì)象都是不可修改的,這是為了更好地支持函數(shù)式編程,確保線程安全,保持領(lǐng)域模式一致性而做出的重大設(shè)計(jì)決定。 新的日期和時(shí)間API Java的API提供了很多有用的組件,能幫助你構(gòu)建復(fù)雜的應(yīng)用。不過,Java API也不總是完美的。我們相信大多數(shù)有經(jīng)驗(yàn)的程序員都會(huì)贊同Java 8之前的庫(kù)對(duì)日期和時(shí)間的支持就非常不理想...
摘要:派生選擇器依據(jù)元素的位置關(guān)系來定義樣式。稱其為上下文選擇器,稱其為派生選擇器。在現(xiàn)在布局中,選擇器常常用于建立派生選擇器。和一樣,也可被用作派生選擇器。 文章大綱來源:【Day 3】HTML復(fù)習(xí) + CSS基礎(chǔ) 初識(shí)CSS 入門CSS 初識(shí)CSS 層疊樣式表(Cascading Style Sheets),即前端常說的CSS。 內(nèi)容引用:CSS 簡(jiǎn)介 樣式解決了什么問題? HTML...
摘要:派生選擇器依據(jù)元素的位置關(guān)系來定義樣式。稱其為上下文選擇器,稱其為派生選擇器。在現(xiàn)在布局中,選擇器常常用于建立派生選擇器。和一樣,也可被用作派生選擇器。 文章大綱來源:【Day 3】HTML復(fù)習(xí) + CSS基礎(chǔ) 初識(shí)CSS 入門CSS 初識(shí)CSS 層疊樣式表(Cascading Style Sheets),即前端常說的CSS。 內(nèi)容引用:CSS 簡(jiǎn)介 樣式解決了什么問題? HTML...
閱讀 2078·2023-04-25 17:48
閱讀 3590·2021-09-22 15:37
閱讀 2941·2021-09-22 15:36
閱讀 6007·2021-09-22 15:06
閱讀 1644·2019-08-30 15:53
閱讀 1431·2019-08-30 15:52
閱讀 716·2019-08-30 13:48
閱讀 1126·2019-08-30 12:44