[译] 第四天: PredictionIO - 怎样创建博客推荐引擎_weixin_30855099的博客-程序员秘密

技术标签: python  java  人工智能  

前言

这是我30天学习30种技术挑战的第四天,到目前为止,我很享受这项挑战,也从程序员同行那里得到很好的反响。我会十分积极的去完成这30天的挑战。在这篇博客里,我会讲到怎样用PredictionIO来轻松创建博客推荐引擎。我没有找到太多关于Java使用PredictionIO的文档。所以,通过这篇博客,也许对要找PredictionIO Java端到端指导文档的人有用。完整的博客系列可以从这里看到。

什么是PredictionIO?

PredictionIO 是一个开源的机器学习服务器,用Scale语言开发。它提供了简单的方式使用REST API来创建推荐引擎,也提供客户端SDK,包含REST
API.
客户端SDKJava, Python, PHP都适用。PredictionIO核心使用Apache Mahout.Apache
Mahout
是一个可扩展的机器学习应用,提供各种聚类,分类,过滤算法,可以在分布式的Hapoop集群上运行这些算法。
 

作为用户,我们不用担心那些细节,只需安装PredictionIO来开始使用。想了解更多信息可以点击介绍

我为什么关注PredictionIO?

PredictionIO是因为我想使用能帮我添加机器学习能力的库。 PredictionIO有助于实现一些功能如为用户推荐有趣服务,发掘相似内容。

安装PredictionIO

在介绍里面有多种安装方式。我用的是Vagrant方式,避免让我弄坏机器环境,也不用自己去安装每一步。

  1. 下载最新的vagrant包,你可以从这里下载。
  2. 下载并安装VirtualBox, 参考 https://www.virtualbox.org/wiki/Downloads.
  3. 下载最新的PredictionIO      vagrant包,地址https://github.com/PredictionIO/PredictionIO-Vagrant/releases.
  4. 解压PredictionIO-x.x.x.zip,      包里包含安装PredictionIO所需要的脚本,打开命令器,设置路径到PredictionIO-x.x.x.

 

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的下载路径。

config.vm.box_url = "/Users/shekhargulati/tools/vagrant/precise64.box"

 

  1. 现在就等vagrant 自己安装,所花时间由你的网速而定。
  2. 接下来创建管理员账号,参考http://docs.prediction.io/current/installation/install-predictionio-with-virtualbox-vagrant.html#create-an-administrator-account.
  3. 服务程序会运行在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, 这是我们写这个程序必需的。

程序用例

我们这里使用的用例类似于亚马逊的功能“买了这个的用户同时也买了这些”。我们显示的是浏览了这篇博客的读者还浏览了这些博客。

Java开发博客推荐程序

我们已经创建了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>

从以上代码可以注意到MavenPredictionIO 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");
 
    }
 
}

这个类做了以下几点:

  1. 创建客户端实例。客户端类覆盖了PredictionIO REST      API. 我们需要提供PredictionIO博客推荐程序的API_KEY
  2. 接着我们用客户端实例创建了两个账号,这些账号在PredictionIO程序里,必填项只有 userId.
  3. 然后用客户端实例添加了10篇博客,这些博客也在PredictionIO程序里。创建的时候你只需传itemIditemType. itemId blog1,…blog10, itemTypejavascript,scala等。
  1. 然后我们对其进行了些操作,"shekhar"用户浏览了"blog1","blog2""blog4",      "rahul"用户浏览了"blog1","blog4", "blog6" ,           "blog7".
  2. 最后,关掉客户端。

 

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

转载于:https://www.cnblogs.com/endless-on/p/3473619.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30855099/article/details/94908296

智能推荐

无法读取 C:/Program Files/Oracle/Inventory/ContentsXML/comps.xml_灰帽DBA的博客-程序员秘密

无法读取 C:/Program Files/Oracle/Inventory/ContentsXML/comps.xml 今天一个同事问我一个问题,安装oracle时一直安装不下去,查看安装日之后 爆出一条信息正在设置值PROD_HOME 到 F:\oracle\ora92/oracle_rsf_ldap_rsf_cmp正在设置值PROD_HOME 到 F:\oracle\ora92

Mac安装Tableau Desktop 2019 for Mac中文版安装教程_mac tableau_麦克bookAPP的博客-程序员秘密

Tableau Desktop 2019 for Mac中文版安装教程 Tableau Desktop 2019中文版是一款非常好用且专业的数据分析工具,是处理和分析信息、报告和绘图的最强大工具之一,可让您轻松查看,分析和共享大量数据,它易于学习,便于使用,比现有的解决方案快出10到100 倍。 Tableau Desktop 基于突破性的技术,能够将数据图片转化为数据库查询。 利用视觉观察图案的天赋能力,识别趋势,在数秒内发现可视化的真知灼见。 无需向导,无需脚本,本次小编为大家带来的是Tableau

