今天是「30天學習30種新技術」的第4天。到目前爲止我很享受,並且周圍開發者反響也很不錯。我如今更有動力在30天內完成它了。在這篇文章中,我將介紹如何在Java下使用PredictionIO來簡單地構建一個博客推薦引擎。我沒找到太多在Java下使用PredictionIO的文檔。因此,本文對那些尋找在Java下使用PredictionIO的完整教程的人可能會有用。「30天學習30種新技術」系列文章的目錄能夠在這裏找到。javascript
PredictionIO是一個用Scala編寫的開源機器學習服務器應用,能夠幫助你方便地使用REST API搭建推薦引擎。它同時也提供了客戶端SDK,封裝了REST API。Java、Python、Ruby和PHP都有客戶端SDK。PredictionIO的核心使用Apache Mahout。Apache Mahout是一個可伸縮的機器學習庫,它提供衆多彙集、分類、過濾算法。Apache Mahout能夠在分佈式的Hapoop集羣上運行這些算法。html
做爲用戶,咱們不須要操心這些細節。咱們只需安裝PredictionIO而後使用它就是了。欲知詳情,請讀文檔。java
我決定學習PredictionIO是由於我想使用一個能夠幫助我加上機器學習功能的庫。PredictionIO有助於實施諸如推薦有意思的內容、發現類似內容之類的功能。python
在文檔中說起了不少安裝PredictionIO的方法。我使用Vagrant,這樣我就不會搞亂個人系統,同時不用本身配置全部的東西。git
下載適合你的操做系統的最新版的vagrant:http://downloads.vagrantup.com/github
下載並安裝 VirtualBox。 請參考 https://www.virtualbox.org/wiki/Downloadsweb
下載最新的包含 PredictionIO 的 vagrant包: https://github.com/PredictionIO/PredictionIO-Vagrant/releases算法
解壓縮 PredictionIO-x.x.x.zip
。其中包括了設置PredictionIO所須要的腳本。打開命令行終端,轉到PredictionIO-x.x.x目錄。apache
vagrant腳本將首先下載Ubuntu vagrant box,接着安裝依賴——MongoDB、Java、Hadoop和PredictionIO服務器。這很耗時間(取決於網速)。若是你所在的位置網絡不穩定,我建議你使用wget下載。wget命令支持斷點續傳。使用以下命令將precise64 box下載到適當的位置:segmentfault
wget -c http://files.vagrantup.com/precise64.box
等待下載完成以後,打開Vagrantfile
,修改config.vm.box_url
,指向下載目錄,例如:
config.vm.box_url = "/Users/shekhargulati/tools/vagrant/precise64.box"
如今只需vagrant up
就能夠開始安裝進程了。取決於你的網速,這會花一些時間。
接着咱們將按照文檔所言建立一個管理員帳戶 http://docs.prediction.io/current/installation/install-predictionio-with-virtualbox-vagrant.html#create-an-administrator-account
能夠經過 http://localhost:9000/ 訪問應用。閱讀如下文檔瞭解詳情 http://docs.prediction.io/current/installation/install-predictionio-with-virtualbox-vagrant.html#accessing-predictionio-server-vm-from-the-host-machine PredictionIO應用會要求你登陸。登陸以後,你會見到以下所見的面板。
做爲開始,咱們建立一個博客推薦應用。點擊「Add an App」按鈕,輸入應用名「blog-recommender」。
應用建立後,你能夠在以下所示的Applications
裏看到。
接着點擊Develop
,你將看到應用的詳情。重要的信息是App Key。你編寫應用的時候須要這個。
咱們正要實現的用例和亞馬遜的「購買此商品的顧客也同時購買」功能很類似。咱們要實現的是「瀏覽此博客的讀者也同時瀏覽」功能。
既然咱們已經建立了PredictionIO應用,那麼該是時候編寫咱們的Java應用了。咱們使用Eclipse來開發這個應用。我使用的是Eclipse Kepler,內建了m2eclipse集成。經過 文件 > 新建 > Maven項目 建立一個基於Maven的項目。選擇maven-archetype-quickstart
,而後輸入Maven項目的詳細信息。用下面的內容替換pom.xml
。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelversion> <groupId>com.shekhar</groupid> <artifactId>blog-recommender</artifactid> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>blog-recommender</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceencoding> </properties> <dependencies> <dependency> <groupId>io.prediction</groupid> <artifactId>client</artifactid> <version>0.6.1</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupid> <artifactId>maven-compiler-plugin</artifactid> <version>3.1</version> <configuration> <!-- http://maven.apache.org/plugins/maven-compiler-plugin/ --> <source>1.7</source> <target>1.7</target> </configuration> </plugin> </plugins> </build> </project>
上面的內容中值得注意的是PredictionIO Java API和Maven的依賴關係。
如今咱們將編寫一個類,在PredictionIO中插入數據。這個類是這樣子的。
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"); } }
上面展現的類主要作了這些事:
API_KEY
提供給它。userId
是必需要填上的。itemId
和itemType
。blog1
,...blog10
是itemId
,而javascript
、scala
等是itemType
。shekhar
瀏覽了blog1
、blog2
和blog4
,而用戶rahul
則瀏覽了blog1
、blog4
、blog6
和blog7
。將這個類做爲Java應用程序運行。它會在PredictionIO中插入記錄,你能夠經過查看面板來確認這一點。
既然數據已經插入了咱們的PredictionIO應用了,咱們須要在咱們的應用中添加引擎。點擊Add an Engine
按鈕。以下所示,選擇Item Similarity Engine
。
而後建立Item Similarity Engine
,輸入engine1
做爲名稱。
按下Create
按鈕以後Item Similarity Engine
就建立好了。如今你能夠改動一些配置,不過咱們將使用默認配置。進入Algorithms標籤,你會看到引擎還沒有運行。點擊Train Data Model Now
可運行引擎。
等上一段時間。數據模型訓練完成以後,你會看到狀態已經變成Running了。
咱們要解決的問題是基於用戶訪問過的博客向用戶推薦博客。在下面的代碼中,咱們獲取了對userId shekhar
而言 blog1
的類似項。
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(); } }
運行此Java程序,你會看到結果:blog4
、blog5
、blog6
和blog7
。
正如你在上面的例子中看到的,爲應用增長推薦功能很容易。我會在我將來的項目中使用PredictionIO,我也會花更多的時間學習和使用PredictionIO。
這就是今天的內容。請多多回饋。
原文 Day 4: PredictionIO--How to Build A Blog Recommender
翻譯 SegmentFault