Mahout 简明教程

Mahout - Quick Guide

Mahout - Introduction

我们生活在一个信息无限丰富的时代。信息过载已达到如此高的程度,以至于有时管理我们的小小邮箱都变得困难!想象一下 Facebook、Twitter 和 Youtube 等一些流行网站必须每天收集和管理的数据和记录量。即使是鲜为人知的网站也会收到大量信息也不是什么新鲜事。

通常,我们会使用数据挖掘算法来分析大量数据以识别趋势并得出结论。但是,没有哪种数据挖掘算法能够高效地处理非常大型的数据集并快速提供结果,除非计算任务在分布在云端的多台机器上运行。

我们现在有了能够将计算任务分解成多个部分并让这些部分在不同机器上运行的新框架。 Mahout 就是这样的一个数据挖掘框架,通常与 Hadoop 基础设施结合在背景下运行,用于管理海量的数据。

What is Apache Mahout?

马豪特是训象者。名称源自其与使用大象作为其标志的 Apache Hadoop 的紧密关联。

Hadoop 是 Apache 的开源框架,它允许使用简单的编程模型在计算机集群的分布式环境中存储和处理大数据。

Apache Mahout 是一个开源项目,主要用于创建可扩展的机器学习算法。它实现了流行的机器学习技术,例如:

  1. Recommendation

  2. Classification

  3. Clustering

Apache Mahout 于 2008 年作为 Apache Lucene 的子项目启动。2010 年,Mahout 成为 Apache 的一个顶级项目。

Features of Mahout

以下列出了 Apache Mahout 的基本功能。

  1. Mahout 的算法基于 Hadoop 编写,因此在分布式环境中运行良好。Mahout 使用 Apache Hadoop 库在云中实现有效的扩展。

  2. Mahout 为程序员提供了一个现成可用的框架,用于对大量数据进行数据挖掘任务。

  3. Mahout 让应用程序能够有效且快速地分析大量数据集。

  4. 包括多个启用了 MapReduce 的聚类实现,例如 k-均值、模糊 k-均值、Canopy、Dirichlet 和 Mean-Shift。

  5. 支持分布式朴素贝叶斯和互补朴素贝叶斯分类实现。

  6. 附带进化式编程的分布式适应度函数功能。

  7. 包括矩阵和矢量库。

Applications of Mahout

  1. Adobe、Facebook、LinkedIn、Foursquare、Twitter 和 Yahoo 等公司在内部使用 Mahout。

  2. Foursquare 可以帮您找到某个特定区域中提供的场所、食物和娱乐场所。它使用 Mahout 的推荐引擎。

  3. Twitter 使用 Mahout 进行用户兴趣建模。

  4. Yahoo! 使用 Mahout 进行模式挖掘。

Mahout - Machine Learning

Apache Mahout 是一个高度可扩展的机器学习库,使开发人员能够使用经过优化的算法。Mahout 实现了流行的机器学习技术,例如推荐、分类和聚类。因此,在继续深入之前,有必要简要了解一下机器学习。

What is Machine Learning?

机器学习是计算机科学的一个分支,它通过编程系统的方式使其能够通过经验自动学习和改进。这里的学习是指识别和理解输入数据,并根据所提供的数据做出明智的决策。

根据所有可能的输入迎合所有决策非常困难。为了解决这个问题,开发了算法。这些算法根据特定的数据和过去经验以及统计学、概率论、逻辑学、组合优化、搜索、强化学习和控制论的原则来构建知识。

已开发的算法形成各种应用的基础,如:

  1. Vision processing

  2. Language processing

  3. 预测(例如股票市场趋势)

  4. Pattern recognition

  5. Games

  6. Data mining

  7. Expert systems

  8. Robotics

机器学习是一个广阔的领域,涵盖其所有功能超出了本教程的范围。有多种方法可用于实现机器学习技术,但最常用的方法是 supervisedunsupervised learning

Supervised Learning

监督学习涉及从可用的训练数据中学习函数。监督学习算法分析训练数据并生成一个推断函数,该函数可用于映射新示例。监督学习的常见示例包括:

  1. classifying e-mails as spam,

  2. 根据其内容对网页进行标记,以及

  3. voice recognition.