eclipse转Android studio遇到的那些坑_刘婶的博客-程序员秘密

公司项目有导入10多个libray,还有涉及ndk,转Android studio时碰到不少问题,前后大概花费5个工作日,中间各种奇葩bug,各种编译出错,很多还有没错误提示,一度想过放弃,如不是没有选择,可能真要放弃了,最后成功转型还是很值得的。现记录下遇到的问题,给有需要的人。1.解决:在manifest里面,某个activity下多写了一句intent-filter,里面没有

centos7编译hadoop2.7.3_魔鬼_的博客-程序员秘密

转自:http://www.cnblogs.com/duking1991/p/6104304.html 文中所需工具下载地址:http://download.csdn.net/detail/wzq6578702/9817101 1.工具准备,最靠谱的是hadoop说明文档里要求具备的那些工具。到hadoop官网,点击source下载hadoop-2.7.3-src.tar.gz。解压之tar -

Qt在windows平台下的消息循环——Qt进阶第二天_qt让话题循环发布一个消息_parkseyoung的博客-程序员秘密

一、背景万事开头难,前几天花了两天时间终于搭建好了Qt的源码调试环境,认识一个系统,最先要搞清楚的就是消息循环和事件分发机制,这是之后继续深入学习qt的前提,话不多说,直接开撸。二、代码走读1.QApplication相信任何人学习Qt的第一行代码就是QApplication,最后一行代码也是它。我坚信,这个类和消息循环关系匪浅。别急,我们先看看它的构造函数:Q_D这个宏是取private类(内部实现),赋值给变量d。进入init函数:可以看到初始化相下抛了,后面会一直抛到祖先类:QCore

vue封装组件总结_一只努力学飞的鱼的博客-程序员秘密

父组件引用子组件,设置props&lt;add tableName="mysql"/&gt;vue 子组件 初始化 created () { // 在组件初始化的时候执行,只执行一次 console.log( this.$data ); console.log( this ); }vue中子组件的method...

随便推点

MFC下的网络编程(1)CAsyncSocket进行无连接(UDP)通信_mfc 网络编程_薛123的博客-程序员秘密

MFC下的网络编程(1)CAsyncSocket进行无连接(UDP)通信 (2014-06-14 19:54:00)转载▼标签: it分类: VC服务器端发送数据给客户端先看服务器端:CAsyncSocket m_sockSend;                       //声

怎么给win10进行分区?_weixin_38168838的博客-程序员秘密

新安装的win10系统的朋友,对于win10系统分区不满意应该如何是好呢?今天给大家介绍两种win10系统分区的方法,一个是windows自带分区管理软件来操作;另一个就是简单方便的分区助手来帮助您进行win10系统分区的实现.方法一:windows10磁盘管理软件鼠标右击"计算机",选择"管理"标签;打开"计算机管理"窗口.选择"存储管理"打开"磁盘管理"页面右键单...

服务器对操作系统有什么要求,服务器对操作系统有什么要求_奥莉发的博客-程序员秘密

服务器对操作系统有什么要求 内容精选换一换查看用户的镜像类型,如果是公共镜像则排除私有镜像的源镜像问题。镜像类型单击“申请服务器”,查看能否创建出此镜像的弹性云服务器,申请完成后未出现此镜像对应的弹性云服务器,则此类镜像可能已经下线,属于老镜像。控制台不支持使用老镜像继续购买弹性云服务器,您需要将弹性云服务器的操作系统切换为当前在线的操作系统。提供预装操作系统、应用环境和各类软件的优质第三方镜像。...

Go基础系列:数据类型转换(strconv包)_weixin_34352449的博客-程序员秘密

Go不会对数据进行隐式的类型转换,只能手动去执行转换操作。简单的转换操作转换数据类型的方式很简单。valueOfTypeB = typeB(valueOfTypeA)例如:// 浮点数a := 5.0// 转换为int类型b := int(a)Go允许在底层结构相同的两个类型之间互转。例如:// IT类型的底层是int类型type IT int// a的类型为IT,底层...

EFI Shell 命令参考_obins_Iee的博客-程序员秘密

 对于使用使用DOS的人来说,会使用DOS命令是最基本的,而在当今即将盛行的EFI BIOS来说,就有了新的变化,如何操作EFI Shell 呢?至此我贴出了EFI Shell 的命令供大家学习。      EFI是Extensible Firmware Interface的缩写,是介于平台固件和操作系统之间的一层软件接口(及其详细规格说明文档)。EFI是Intel在1998年开始的一个项目演变而...

python如何导入函数_如何正确使用python的导入函数__import __()_王在甲的博客-程序员秘密

文档 H2&gt;__import__的文档是内置函数中最差的。__import__(...)__import__(name, globals=None, locals=None, fromlist=(), level=0) -&gt; moduleImport a module. Because this function is meant for use by the Pythoninterp...

推荐文章

热门文章

相关标签