实验简介

本次课程学习了Mahout 的 Bayes 分类算法。


一、实验环境说明

1. 环境登录

无需密码自动登录,系统用户名 shiyanlou

2. 环境介绍

本实验环境采用带桌面的Ubuntu Linux环境,实验中会用到桌面上的程序:

  • XfceTerminal: Linux 命令行终端,打开后会进入 Bash 环境,可以使用 Linux 命令;
  • Firefox:浏览器,可以用在需要前端界面的课程里,只需要打开环境里写的 HTML/JS 页面即可;
  • GVim:非常好用的编辑器,最简单的用法可以参考课程Vim编辑器
  • Eclipse:Eclipse 是著名的跨平台的自由集成开发环境(IDE)。主要用来 Java 语言开发,但是目前亦有人通过插件使其作为 C++ 和 Python 等语言的开发工具。

3. 环境使用

使用 GVim 编辑器输入实验所需的代码,然后使用 XfceTerminal 命令行环境进行编译运行,查看运行结果,运行后可以截图并分享自己的实验成果,实验楼提供的截图是后台截图,无法作弊,可以真实有效证明您已经完成了实验。

实验记录页面可以在“我的课程”中查看,其中含有每次实验的截图及笔记,以及每次实验的有效学习时间(指的是在实验桌面内操作的时间,如果没有操作,系统会记录为发呆时间)。这些都是您学习的真实性证明。

二、分类算法

为了让大家明白什么是聚类算法,这里我们同样引用一个例子。

假设在一个几岁的小孩面前摆放了一些水果,并告诉他 红色的圆的是苹果,而橘黄色的圆的是橘子。然后把这些水果拿开,再重新拿一个红色的圆的苹果问他是不是苹果。小孩回答是,这就是一个简单的分类算法过程。

在这个过程中,主要涉及两个阶段,第一是建立模型阶段,即告诉小孩哪种特征的是苹果这一个过程;第二就是使用模型的阶段,即询问小孩新的水果是不是苹果,小孩回答是,这一过程。

三、Bayes 分类算法

Bayes(贝叶斯) 分类算法是 Mahout 中的一种分类算法。Bayes 分类算法是一种基于统计的分类算法,用来预测某个样本属于某个分类的概率有多大。Bayes 分类算法是基于 Bayes 定理的分类算法。

Bayes 分类算法有很多变种。本次实验主要介绍 朴素 Bayes 分类算法。所为朴素,就是假设各个属性之间是相互独立的,它的思想基础是这样的:对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率哪个最大,就认为此待分类项属于哪个类别。

当针对大数据的应用时,Bayes 分类算法具有方法简单、准确率高和速度快的优势。但事实上,Bayes 分类算法也有它的缺点,就是 Bayes 定理假设一个属性值对给定类的影响独立于其他属性的值,而这个假设在实际情况中几乎是不成立的。因此其分类准确率可能会下降。朴素 Bayes 分类算法是一种监督学习算法,使用朴素Bayes 分类算法对文本进行分类,主要有两种模型:多项式模型(Multinomial Model)和伯努利模型(Bernoulli Model)。Mahout 中的朴素 Bayes 分类算法使用的是多项式模型,如果有兴趣深入研究,你可以前往 这里 查看具体的论文(英文稿)。

下面照例举个例子,来阐述 Bayes 分类算法。给定一组分类号的文本训练数据,如下图所示:

给定一个新的文档样本:“中国,中国,中国,东京,日本”,对该样本进行分类。该文本属性向量可以表示为 d=(中国,中国,中国,东京,日本),类别集合 Y={是,否}. 类别 “是”下共有8个单词,“否” 类别下共有3个单词。训练样本单词总数为 8+3=11. 因此 P(是)=8/11,P(否)=3/11.

类条件概率计算如下:

  • P(中国|是)=(5+1)/(8+6)=6/14=3/7
  • P(日本|是)=P(东京|是)=(0+1)/(8+6)=1/14
  • P(中国|否)=(1+1)/(3+6)=2/9
  • P(日本|否)=P(东京|否)=(1+1)/(3+6)=2/9