有许多监督学习算法,例神经网络、支持向量机 (SVM) 和朴素贝叶斯分类器。Mahout 实现了朴素贝叶斯分类器。

Unsupervised Learning

无监督学习可以理解未标记数据,而无需任何预定义的数据集进行训练。无监督学习是一种非常强大的工具,可用于分析可用数据并查找模式和趋势。它最常用于将相似的输入聚类到逻辑组中。无监督学习的常见方法包括:

  1. k-means

  2. self-organizing maps, and

  3. hierarchical clustering

Recommendation

推荐是一种流行的技术,它根据用户的购买记录、点击和评级等信息提供密切的建议。

  1. 亚马逊使用此技术来显示您可能感兴趣的推荐项目列表,该列表借鉴您过去的操作信息。亚马逊背后有一些推荐引擎,可以捕捉用户的行为,并根据您的早期操作推荐所选项目。

  2. Facebook 使用推荐技术来识别并推荐“您可能认识的人列表”。

recommendation

Classification

分类也称为 categorization ,是一种机器学习技术,该技术使用已知数据确定如何将新数据分类到一组现有类别中。分类是一种监督学习形式。

  1. 雅虎!和 Gmail 等邮件服务提供商使用此技术来决定是否将新邮件归类为垃圾邮件。分类算法通过分析用户将某些邮件标记为垃圾邮件的习惯来自我训练。基于此,分类器决定是否将将来的邮件发送到您的收件箱或垃圾邮件文件夹。

  2. iTunes 应用程序使用分类来创建播放列表。

classification

Clustering

聚类用于根据共同特征形成相似数据的组或群集。聚类是一种无监督学习形式。

  1. 谷歌和雅虎!等搜索引擎使用聚类技术对具有相似特征的数据进行分组。

  2. 新闻组使用聚类技术根据相关主题对各种文章进行分组。

聚类引擎会完全遍历输入数据,并根据数据的特征决定将其归入哪个群集中。请看以下示例。

clustering

我们的教程库中包含各种主题。我们收到 TutorialsPoint 中的新教程时,它将由聚类引擎进行处理,基于其内容决定将其分组到何处。

Mahout - Environment

本章将教你如何设置 Mahout。Java 和 Hadoop 是 Mahout 的先决条件。以下是下载并安装 Java、Hadoop 和 Mahout 的步骤。

Pre-Installation Setup

在将 Hadoop 安装到 Linux 环境之前,我们需要使用 ssh (安全外壳)设置 Linux。按照以下步骤设置 Linux 环境。

Creating a User

建议为 Hadoop 创建一个独立用户,以将 Hadoop 文件系统与 Unix 文件系统隔离。请按照以下步骤创建用户:

  1. 使用“su”命令打开 root。

使用 “useradd username” 命令从 root 帐户创建用户。
  1. 现在,您可以使用命令 “su username” 打开现有用户帐户。

  2. 打开 Linux 终端并输入以下命令以创建用户。

$ su
password:
# useradd hadoop
# passwd hadoop
New passwd:
Retype new passwd

SSH Setup and Key Generation

执行群集上的不同操作(如启动、停止和分布式守护程序 shell 操作)需要进行 SSH 设置。为了对 Hadoop 的不同用户进行身份验证,需要为 Hadoop 用户提供公钥/私钥对并将其与不同的用户共享。

以下命令用于使用 SSH 生成密钥值对,将公钥 id_rsa.pub 复制到 authorized_keys,并分别为 authorized_keys 文件提供所有者、读取和写入权限。

$ ssh-keygen -t rsa
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ chmod 0600 ~/.ssh/authorized_keys

Verifying ssh

ssh localhost

Installing Java

Java 是 Hadoop 和 HBase 的主要先决条件。首先,你应该使用 “java -version” 验证系统中是否存在 Java。Java version 命令的语法如下。

$ java -version

它应该生成以下输出。

java version "1.7.0_71"
Java(TM) SE Runtime Environment (build 1.7.0_71-b13)
Java HotSpot(TM) Client VM (build 25.0-b02, mixed mode)

如果你的系统中未安装 Java,请按照以下步骤安装 Java。

Step 1

访问以下链接下载 java (JDK <最新版本> - X64.tar.gz) : Oracle

