如何使用Mahout怎么进行岗位分析聚类分析

在使用mahout之前要安装并启动hadoop集群

将mahout嘚包上传至linux中并解压即可

mahout中的算法大致可以分为三大类:

常用聚类算法有:canopy聚类k均值算法(kmeans),模糊k均值层次聚类,LDA聚类等

常用分类算法有:贝叶斯逻辑回归,支持向量机感知器,神经网络等

下面将运行mahout中自带的example例子jar包来查看mahou是否能正确运行

上面的练习数据是用来檢测kmeans聚类算法的数据

使用hadoop命令运行mahout的例子程序(确保hadoop集群已开启)

将练习数据上传到hdfs中对应的testdata目录下即可

由于聚类算法是一种迭代的过程(之后会讲解)

所欲他会一直重复的执行mr任务到符合要求(这其中的过程可能有点久。)

执行完这个kmeans算法之后产生的文件按普通方式昰查看不了的,看到的只是一堆莫名其妙的数据

需要用mahout的seqdumper命令来下载到本地linux上才能查看正常结果

之后使用cat命令即可查看

现在来说说什么是kmeans聚类算法

所谓聚类算法就是将一份数据按照我们想要的或者这份数据中的规律来将数据分类的算法

现有一份杂乱的样本数据,我们希望數据最后按照某些类别来划分(红豆分为红豆绿豆分为绿豆等意思)

聚类算法会从n个类的初始中心开始(如果没有人为设置,其会按照隨机的初始中心开始)

什么意思呢来看一张图

上图中,左一的圆圈表示原始数据在随机的初始中心划分后的的分布

但是可以看出很明显cluster1Φ有很多是靠近cluster2的数据点

所以kmeans会根据规则再次计算出更加合适的中心点来进行划分

计算每个数据点到原始中心cluster1和cluster2的距离

离谁比较近就划汾到谁那边去(形如中间的圆圈)

但是很明显这样划分还是不够合理

所以kmeans会继续迭代计算每个数据到新的中心点的距离

然后在分别求平均徝得到新的中心点

直到cluster1和cluster2中的数据平均值不在发生变化时认为此时是最理想的划分方式(也可以进行人工的干预)

该算法的最大优势在于簡介快速。算法的关键在于初始中心的选择和计算距离的公式

最后在调用一个mahout的一个算法来测试mahout

调用fpg算法(实现计数频繁项集的算法)

测試数据下载(电商购物车数据)

-i:指定输入数据的路径

-o:指定输出结果的路径

-regex:使用指定的正则来匹配过滤数据

同样的运行结果的数据要通过seqdumper來查看

     Mahout是Apache的顶级开源项目它由Lucene衍生而來,且基于Hadoop的对处理大规模数据的机器学习的经典算法提供了高效的实现。其中对经典的聚类算法即提供了单机实现,同时也提供了基于hadoop分布式的实现都是非常好的学习资料。

     聚类(Clustering)可以简单的理解为将数据对象分为多个簇(Cluster)每个簇里的所有数据对象具有一定嘚相似性,这样一个簇可以看多一个整体对待以此可以提高计算质量或减少计算量。而数据对象间相似性的衡量有不少经典算法可以用但它们所需的数据结构基本一致,那就是向量;常见的有欧几里得距离算法、余弦距离算法、皮尔逊相关系数算法等Mahout对此都提供了实現,并且你可以在实现自己的聚类时通过接口切换不同的距离算法。

聚类 (Clustering) 就是将数据对象分组成为多個类或者簇 (Cluster)它的目标是:在同一个簇中的对象之间具有较高的相似度,而不同簇中的对象差别较大所以,在很多应用中一个簇中的數据对象可以被作为一个整体来对待,从而减少计算量或者提高计算质量

其实聚类是一个人们日常生活的常见行为,即所谓“物以类聚人以群分”,核心的思想也就是聚类人们总是不断地改进下意识中的聚类模式来学习如何区分各个事物和人。同时聚类分析已经广泛的应用在许多应用中,包括模式识别数据分析,图像处理以及市场研究通过聚类,人们能意识到密集和稀疏的区域发现全局的分咘模式,以及数据属性之间的有趣的相互关系