其中:

  • 分母中的8,表示 “是” 类别下训练样本的单词总数;
  • 6 表示训练样本有 “中国,北京,上海,澳门东京,日本” 共6个单词;
  • 3 表示 “否” 类别下共有3个单词。

有了以上的类条件概率计算结果,就可以开始计算后验概率了:

  • P(是|d)=(3/7)3×1/14×1/14×1/14×8/11=108/184877=0.00058417
  • P(否|d)=(2/9)3×2/9×2/9×3/11=32/216513=0.00014780

最后我们就可以得出结论:这个文档属于类别 中国,这就是 Mahout 中实现的 Bayes 分类算法的主要思想。

四、Bayes 分类算法应用实例

本次实验,依然通过一组具体的实例来给大家演示。

(1)在 /usr/local/hadoop-1.2.1 下新建一个测试目录,下载测试数据 20news-bydate.tar.gz 并解压(这个测试数据包含多个新闻组文档,这些文档内又分为了多个新闻组):

$ sudo mkdir bayes

$ cd bayes

$ sudo wget http://labfile.oss.aliyuncs.com/20news-bydate.tar.gz

$ sudo tar zxvf 20news-bydate.tar.gz

解压之后,它已经为我们划分好了训练集(Train)和测试集(Test)。我们只需要转换数据格式。

(2)使用 mahout seqdirectory 命令将目录下的所有样本文件转换成 <Text, Text> 格式的 SequenceFile. Mahout 会自动执行 Hadoop Map-Reduce 来进行处理,输出结果放到 20news-seq 目录中:

$ source /etc/profile

$ mahout seqdirectory -i 20news-bydate-train -o 20news-bydate-train-seq

$ mahout seqdirectory -i 20news-bydate-test -o 20news-bydate-test-seq

图示:正在执行 Map-Reduce 作业

(3)再使用 mahout seq2sparse 命令将生成的 SequenceFile 文件转换成 <Text, VectorWritable> 格式的向量文件,同样会执行 Hadoop Map-Reduce 来进行处理,输出结果放到 20news-vectors 目录中(命令较为复杂,执行前请确认是否输入正确):

$ mahout seq2sparse -i 20news-bydate-train-seq -o 20news-bydate-train-vectors -lnorm -nv -wt tfidf

$ mahout seq2sparse -i 20news-bydate-test-seq -o 20news-bydate-test-vectors -lnorm -nv -wt tfidf

图示:向量化执行完毕后部分输出内容

(4)数据格式转换完成后,我们就可以开始训练数据集了。

$ mahout trainnb -i 20news-bydate-train-vectors/tfidf-vectors -el -o model -li labelindex -ow

图示:训练完成后部分输出内容

(5)训练完成后,开始测试:

$ mahout testnb -i 20news-bydate-test-vectors/tfidf-vectors -m model -l labelindex -ow -o test-relust -c

图示:上面两张图为测试结果信息

(6)这里解释一下上面那个混合矩阵输出信息的意思:

上述 a 到 t 分别是代表了有20个类别,你可以在 train 或者 test 文件夹下看到这20个类别。列中的数据表示每个类别中被分配到的字节个数,classified 表示应该被分配到的总数。例如:

它表示 alt.atheis 本来是属于 a,有475篇文档被划为了a类,这个是正确的数据;其它的则依次表示划到 b~t 类中的数目。我们可以看到其准确率为 475/480=0.9895833··· , 可见其准确率是很高的。

同样,从 Summary 和 Statistics 统计信息,我们也可以看到结果的准确率和可靠性都是很高的。

作业

大家不妨在伪分布模式下的 Hadoop 和 Mahout 中, 再尝试运行 Bayes 分类算法实例。