然后 jdk-7u71-linux-x64.tar.gz is downloaded 到你的系统。

Step 2

通常情况下,你会在下载文件夹中找到下载的 Java 文件。使用以下命令验证并解压 jdk-7u71-linux-x64.gz 文件。

$ cd Downloads/
$ ls
jdk-7u71-linux-x64.gz
$ tar zxf jdk-7u71-linux-x64.gz
$ ls
jdk1.7.0_71 jdk-7u71-linux-x64.gz

Step 3

为了使所有用户可以使用 Java,你需要将其移动到 “/usr/local/”位置。打开 root,然后键入以下命令。

$ su
password:
# mv jdk1.7.0_71 /usr/local/
# exit

Step 4

要设置 PATHJAVA_HOME 变量,请将以下命令添加到 ~/.bashrc file 中。

export JAVA_HOME=/usr/local/jdk1.7.0_71
export PATH= $PATH:$JAVA_HOME/bin

现在,如上所述,从终端验证 java -version 命令。

Downloading Hadoop

安装 Java 后,你需要首先安装 Hadoop。使用如下所示的 “Hadoop version” 命令验证 Hadoop 的存在。

hadoop version

它应生成以下输出:

Hadoop 2.6.0
Compiled by jenkins on 2014-11-13T21:10Z
Compiled with protoc 2.5.0
From source with checksum 18e43357c8f927c0695f1e9522859d6a
This command was run using /home/hadoop/hadoop/share/hadoop/common/hadoopcommon-2.6.0.jar

如果你的系统无法找到 Hadoop,请下载 Hadoop 并安装在你的系统上。按照以下给出的命令操作。

使用以下命令从 Apache 软件基础下载并解压 hadoop-2.6.0。

$ su
password:
# cd /usr/local
# wget http://mirrors.advancedhosters.com/apache/hadoop/common/hadoop-
2.6.0/hadoop-2.6.0-src.tar.gz
# tar xzf hadoop-2.6.0-src.tar.gz
# mv hadoop-2.6.0/* hadoop/
# exit

Installing Hadoop

在任何必需的模式下安装 Hadoop。这里,我们正在以伪分布式模式演示 HBase 的功能,因此请以伪分布式模式安装 Hadoop。

按照下方给出的步骤将 Hadoop 2.4.1 安装在您的系统上。

Step 1: Setting up Hadoop

您可以通过将以下命令追加到 ~/.bashrc 文件来设置 Hadoop 环境变量。

export HADOOP_HOME=/usr/local/hadoop
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME

export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native

export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
export HADOOP_INSTALL=$HADOOP_HOME

现在,将所有更改应用于当前运行的系统。

$ source ~/.bashrc

Step 2: Hadoop Configuration

您可以在以下位置找到所有 Hadoop 配置文件:“$HADOOP_HOME/etc/hadoop”。根据 Hadoop 基础结构,需要对这些配置文件进行更改。

$ cd $HADOOP_HOME/etc/hadoop

为了在 Java 中开发 Hadoop 程序,您需要通过使用系统中 Java 的位置替换 JAVA_HOME 值在 hadoop-env.sh 文件中重置 Java 环境变量。

export JAVA_HOME=/usr/local/jdk1.7.0_71

以下是您必须编辑以配置 Hadoop 的文件列表。

core-site.xml

core-site.xml 文件包含诸如 Hadoop 实例使用的端口号、分配给文件系统、数据存储内存限制和读/写缓冲区大小等信息。

打开 core-site.xml 并将以下属性添加到 <configuration>、</configuration> 标记之间:

<configuration>
   <property>
      <name>fs.default.name</name>
      <value>hdfs://localhost:9000</value>
   </property>
</configuration>

hdfs-site.xm

hdfs-site.xml 文件包含有关复制数据的值、名称节点路径和本地文件系统的 DataNode 路径的信息。也就是说,您想将 Hadoop 基础架构存储在什么位置。

让我们假设以下数据:

dfs.replication (data replication value) = 1

(In the below given path /hadoop/ is the user name.
hadoopinfra/hdfs/namenode is the directory created by hdfs file system.)
namenode path = //home/hadoop/hadoopinfra/hdfs/namenode

