Apache Mahout基础

介绍

简介

Mahout,象夫,驱使大象的人。 Apache开源框架,主要用于创建可伸缩的机器学习算法,实现了流行的机器学习技术。 实现了如下几个流行机器学习算法:

  • Recommendation:推荐算法
  • Classification:分类算法
  • Clustering:聚类算法(Canopy聚类算法、K-means聚类算法)

特性

  • 在Hadoop上运行,也可以在Spark上运行。
  • 在大型数据集上进行数据挖掘。
  • 快速高效分析大数据。
  • 包含了如下的一些聚类算法(K-means、fuzzy k-means、Canopy、Dirichlet、Mean-Shift)
  • 贝叶斯和朴素贝叶斯分类算法。
  • 包括矩阵和向量库。

基本概念

机器学习

介绍

是一个科学分支,主要是自动学习以及提升经验值。
学习意味着识别和理解输入数据,以及基于这些数据做出正确的决策。

实现方式

实现机器学习的方式 案例 算法 说明
监督学习(Supervised Learning) - 分类垃圾邮件
- 基于内容的网页标签化
- 语音识别
- 神经网络
- 支持向量机
- 朴素贝叶斯分类器(mahout实现了该算法)
从可用的训练数据集中进行学习,产生推断函数,并应用到新的案例上。
非监督学习(UnSupervised Learning) - - K-mean
- self-organizing maps
- 等级聚类
使用未标签化的数据,没有做任何预定义处理。对于分析可用数据以及查找模式和趋势是极其强大的工具。

聚类

介绍

基于数据的一些共性,形成若干组和相关数据集,是非监督学习的一种形式。 新闻组使用聚类技术,基于相关主题,对各种文章进行分组。 聚类引擎对数据进行遍历,最终决定数据分配到哪个组下。

Mahout实现的主要聚类算法

Mahout实现的主要聚类算法 说明 适用场景
Canopy聚类算法 简单快速的聚类技术,将对象视为平面空间中的点。 其它聚类手段的初始过程
K-means聚类算法 相对简单但是广为人知的聚类算法
K是指数据被分成多少份
一般聚类问题
Fuzzy K-Means K-means的扩展,是一种比较简单且流行的聚类算法。
相比于K-means聚类方法用于发现严格的聚类中心(即一个数据点只属于一个聚类中心),Fuzzy K-Means聚类方法用于发现松散的聚类中心(即一个数据点可能只属于几个聚类中心)。
Mean Shift 最开始应用于图像平滑、图像分割和跟踪方面,在1995年一篇重要的文献发表以后,Mean Shift才被大家所了解。
Mean Shfit算法比较吸引人的地方是该算法不需要提前知道要聚类的类别数(K-Means算法就需要),并且该算法形成的聚类形状是任意的且与要聚类的数据是相关的。
-
Spectral Spectral算法相对于K-Means算法来说更加有效和专业化,它是处理图像谱分类的一种有效的算法,主要针对的数据也是图像数据。 图谱分类
Minhash Minhas算法只负责将原始内容尽量均匀随机地映射为一个签名值,原理上相当于伪随机数产生算法。
对于传统hash算法产生的两个签名,如果相等,说明原始内容在一定概率下是相等的;如果不相等,除了说明原始内容不相等外,不再提供任何信息,因为即使原始内容只相差一个字节,所产生的签名也很可能差别极大。
从这个意义上来说,要设计一个hash算法,使相似的内容产生的签名也相近,是更为艰难的任务,因为它的签名值除了提供原始内容是否相等的信息外,还能额外提供不相等的原始内容的差异度的信息。
-
Top Down 它首先寻找比较大的聚类中心,然后对这些中心进行细粒度分类。 -

使用Mahout的canopy算法进行聚类

1
2
3
4
5
6
7
8
9
10
# 语法
# mahout canopy -i <input vectors directory>
# -o <output directory>
# -t1 <threshold value 1>
# -t2 <threshold value 2>
# 示例
$ mahout canopy -i hdfs://localhost:9000/mahout_seq/mydata.seq
-o hdfs://localhost:9000/clustered_data
-t1 20
-t2 30

使用Mahout的K-mean算法进行聚类

1
2
3
4
5
6
7
8
9
# 语法
# 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(初始聚类数量)>
# 示例
$ mahout kmeans -i hdfs://s100:8020/user/ubuntu/mahout/cluster/tfidf-vectors/part-r-00000 -o hdfs://s100:8020/user/ubuntu/mahout/kmeans ......

分类

介绍

预先定义好一些类别,对新数据进行处理,判断其隶属于哪个类别,是监督学习的一种形式。 垃圾邮件分类是一个典型应用。

分类算法