Mahout 分类算法的更多相关文章

  1. mahout分类

    分类看起来比聚类和推荐麻烦多了 分类算法与聚类和推荐算法的不同:必须是有明确结果的,必须是有监督的,主要用于预测和检测 Mahout的优势 mahout的分类算法对资源的要求不会快于训练数据和测试数据 ...

  2. 神经网络、logistic回归等分类算法简单实现

    最近在github上看到一个很有趣的项目,通过文本训练可以让计算机写出特定风格的文章,有人就专门写了一个小项目生成汪峰风格的歌词.看完后有一些自己的小想法,也想做一个玩儿一玩儿.用到的原理是深度学习里 ...

  3. Mahout推荐算法API详解

    转载自:http://blog.fens.me/mahout-recommendation-api/ Hadoop家族系列文章,主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, ...

  4. Logistic回归分类算法原理分析与代码实现

    前言 本文将介绍机器学习分类算法中的Logistic回归分类算法并给出伪代码,Python代码实现. (说明:从本文开始,将接触到最优化算法相关的学习.旨在将这些最优化的算法用于训练出一个非线性的函数 ...

  5. [分类算法] :SVM支持向量机

    Support vector machines 支持向量机,简称SVM 分类算法的目的是学会一个分类函数或者分类模型(分类器),能够把数据库中的数据项映射给定类别中的某一个,从而可以预测未知类别. S ...

  6. K近邻分类算法实现 in Python

    K近邻(KNN):分类算法 * KNN是non-parametric分类器(不做分布形式的假设,直接从数据估计概率密度),是memory-based learning. * KNN不适用于高维数据(c ...

  7. mahout分类学习和遇到的问题总结

    这段时间学习Mahout有喜有悲.在这里首先感谢樊哲老师的指导.以下列出关于这次Mahout分类的学习和遇到的问题,还请大家多多提出建议:(全部文件操作都使用是在hdfs上边进行的). (本人用的环境 ...

  8. Mahout推荐算法基础

    转载自(http://www.geek521.com/?p=1423) Mahout推荐算法分为以下几大类 GenericUserBasedRecommender 算法: 1.基于用户的相似度 2.相 ...

  9. 算法杂货铺——分类算法之朴素贝叶斯分类(Naive Bayesian classification)

    算法杂货铺——分类算法之朴素贝叶斯分类(Naive Bayesian classification) 0.写在前面的话 我个人一直很喜欢算法一类的东西,在我看来算法是人类智慧的精华,其中蕴含着无与伦比 ...

随机推荐

  1. JAVA“找不到或无法加载主类” 问题的解决办法

    http://blog.csdn.net/l_ong211314/article/details/8004975

  2. reactjs中props和state最佳实践

    http://blog.csdn.net/dangnian/article/details/50998981

  3. 苹果 App Store 申请和管理相关知识

    本文转载至 http://blog.csdn.net/yu0089/article/details/8027669 app store为开发者提供四种类型的申请: 个人ios开发者计划$99/年 公司 ...

  4. golang build 编译规则

    文章来源: http://blog.csdn.net/varding/article/details/12675971 讲述了golang中的条件编译,摘要如下: 第一种条件编译的方法:编译标签 编译 ...

  5. Linux增加swap分区的方法

    在装完Linux系统之后,建立Swap分区有两种方法. 1.新建磁盘分区作为swap分区2.用文件作为swap分区 (操作更简单,我更常用) 一.新建磁盘分区作为swap分区 1. # swapoff ...

  6. Druid对数据库密码加密的坑

    背景: 在对已有项目搭建本地环境,修改了本地ip端口和数据库帐号密码(使用了明文). 然后项目一直跑不起来,还抛出各种异常,经过分析发现主要错在这里:druid java.lang.IllegalAr ...

  7. SpringMVC 之拦截器和异常处理

    1. 文件上传 Spring 使用 Jakarta Commons FileUpload 技术实现了一个 MultipartResolver 实现类: CommonsMultipartResolver ...

  8. JS改变HTML元素的绝对坐标

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DT ...

  9. python引入同一目录下的py文件

    python引入同一目录下的py文件 注意:python2和python3的包内import语法有区别,下面介绍一下python3的包内import语法 例如在admin.py文件中要引入dealco ...

  10. NPOI 操作office、word、excel

    下载地址为:http://npoi.codeplex.com/releases/view/616131 可以操作excel表,行,单元格内家及样式等.   使用示例:             usin ...