(hadoopinfra/hdfs/datanode is the directory created by hdfs file system.)
datanode path = //home/hadoop/hadoopinfra/hdfs/datanode

打开此文件,并在此文件中在 <configuration>、</configuration> 标记之间添加以下属性。

<configuration>
   <property>
      <name>dfs.replication</name>
      <value>1</value>
   </property>

   <property>
      <name>dfs.name.dir</name>
      <value>file:///home/hadoop/hadoopinfra/hdfs/namenode</value>
   </property>

   <property>
      <name>dfs.data.dir</name>
      <value>file:///home/hadoop/hadoopinfra/hdfs/datanode</value>
   </property>
</configuration>

Note: 在上述文件中,所有属性值都是用户定义的。您可以根据自己的 Hadoop 基础结构进行更改。

mapred-site.xml

此文件用于将 yarn 配置到 Hadoop 中。打开 mapred-site.xml 文件,并在此文件的 <configuration>、</configuration> 标记之间添加以下属性。

<configuration>
   <property>
      <name>yarn.nodemanager.aux-services</name>
      <value>mapreduce_shuffle</value>
   </property>
</configuration>

mapred-site.xml

此文件用于指定我们正在使用的哪个 MapReduce 框架。默认情况下,Hadoop 包含 mapred-site.xml 的模板。首先,需要使用以下命令将文件从 mapred-site.xml.template 复制到 mapred-site.xml 文件。

$ cp mapred-site.xml.template mapred-site.xml

打开 mapred-site.xml 文件,并在此文件中的 <configuration>、</configuration> 标记之间添加以下属性。

<configuration>
   <property>
      <name>mapreduce.framework.name</name>
      <value>yarn</value>
   </property>
</configuration>

Verifying Hadoop Installation

以下步骤用于验证 Hadoop 安装。

Step 1: Name Node Setup

使用命令 “hdfs namenode -format” 设置名称节点,如下所示:

$ cd ~
$ hdfs namenode -format

预期结果如下:

10/24/14 21:30:55 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG: host = localhost/192.168.1.11
STARTUP_MSG: args = [-format]
STARTUP_MSG: version = 2.4.1
...
...
10/24/14 21:30:56 INFO common.Storage: Storage directory
/home/hadoop/hadoopinfra/hdfs/namenode has been successfully formatted.
10/24/14 21:30:56 INFO namenode.NNStorageRetentionManager: Going to retain
1 images with txid >= 0
10/24/14 21:30:56 INFO util.ExitUtil: Exiting with status 0
10/24/14 21:30:56 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at localhost/192.168.1.11
************************************************************/

Step 2: Verifying Hadoop dfs

以下命令用于启动 dfs。此命令将启动您的 Hadoop 文件系统。

$ start-dfs.sh

预期的输出如下:

10/24/14 21:37:56
Starting namenodes on [localhost]
localhost: starting namenode, logging to /home/hadoop/hadoop-
2.4.1/logs/hadoop-hadoop-namenode-localhost.out
localhost: starting datanode, logging to /home/hadoop/hadoop-
2.4.1/logs/hadoop-hadoop-datanode-localhost.out
Starting secondary namenodes [0.0.0.0]

Step 3: Verifying Yarn Script

以下命令用于启动 yarn 脚本。执行此命令将启动您的 yarn 守护程序。

$ start-yarn.sh

预期的输出如下:

starting yarn daemons
starting resource manager, logging to /home/hadoop/hadoop-2.4.1/logs/yarn-
hadoop-resourcemanager-localhost.out
localhost: starting node manager, logging to /home/hadoop/hadoop-
2.4.1/logs/yarn-hadoop-nodemanager-localhost.out

Step 4: Accessing Hadoop on Browser

访问 Hadoop 的默认端口号为 50070。使用以下 URL 在您的浏览器上获取 Hadoop 服务。

http://localhost:50070/
accessing hadoop

Step 5: Verify All Applications for Cluster

访问集群的所有应用程序的默认端口号为 8088。使用以下 URL 访问此服务。

http://localhost:8088/
applications for cluster

Downloading Mahout

可以在网站 Mahout 中找到 Mahout。从网站中提供的链接下载 Mahout。以下是网站的屏幕截图。

