這是我30天學習30種技術挑戰的第四天,到目前爲止,我很享受這項挑戰,也從程序員同行那裏獲得很好的反響。我會十分積極的去完成這30天的挑戰。在這篇博客裏,我會講到怎樣用PredictionIO來輕鬆建立博客推薦引擎。我沒有找到太多關於Java使用PredictionIO的文檔。因此,經過這篇博客,也許對要找PredictionIO Java端到端指導文檔的人有用。完整的博客系列能夠從這裏看到。javascript
PredictionIO 是一個開源的機器學習服務器,用Scale語言開發。它提供了簡單的方式使用REST API來建立推薦引擎,也提供客戶端SDK,包含REST
API. 客戶端SDK對Java, Python, PHP都適用。PredictionIO核心使用Apache Mahout.Apache
Mahout是一個可擴展的機器學習應用,提供各類聚類,分類,過濾算法,能夠在分佈式的Hapoop集羣上運行這些算法。
html
做爲用戶,咱們不用擔憂那些細節,只需安裝PredictionIO來開始使用。想了解更多信息能夠點擊介紹。java
學PredictionIO是由於我想使用能幫我添加機器學習能力的庫。 PredictionIO有助於實現一些功能如爲用戶推薦有趣服務,發掘類似內容。python
在介紹裏面有多種安裝方式。我用的是Vagrant方式,避免讓我弄壞機器環境,也不用本身去安裝每一步。git
Vagrant腳本首先會下載Ubuntu Vagrant Box, 而後安裝所需的 MongoDB, Java, Hadoop, 和PredictionIO服務器。可能會花挺長時間,視你的鏈接而定。若是你的網絡鏈接不穩定,建議你用wget下載Ubuntu, wget 支持斷點下載。下載precise64.程序員
wget -c http://files.vagrantup.com/precise64.box
下載完成後,打開Vagrantfile, 更改config.vm.box_url, 指向precise64.box的下載路徑。github
config.vm.box_url = "/Users/shekhargulati/tools/vagrant/precise64.box"
咱們即將開始建立博客推薦程序,點擊 Add an App 按鈕,輸入 blog-recommender.web
建立好後你能夠在Applications下看到以下顯示。算法
而後點擊 Develop, 你能夠看到詳細的程序信息,這裏的關鍵信息 App Key, 這是咱們寫這個程序必需的。apache
咱們這裏使用的用例相似於亞馬遜的功能「買了這個的用戶同時也買了這些」。咱們顯示的是瀏覽了這篇博客的讀者還瀏覽了這些博客。
咱們已經建立了PredictionIO,該寫Java程序了,用Eclipse來開發。我用的是Eclipse Kepler,集成了m2eclipse. 經過導航File>New>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>
從以上代碼能夠注意到Maven和PredictionIO Java API的依賴。
如今寫插入數據到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"); } }
這個類作了如下幾點:
用Java運行這個類,它會在PredictionIO程序裏插入數據,你能夠經過頁面看到記錄。
如今數據已經插入到PredictionIO程序,咱們須要添加引擎到咱們的程序,點擊 Add an Engine按鈕,選擇以下Item Similarity Engine.
而後輸入名字如"engine1" 建立Item Similarity Engine
點擊Create按鈕後,你就有了相似項引擎,如今你能夠修改配置了,不過咱們這裏使用的時候默認設置。到Algorithms頁面下,看到引擎沒有啓動,點擊"Train Data Model Now"來啓動。
等幾分鐘,數據模型啓動後你能夠看到狀態顯示Running.
這個用例咱們解決的是根據讀者瀏覽的博客,而後推薦博客。經過如下代碼,咱們能夠獲得全部和用戶"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".
從以上示例能夠看出,給程序添加推薦功能很簡單,我會在之後的項目中用到它,再多花些時間研究。
這是今天的內容,留下你的建議和意見吧!
原文:https://www.openshift.com/blogs/day-4-predictionio-how-to-build-a-blog-recommender