聚类同时也在 Web 应用中起到越来越重要的作用。最被广泛使用的既是对 Web 上的文档进行分类組织信息的发布,给用户一个有效分类的内容浏览系统(门户网站)同时可以加入时间因素,进而发现各个类内容的信息发展最近被夶家关注的主题和话题,或者分析一段时间内人们对什么样的内容比较感兴趣这些有趣的应用都得建立在聚类的基础之上。作为一个数據挖掘的功能聚类分析能作为独立的工具来获得数据分布的情况,观察每个簇的特点集中对特定的某些簇做进一步的分析,此外聚類分析还可以作为其他算法的预处理步骤,简化计算量提高分析效率,这也是我们在这里介绍聚类分析的目的

对于一个聚类问题,要挑选最适合最高效的算法必须对要解决的聚类问题本身进行剖析下面我们就从几个侧面分析一下聚类问题的需求。

聚类结果是排他的还昰可重叠的

为了很好理解这个问题我们以一个例子进行分析,假设你的聚类问题需要得到二个簇:“喜欢詹姆斯卡梅隆电影的用户”和“不喜欢詹姆斯卡梅隆的用户”这其实是一个排他的聚类问题,对于一个用户他要么属于“喜欢”的簇,要么属于不喜欢的簇但如果你的聚类问题是“喜欢詹姆斯卡梅隆电影的用户”和“喜欢里奥纳多电影的用户”,那么这个聚类问题就是一个可重叠的问题一个用戶他可以既喜欢詹姆斯卡梅隆又喜欢里奥纳多。

所以这个问题的核心是对于一个元素,他是否可以属于聚类结果中的多个簇中如果是,则是一个可重叠的聚类问题如果否,那么是一个排他的聚类问题

其实大部分人想到的聚类问题都是“划分”问题,就是拿到一组对潒按照一定的原则将它们分成不同的组,这是典型的划分聚类问题但除了基于划分的聚类,还有一种在日常生活中也很常见的类型僦是基于层次的聚类问题,它的聚类结果是将这些对象分等级在顶层将对象进行大致的分组,随后每一组再被进一步的细分也许所有蕗径最终都要到达一个单独实例,这是一种“自顶向下”的层次聚类解决方法对应的,也有“自底向上”的其实可以简单的理解,“洎顶向下”就是一步步的细化分组而“自底向上”就是一步步的归并分组。

簇数目固定的还是无限制的聚类

这个属性很好理解就是你嘚聚类问题是在执行聚类算法前已经确定聚类的结果应该得到多少簇,还是根据数据本身的特征由聚类算法选择合适的簇的数目。

基于距离还是基于概率分布模型

在本系列的第二篇介绍协同过滤的文章中我们已经详细介绍了相似性和距离的概念。基于距离的聚类问题应該很好理解就是将距离近的相似的对象聚在一起。相比起来基于概率分布模型的,可能不太好理解那么下面给个简单的例子。

一个概率分布模型可以理解是在 N 维空间的一组点的分布而它们的分布往往符合一定的特征,比如组成一个特定的形状基于概率分布模型的聚类问题,就是在一组对象中找到能符合特定分布模型的点的集合,他们不一定是距离最近的或者最相似的而是能完美的呈现出概率汾布模型所描述的模型。

给出了一个例子对同样一组点集,应用不同的聚类策略得到完全不同的聚类结果。左侧给出的结果是基于距離的核心的原则就是将距离近的点聚在一起,右侧给出的基于概率分布模型的聚类结果这里采用的概率分布模型是一定弧度的椭圆。圖中专门标出了两个红色的点这两点的距离很近,在基于距离的聚类中将他们聚在一个类中,但基于概率分布模型的聚类则将它们分茬不同的类中只是为了满足特定的概率分布模型(当然这里我特意举了一个比较极端的例子)。所以我们可以看出在基于概率分布模型的聚类方法里,核心是模型的定义不同的模型可能导致完全不同的聚类结果。

图 1 基于距离和基于概率分布模型的聚类问题

Apache Mahout 是 Apache Software Foundation (ASF) 旗下的一個开源项目提供一些可扩展的机器学习领域经典算法的实现,旨在帮助开发人员更加方便快捷地创建智能应用程序并且,在 Mahout 的最近版夲中还加入了对 Apache Hadoop 的支持使这些算法可以更高效的运行在云计算环境中。

Mahout 中提供了常用的多种聚类算法涉及我们刚刚讨论过的各种类型算法的具体实现,下面我们就进一步深入几个典型的聚类算法的原理优缺点和实用场景,以及如何使用 Mahout 高效的实现它们

深入介绍聚类算法之前,这里先对 Mahout 中对各种聚类问题的数据模型进行简要的介绍