downloading mahout

Step 1

使用以下命令从链接 https://mahout.apache.org/general/downloads 下载 Apache mahout。

[Hadoop@localhost ~]$ wget
http://mirror.nexcess.net/apache/mahout/0.9/mahout-distribution-0.9.tar.gz

然后 mahout-distribution-0.9.tar.gz 将在您的系统中下载。

Step2

浏览 mahout-distribution-0.9.tar.gz 存储的文件夹,并按如下所示提取下载的 jar 文件。

[Hadoop@localhost ~]$ tar zxvf mahout-distribution-0.9.tar.gz

Maven Repository

以下是使用 Eclipse 构建 Apache Mahout 的 pom.xml。

<dependency>
   <groupId>org.apache.mahout</groupId>
   <artifactId>mahout-core</artifactId>
   <version>0.9</version>
</dependency>

<dependency>
   <groupId>org.apache.mahout</groupId>
   <artifactId>mahout-math</artifactId>
   <version>${mahout.version}</version>
</dependency>

<dependency>
   <groupId>org.apache.mahout</groupId>
   <artifactId>mahout-integration</artifactId>
   <version>${mahout.version}</version>
</dependency>

Mahout - Recommendation

本章涵盖了流行的机器学习技术 recommendation, 、其机制,以及如何编写实现 Mahout 推荐的应用程序。

Recommendation

您是否曾想过亚马逊如何想出推荐的一系列商品,以此吸引您注意您可能感兴趣的特定产品!

假设您想从亚马逊购买“Mahout in Action”这本书:

mahout in action

除了所选产品,亚马逊还显示了一系列相关推荐商品,如下所示。

items

此类推荐列表借助于 recommender engines 生成。Mahout 提供了几种类型的推荐引擎,例如:

  1. user-based recommenders,

  2. item-based recommenders, and

  3. several other algorithms.

Mahout Recommender Engine

Mahout 拥有一个非分布式、非基于 Hadoop 的推荐引擎。您应该传递一个包含用户对商品首选项的文本文档。此引擎的输出将是特定用户对其他商品的估计首选项。

Example

考虑一个销售消费商品(例如手机、小工具及其配件)的网站。如果我们希望在这样一个网站中实现 Mahout 的功能,那么我们可以构建一个推荐引擎。此引擎会分析过去用户的购买数据,然后基于其推荐新产品。

Mahout 提供的构建推荐引擎的组件如下:

  1. DataModel

  2. UserSimilarity

  3. ItemSimilarity

  4. UserNeighborhood

  5. Recommender

从数据存储,准备数据模型并将其作为输入传递给推荐引擎。推荐引擎为特定用户生成推荐。以下是推荐引擎的架构。

Architecture of Recommender Engine

recommender engine

Building a Recommender using Mahout

以下是开发一个简单推荐引擎的步骤:

Step1: Create DataModel Object

PearsonCorrelationSimilarity 类的构造函数需要一个数据模型对象,该对象包含一个文件,其中包含产品的用户、商品和首选项详细信息。以下为数据模型文件示例:

1,00,1.0
1,01,2.0
1,02,5.0
1,03,5.0
1,04,5.0

2,00,1.0
2,01,2.0
2,05,5.0
2,06,4.5
2,02,5.0

3,01,2.5
3,02,5.0
3,03,4.0
3,04,3.0

4,00,5.0
4,01,5.0
4,02,5.0
4,03,0.0

DataModel 对象需要文件对象,其中包含输入文件的路径。如下所示,创建 DataModel 对象。

DataModel datamodel = new FileDataModel(new File("input file"));

Step2: Create UserSimilarity Object

使用 PearsonCorrelationSimilarity 如下所示创建 UserSimilarity 对象:

UserSimilarity similarity = new PearsonCorrelationSimilarity(datamodel);

Step3: Create UserNeighborhood object

此对象计算用户相对于给定用户的“邻域”。有两种类型的邻域:

  1. NearestNUserNeighborhood - 此类计算一个包含给定用户最近 n 个用户的邻域。“最近”由给定的 UserSimilarity 定义。

  2. ThresholdUserNeighborhood - 类计算了所有与给定用户相似度满足或超过特定阈值的用户的邻域。相似度由给定的 UserSimilarity 定义。