Mahout实现的主要分类算法 说明 适用场景
Logistic Regression 利用预测变量(预测变量可以是数值型,也可以是离散型)来预测事件出现概率的模型 - 生产欺诈检测
- 广告质量估计
- 定位产品预测
Bayesian(贝叶斯) 在Mahout中,目前已经有两种实现的贝叶斯分类器了:
- 朴素贝叶斯算法
- 互补性朴素贝叶斯算法
通常,事件A在时间B发生的条件下的概率,与事件B在事件A发生的条件下的概率是不一样的。
然而,这两者是有确定的关系,贝叶斯(Bayesian)定理就是这种关系的陈述。
通过练习事件A与事件B,计算从一个事件产生另一事件的概率,即从结果上溯源。
-
Support Vector Machine(支持向量机) 属于一般化线性分类器,也可以认为是提克罗夫规范化(Tikhonov Regularization)方法的一个特例。
这种分类器的特点是它能够同时最小化经验误差与最大化几何边缘区,因此支持向量机也成为最大边缘区分类器
-
Random Forests(随机森林) 一个包含多个决策树的分类器,并且其输出的类别由个别树输出的类别的众数而定。
这里的众数是指个别树输出允许重复最多的一个类别数值。随机森林算法在决策树的基础上发展而来,继承了决策树的优点,同时弱化了决策树的缺点。
-
Hidden Markov Models(隐马尔科夫模型) 一个包含两个随机变量O和Y(O和Y可以按照顺序改变它们自身的状态)的分析模型。
其中变量Y是隐含变量,包含{y_1、...、y_n}个状态,其状态不能被直接检测出来。变量Y的状态按照一定的顺序改变,其状态改变的概率只与当前状态有关而不随时间改变。
变量O成为可观察变量,包含{o_1、...、o_m}个状态,其状态可以被直接检测出来。
变量O的状态与当前变量Y的状态有关。
机器学习
- 语音识别
- 手写识别
- 自然语言处理

Mahout推荐引擎

介绍

Mahout有一个非分布式、非基于hadoop的推荐引擎,可以输入一个文本,输出推荐商品列表。

类型

类型 说明
基于用户推荐器
基于商品推荐器
其它 -

构建推荐引擎的组件

标题 说明
DataModel 数据模型
UserSimilarity 用户相似度
取值:-1 到 1
ItemSimilarity 商品相似度
UserNeighborhood 用户近邻
Recommender 推荐器

使用Mahout构建推荐器

准备数据文件(data.txt)

格式:用户ID,物品ID,偏好值 示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
1,101,5.0
1,102,3.0
1,103,2.5

2,101,2.0
2,102,2.5
2,103,5.0
2,104,2.0

3,101,2.5
3,104,4.0
3,105,4.5

4,101,5.0
4,103,3.0
4,104,4.5

5,101,4.0
5,102,3.0
5,103,2.0
5,104,4.0

也可以是.csv文件。

程序示例

1
2
3
4
5
6
7
8
9
10
11
12
13
//通过文件创建数据模型
DataModel datamodel = new FileDataModel(new File"data.txt");
//创建用户相似度对象
UserSimilarity similarity = new PearsonCorrelationSimilarity(datamodel);
//创建用户近邻
UserNeighborhood neighborhood = new ThresholdUserNeighborhood(3.0,similarity,model);
//创建推荐器对象
UserBasedRecommender recommender = new GenericUserBasedRecommender(model,neighborhood,similarity);
//推荐商品给用户(给2号用户推荐3个商品)
List<RecommendedItem> recommendations = recommender.recomend(2,3);
for(RecommendedItem recommendation:recommendations){
System.out.println(recommendation);
}

常见算法

算法 说明
kmean 均值(平均数)
y=(x1+x2+..+xn)/n
median 中位数(排序后位于中间的数值)
- x1 < x2< x3
result=x2
- x1 < x2 < x3 < x4
result=(x2+x3)/2
mode 众数(出现次数最多的数值)
range 极差(最大值和最小值之间的差)
|max-min|
variance 方差(一组数和指定数之间差的平方和的平均数)
((X1-X)2+(X2-X)2+...+(Xn-X)2)/n
standard deviation 标准差
方差的平方根
skewness 偏度(数据在均值两侧的偏差程度)
- 对称分布:skewness=0,mean = media =mode
- 左偏分布:skewness<0,mean < media < mode
- 右偏分布:skewness>0,mean > media > mode
Kertosis 峰度(曲线平滑或凸起的程度)
- Kertosis =3 正太分布
- Kertosis > 3
- Kertosis < 3

常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 转换文件data.txt成序列文件(mapreduce)
$ mahout seqdirectory -i hdfs://s100:8020/user/ubuntu/mahout/input -o hdfs://s100:8020/user/ubuntu/mahout/seq

# 查看生成seq文件
$ hdfs dfs -text hdfs://s100:8020/user/ubuntu/mahout/seq/

# 将序列文件转换成向量文件
$ mahout seq2sparse -i -o

# 生成输出目录以及文件
$ hdfs dfs -lsr mahout

# 使用Mahout的canopy算法进行聚类
$ mahout canopy -i hdfs://localhost:9000/mahout_seq/mydata.seq
-o hdfs://localhost:9000/clustered_data

# 使用Mahout的K-mean算法进行聚类
$

运维

安装(CentOS)

安装jdk+hadoop

下载Mahout

配置环境变量

坚持原创技术分享,您的支持将鼓励我继续创作!
0%