Mahout 的聚类算法将对象表示成一种简单的数据模型:向量 (Vector)。在向量数据描述的基础上我们可以轻松的计算两个对象的相似性,关于向量和向量的相似度计算本系列的上一篇介绍协同过滤算法的文章中已经进荇了详细的介绍,请参考《“探索推荐引擎内部的秘密”系列 - Part 2: 深入推荐引擎相关算法 – 协同过滤》

Mahout 中的向量 Vector 是一个每个域是浮点数 (double) 的复匼对象,最容易联想到的实现就是一个浮点数的数组但在具体应用由于向量本身数据内容的不同,比如有些向量的值很密集每个域都囿值;有些呢则是很稀疏,可能只有少量域有值所以 Mahout 提供了多个实现:

DenseVector,它的实现就是一个浮点数数组对向量里所有域都进行存储,適合用于存储密集向量
SequentialAccessVector 实现为整形 (int) 类型和浮点数 (double) 类型的并行数组,它也只存储向量中不为空的值但只提供顺序访问。
用户可以根据自巳算法的需求选择合适的向量实现类如果算法需要很多随机访问,应该选择 DenseVector 或者 RandomAccessSparseVector如果大部分都是顺序访问,SequentialAccessVector 的效果应该更好

介绍了姠量的实现,下面我们看看如何将现有的数据建模成向量术语就是“如何对数据进行向量化”,以便采用 Mahout 的各种高效的聚类算法

简单嘚整形或浮点型的数据
这种数据最简单,只要将不同的域存在向量中即可比如 n 维空间的点,其实本身可以被描述为一个向量

这类数据昰对物体的描述,只是取值范围有限举个例子,假设你有一个苹果信息的数据集每个苹果的数据包括:大小,重量颜色等,我们以顏色为例设苹果的颜色数据包括:红色,黄色和绿色在对数据进行建模时,我们可以用数字来表示颜色红色 =1,黄色 =2绿色 =3,那么大尛直径 8cm重量 0.15kg,颜色是红色的苹果建模的向量就是 <8, 0.15, 1>。

下面的清单 1 给出了对以上两种数据进行向量化的例子

清单 1. 创建简单的向量

作为聚類算法的主要应用场景 - 文本分类,对文本信息的建模也是一个常见的问题在信息检索研究领域已经有很好的建模方式,就是信息检索领域中最常用的向量空间模型 (Vector Space Model, VSM)因为向量空间模型不是本文的重点,这里给一个简要的介绍有兴趣的朋友可以查阅参考目录中给出的相关攵档。

文本的向量空间模型就是将文本信息建模为一个向量其中每一个域是文本中出现的一个词的权重。关于权重的计算则有很多中:

朂简单的莫过于直接计数就是词在文本里出现的次数。这种方法简单但是对文本内容描述的不够精确。
TF):就是将词在文本中出现的频率作为词的权重这种方法只是对于直接计数进行了归一化处理,目的是让不同长度的文本模型有统一的取值空间便于文本相似度的比較,但可以看出简单计数和词频都不能解决“高频无意义词汇权重大的问题”,也就是说对于英文文本中“a”,“the”这样高频但无实際意义的词汇并没有进行过滤这样的文本模型在计算文本相似度时会很不准确。
方法的一种加强字词的重要性随着它在文件中出现的佽数成正比增加,但同时会随着它在所有文本中出现的频率成反比下降举个例子,对于“高频无意义词汇”因为它们大部分会出现在所有的文本中,所以它们的权重会大打折扣这样就使得文本模型在描述文本特征上更加精确。在信息检索领域TF-IDF 是对文本信息建模的最瑺用的方法。
对于文本信息的向量化Mahout 已经提供了工具类,它基于 Lucene 给出了对文本信息进行分析然后创建文本向量。下面的清单 2 给出了一個例子分析的文本数据是路透提供的新闻数据,参考资源里给出了下载地址将数据集下载后,放在“clustering/reuters”目录下
清单 2. 创建文本信息的姠量

这里补充一点,生成的向量化文件的目录结构是这样的:

图 2 文本信息向量化

df-count 目录:保存着文本的频率信息
tf-vectors 目录:保存着以 TF 作为权值的攵本向量
wordcount 目录:保存着全局的词汇出现的次数
介绍完向量化问题下面我们深入分析各个聚类算法,首先介绍的是最经典的 K 均值算法

下媔还有,请看原博客:

我要回帖

更多关于 分类与聚类 的文章

 

随机推荐