这里我们使用 ThresholdUserNeighborhood 并将偏好限制设置为 3.0。

UserNeighborhood neighborhood = new ThresholdUserNeighborhood(3.0, similarity, model);

Step4: Create Recommender Object

创建 UserbasedRecomender 对象。将上述创建的所有对象传递给它的构造函数,如下所示。

UserBasedRecommender recommender = new GenericUserBasedRecommender(model, neighborhood, similarity);

Step5: Recommend Items to a User

使用 Recommender 界面的 recommend() 方法向用户推荐产品。该方法需要两个参数。第一个表示要向其发送推荐的用户 ID,第二个表示要发送的推荐数。以下是 recommender() 方法的使用方法:

List<RecommendedItem> recommendations = recommender.recommend(2, 3);

for (RecommendedItem recommendation : recommendations) {
   System.out.println(recommendation);
 }

Example Program

下面是一个设置推荐的示例程序。为用户 ID 为 2 的用户准备推荐。

import java.io.File;
import java.util.List;

import org.apache.mahout.cf.taste.impl.model.file.FileDataModel;
import org.apache.mahout.cf.taste.impl.neighborhood.ThresholdUserNeighborhood;
import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender;
import org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity;
import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood;
import org.apache.mahout.cf.taste.recommender.RecommendedItem;
import org.apache.mahout.cf.taste.recommender.UserBasedRecommender;
import org.apache.mahout.cf.taste.similarity.UserSimilarity;

public class Recommender {
   public static void main(String args[]){
      try{
         //Creating data model
         DataModel datamodel = new FileDataModel(new File("data")); //data

         //Creating UserSimilarity object.
         UserSimilarity usersimilarity = new PearsonCorrelationSimilarity(datamodel);

         //Creating UserNeighbourHHood object.
         UserNeighborhood userneighborhood = new ThresholdUserNeighborhood(3.0, usersimilarity, datamodel);

         //Create UserRecomender
         UserBasedRecommender recommender = new GenericUserBasedRecommender(datamodel, userneighborhood, usersimilarity);

         List<RecommendedItem> recommendations = recommender.recommend(2, 3);

         for (RecommendedItem recommendation : recommendations) {
            System.out.println(recommendation);
         }

      }catch(Exception e){}

   }
  }

使用以下命令编译程序:

javac Recommender.java
java Recommender

它应生成以下输出:

RecommendedItem [item:3, value:4.5]
RecommendedItem [item:4, value:4.0]

Mahout - Clustering

聚类是对给定集合的元素或项目按项目之间的相似度组织到组中的过程。例如,与在线新闻发布相关的应用程序使用聚类对新闻文章进行分组。

Applications of Clustering

  1. 聚类广泛用于许多应用程序,例如市场研究、模式识别、数据分析和图像处理。

  2. 聚类可以帮助营销人员在他们的客户群中发现不同的群体。他们可以根据购买模式来表征他们的客户群体。

  3. 在生物学领域,它可以用来推导出动植物分类法,对具有相似功能的基因进行分类,并深入了解种群中固有的结构。

  4. 聚类有助于在地球观测数据库中识别类似土地利用的区域。

  5. 聚类还有助于对网络上的文档进行分类以发现信息。

  6. 聚类用于离群点检测应用程序,例如信用卡欺诈检测。

  7. 作为一种数据挖掘功能,聚类分析用作获取数据分布的见解以观察每个簇的特征的工具。

使用 Mahout,我们可以对给定的数据集进行聚类。所需步骤如下:

  1. Algorithm 您需要选择一个合适的聚类算法来对簇的元素进行分组。

  2. Similarity and Dissimilarity 您需要有一条规则来验证新遇到的元素与组中的元素之间的相似性。

  3. Stopping Condition 需要一个停止条件来定义无需聚类的地方。

Procedure of Clustering

若要对给定数据进行聚类,您需要 -

  1. 启动 Hadoop 服务器。创建必要的目录以将文件存储在 Hadoop 文件系统中。(在树冠的情况下,为输入文件、序列文件和聚类输出创建目录)。

  2. 将输入文件从 Unix 文件系统复制到 Hadoop 文件系统。

  3. 从输入数据准备序列文件。

  4. 运行任何可用的聚类算法。

  5. Get the clustered data.

Starting Hadoop

Mahout 与 Hadoop 配合工作,因此请确保 Hadoop 服务器已经启动并正在运行。

$ cd HADOOP_HOME/bin
$ start-all.sh

Preparing Input File Directories

使用以下命令在 Hadoop 文件系统中创建目录,以存储输入文件、序列文件和聚类数据:

$ hadoop fs -p mkdir /mahout_data
$ hadoop fs -p mkdir /clustered_data
$ hadoop fs -p mkdir /mahout_seq

您可以在以下 URL 中使用hadoop web 界面验证目录是否已被创建 - http://localhost:50070/

它会向您提供如下所示的输出:

input files directories

Copying Input File to HDFS

现在,将输入数据文件从 Linux 文件系统复制到 Hadoop 文件系统中 的 mahout_data 目录,如下所示。假设您的输入文件是 mydata.txt,并且它位于 /home/Hadoop/data/ 目录中。

$ hadoop fs -put /home/Hadoop/data/mydata.txt /mahout_data/

Preparing the Sequence File

Mahout 为您提供了一个实用程序,用于将给定的输入文件转换成序列文件格式。此实用程序需要两个参数。

  1. 原数据所在输入文件目录。

  2. 聚类数据要存储在其中的输出文件目录。

下面给出了 mahout seqdirectory 实用程序的帮助提示。

Step 1: 浏览至 Mahout 主目录。您可以如下所示获得该实用程序的帮助:

[Hadoop@localhost bin]$ ./mahout seqdirectory --help
Job-Specific Options:
--input (-i) input Path to job input directory.
--output (-o) output The directory pathname for output.
--overwrite (-ow) If present, overwrite the output directory

使用以下语法使用该实用程序生成序列文件:

mahout seqdirectory -i <input file path> -o <output directory>

Example

mahout seqdirectory
-i hdfs://localhost:9000/mahout_seq/
-o hdfs://localhost:9000/clustered_data/

Clustering Algorithms

Mahout 支持两种用于聚类的主要算法,即:

  1. Canopy clustering

  2. K-means clustering

Canopy Clustering

树冠聚类是一种简单快速的算法,Mahout 用于聚类目的。对象将被视为平面空间中的点。该算法经常用作其他聚类算法(如 k 均值聚类)中的初始步骤。您可以使用下列语法运行树冠作业:

mahout canopy -i <input vectors directory>
-o <output directory>
-t1 <threshold value 1>
-t2 <threshold value 2>

树冠作业需要一个包含序列文件的输入文件目录,以及一个将聚类数据存储在其中的输出目录。

Example

mahout canopy -i hdfs://localhost:9000/mahout_seq/mydata.seq
-o hdfs://localhost:9000/clustered_data
-t1 20
-t2 30

您可以在给定的输出目录中获取所生成的集群数据。

K-means Clustering

K-means 聚类是一种重要的聚类算法。K-means 聚类算法中的 k 表示将数据划分为的簇的数目。例如,为该算法指定 k 值为 3 时,该算法将把数据划分为 3 个簇。

每个对象将在空间中表示为向量。最初将由算法随机选择 k 个点并将其视为中心,最接近每个中心的每个对象会被聚类。有几种算法用于距离测量,用户应选择所需的一种。

Creating Vector Files

  1. 与 Canopy 算法不同,k-means 算法需要向量文件作为输入,所以您必须创建向量文件。

  2. 为了从序列文件格式生成向量文件,Mahout 提供 seq2parse 实用程序。

下面列出了 seq2parse 实用程序的一些选项。使用这些选项创建向量文件。

$MAHOUT_HOME/bin/mahout seq2sparse
--analyzerName (-a) analyzerName  The class name of the analyzer
--chunkSize (-chunk) chunkSize    The chunkSize in MegaBytes.
--output (-o) output              The directory pathname for o/p
--input (-i) input                Path to job input directory.

创建向量后,使用 k-means 算法。运行 k-means 作业的语法如下:

mahout kmeans -i <input vectors directory>
-c  <input clusters directory>
-o  <output working directory>
-dm <Distance Measure technique>
-x  <maximum number of iterations>
-k  <number of initial clusters>

K-means 聚类作业需要输入向量目录、输出簇目录、距离度量、要执行的最大迭代数和表示将输入数据划分为的簇数目的整数值。

Mahout - Classification

What is Classification?

分类是一种机器学习技术,它使用已知数据来确定如何将新数据归类到一组现有类别中。例如,

  1. iTunes 应用程序使用分类来创建播放列表。

  2. 雅虎!和 Gmail 等邮件服务提供商使用此技术来决定是否将新邮件归类为垃圾邮件。分类算法通过分析用户将某些邮件标记为垃圾邮件的习惯来自我训练。基于此,分类器决定是否将将来的邮件发送到您的收件箱或垃圾邮件文件夹。

How Classification Works

在对给定一组数据进行分类时,分类器系统执行以下操作:

  1. 最初,使用任何一种学习算法准备一个新的数据模型。

  2. 然后测试准备好的数据模型。

  3. 然后,使用该数据模型评估新数据并确定其类别。

classification works

Applications of Classification

  1. Credit card fraud detection - 分类机制用于预测信用卡欺诈。通过使用以前的诈骗历史信息,该分类器可以预测哪些未来交易可能会变成诈骗。

  2. Spam e-mails - 根据以前垃圾邮件的特征,该分类器确定新收到的电子邮件是否应发送到垃圾邮件文件夹。

Naive Bayes Classifier

Mahout 使用朴素贝叶斯分类器算法。它使用两种实现:

  1. Distributed Naive Bayes classification

  2. Complementary Naive Bayes classification

朴素贝叶斯是一种构建分类器的简单技术。它不是训练此类分类器的单个算法,而是一系列算法。贝叶斯分类器构建模型以分类问题实例。这些分类是使用可用数据进行的。

朴素贝叶斯的一个优点是它只需要少量训练数据来估算分类所需的特征。

对于某些类型的概率模型,朴素贝叶斯分类器能在受监督的学习设置中非常有效地进行训练。

尽管其假设过于简化,但朴素贝叶斯分类器在许多复杂的实际情况中运行良好。

Procedure of Classification

以下步骤用于实现分类:

  1. Generate example data

  2. 从数据创建序列文件

  3. 将序列文件转换为向量

  4. Train the vectors

  5. Test the vectors

Step1: Generate Example Data

生成或下载要分类的数据。例如,您可以从以下链接获取 20 newsgroups 示例数据: http://people.csail.mit.edu/jrennie/20Newsgroups/20news-bydate.tar.gz

创建一个目录来存储输入数据。按照如下所示下载示例。

$ mkdir classification_example
$ cd classification_example
$tar xzvf 20news-bydate.tar.gz
wget http://people.csail.mit.edu/jrennie/20Newsgroups/20news-bydate.tar.gz

Step 2: Create Sequence Files

使用 seqdirectory 实用工具从示例创建序列文件。生成序列的语法如下:

mahout seqdirectory -i <input file path> -o <output directory>

Step 3: Convert Sequence Files to Vectors

使用 seq2parse 实用工具从序列文件创建向量文件。 seq2parse 实用工具的选项如下:

$MAHOUT_HOME/bin/mahout seq2sparse
--analyzerName (-a) analyzerName  The class name of the analyzer
--chunkSize (-chunk) chunkSize    The chunkSize in MegaBytes.
--output (-o) output              The directory pathname for o/p
--input (-i) input                Path to job input directory.

Step 4: Train the Vectors

使用 trainnb 实用工具训练生成向量。使用 trainnb 实用工具的选项如下:

mahout trainnb
 -i ${PATH_TO_TFIDF_VECTORS}
 -el
 -o ${PATH_TO_MODEL}/model
 -li ${PATH_TO_MODEL}/labelindex
 -ow
 -c

Step 5: Test the Vectors

使用 testnb 实用工具测试向量。使用 testnb 实用工具的选项如下:

mahout testnb
 -i ${PATH_TO_TFIDF_TEST_VECTORS}
 -m ${PATH_TO_MODEL}/model
 -l ${PATH_TO_MODEL}/labelindex
 -ow
 -o ${PATH_TO_OUTPUT}
 -c
 -seq