Mahout机器学习平台之聚类算法详细剖析(含实例分析)

来源:互联网 发布:网络空间安全 研讨会 编辑:程序博客网 时间:2024/06/05 09:06

第一部分:

学习 Mahout 必须要知道的资料查找技能:

学会查官方帮助文档:

       解压用于安装文件( mahout-distribution-0.6.tar.gz ),找到如下位置,我将该文件解压到 win7 的 G 盘 mahout 文件夹下,路径如下所示:

G:\mahout\mahout-distribution-0.6\docs

学会查源代码的注释文档:

       方案一 :用 maven 创建一个 mahout 的开发环境(我用的是 win7,eclipse 作为集成开发环境,之后在 Maven Dependencies 中找到相应的 jar 包《这些多是 .class文件》,记得将源代码文件解压到自己硬盘的一个文件夹中,之后填写源代码的文件路径即可)

       方案二: 直接用 eclipse 创建一个 java 工程,将解压缩的源代码文件添加到这个工程,既可以查看。

Mahout 官网:

       http://mahout.apache.org/

       https://builds.apache.org/job/Mahout-Quality/javadoc/

Mahout 中的 Shell 命令进行操作:

       /bin/mahout  方法名   -h

第二部分:

数据挖掘(机器学习)——聚类算法的简介(怎样使用各种聚类算法):

1. 选择聚类算法,所面临的常见问题又哪些?

1 ) 不同形状的数据集。不同形状的数据集,也需要采取不同的度量策略,或者不同的聚类算法。

2 ) 不同的数据次序。相同数据集,但数据输入次序不同,也会造成聚类的结果的不同。

3 ) 噪声。不同的算法,对噪声的敏感程度不同。

2. 在高维的欧式空间,什么是“维数灾难”?

在高维下,所有点对的距离都差不多(如欧式距离),或者是几乎任意两个向量都是正交(利用夹角进行进行度量),这样聚类就很困难。

3. 常见的聚类算法的策略有哪些?

1 )层次或凝聚式聚类。采取合并的方式,将邻近点或簇合并成一个大簇。

2 )点分配。每次遍历数据集,将数据分配到一个暂时适合的簇中,然后不断更新。

4. 层次聚类算法的复杂度是多少?

每次合并,都需计算出两个点对之间的距离,复杂度是 O(n^2), 后续步骤的开销,分布正比与 O((n-1)^2), O((n-2)^2)... ,这样求和算下来,算法复杂度是 O(n^3).

算法优化:

采用优先队列 / 最小堆来优化计算。优先队列的构建,第一步需要计算出每两个点的距离,这个开销是 O(N^2). 一般情况下, N 个元素,单纯的优先队列的构建开销为 O( N ),若是 N^2 个距离值,则建堆的开销是 O(N^2) 。

第二步,合并,合并需要一个删除、计算和重新插入的过程。因为合并一个簇对,就需要更新 N 个元素,开销为 O(N*logN) 。总的开销为 O((N^2) * logN).

所以,总的算法复杂度为 O((N^2) * logN).


5. 欧式空间与非欧式空间下,常见的簇之间的距离度量有哪些?

欧式空间:

1 )两个簇之间的质心之间的距离最小

2 )两个簇中所有点之间的最短距离

3 )两个簇之间所有点对的平均距离

4 )将具有最小半径的两个簇进行合并, 簇的半径:簇内的点到质心的最大距离

5 )将具有最小直径的两个簇进行合并, 簇的直径:簇内任意两点间的最大距离

非欧式空间,簇的中心点定义,该点距离其他点的距离最近,如何计算?

1 )该点到簇中其他所有点的距离之和(求和), 1- 范数

2 )该点到簇中其他点的最大距离(最大值),无穷 - 范数

3 )该点到簇中其他点的平方和(平方和), 2- 范数

6. k-means 、 k 均值算法

点分配式的聚类算法。一般用于 球形或凸集的数据集 。

算法步骤如下:

1 )初始化 k 个选择点作为最初的 k 个簇的中心

2 )计算每个点分别到 k 个簇的中心,并将点分配到其距离最近的簇中

3 )由分配的点集,分别更新每个簇的中心,然后回到 2 ,继续算法,直到簇的中心变化小于某个阈值

7. k-means 算法的两个问题?

1 )初始化选择点;常用的方式是尽量选择距离比较远的点(方法:依次计算出与已确定的点的距离,并选择距离最大的点),或者首先采取层次聚类的方式找出 k 个簇

2 )如何选取 k 值; k 值选取不当,会导致的问题?当 k 的数目低于真实的簇的数目时,平均直径或其他分散度指标会快速上升可以采用多次聚类,然后比较的方式。多次聚类,一般是采用 1, 2, 4, 8... 数列的方式,然后找到一个指标在 v/2, v 时,获取较好的效果,然后再使用二分法,在 [v/2, v] 之间找到最佳的 k 值。

8. CURE 算法

使用场景:

任何形状的簇,如 S 形、环形等等,不需要满足正态分布,欧式空间,可以用于内存不足的情况

特征:

簇的表示不是采用质心,而是用一些代表点的集合来表示。

算法步骤:

1 )初始化。抽取样本数据在内存中进行聚类,方法可以采用层次聚类的方式,形成簇之后,从每个簇中再选取一部分点作为簇的代表点,并且每个簇的代表点之间的距离尽量远。对每个代表点向质心移动一段距离,距离的计算方法:点的位置到簇中心的距离乘以一个固定的比例,如 20% 。

2 ) 对簇进行合并。当两个簇的代表点之间足够近,那么就合并这两个簇,直到没有更足够接近的簇。

3 )点分配。对所有点进行分配,即将点分配给与代表点最近的簇。

9. GRGPF 算法

场景:

非欧式空间,可用于内存不足的情况(对数据抽样)

特征:

同时使用了层次聚类和点分配的的思想。

如何表示簇?

数据特征 :簇包含点的数目,簇中心点,离中心点最近的一些点集和最远的一些点集, ROWSUM(p) 即点 p 到簇中其他店的距离平方和。靠近中心的点集便于修改中心点的位置,而远离中心的点便于对簇进行合并。

簇的组织 :类似 B- 树结构。首先,抽取样本点,然后做层次聚类,就形成了树 T的结构。然后,从树 T 中选取一系列簇,即是 GRGPF 算法的初始簇。然后将 T 中具有相同祖先的簇聚合,表示树中的内部节点。

点的分配 :对簇进行初始化之后,将每个点插入到距离最近的那个簇。

具体处理的细节更为复杂,如果对 B- 树比较了解,应该有帮助。

10. 流聚类,如何对最近 m 个点进行聚类?

N 个点组成的滑动窗口模型,类似 DGIM 算法中统计 1 的个数。

1 )首先,划分桶,桶的大小是 2 的次幂,每一级桶的个数最多是 b 个。

2 )其次,对每个桶内的数据进行聚类,如采用层次聚类的方法。

3 )当有新数据来临,需要新建桶,或者合并桶,这个类似于 GDIM ,但除了合并,还需要合并簇,当流内聚类的模型变化不是很快的时候,可以采取直接质心合并的方式。

4 )查询应答:对最近的 m 个点进行聚类,当 m 不在桶的分界线上时,可以采用近似的方式求解,只需求出 包含 m 个点的最少桶的结果。

第三部分:

Mahout 中实现常用距离的计算: 以下摘自 mahout-core-0.6.jar 包中


对以上进行距离进行解析:

 

 

Mahout 中聚类实现的算法:

官网算法 Clustering 算法摘录:

·         Canopy Clustering - single machine/ MapReduce (deprecated, will beremoved once Streaming k-Means is stable enough)

·         k-Means Clustering - single machine / MapReduce

·         Fuzzy k-Means - single machine / MapReduce

·         Streaming k-Means - single machine / MapReduce

·         Spectral Clustering - MapReduce

官网参考网址: http://mahout.apache.org/users/basics/algorithms.html

源代码中聚类算法的实现: 以下摘自 mahout-core-0.6.jar 包中


对以上各种聚类类的解析:

 

第四部分:

用 Mahout 进行实例分析( K-means 、 canopy 、 fuzzy k-means )

步骤简介:

A 、数据转换及相应的命令简介

B 、 K-means 、 canopy 、 fuzzy k-means 命令,参数简介

C 、 mahout 操作 k-means 、 canopy 、 fuzzy k-means 聚类的详细命令

D 、用 K-means 算法进行操作,之后用 R 进行可视化操作

详细步骤:

A 、数据转换及相应的命令简介

Mahout 类 : org.apache.mahout.clustering.conversion.InputDriver

作用 :这个类,是将文本文件中( .txt 格式)用空格分隔的浮点型数字转换为Mahout 中的序列文件( VectorWritable 类型),这个类型适合集群任务,有些Mahout 任务,则需要任务是一般类型。

源代码的位置 : mahout-integration-0.6.jar

命令使用 : mahoutorg.apache.mahout.clustering.conversion.InputDriver       http://  \

–i  /user/hadoop/mahout6/p04-17.txt         \

-o  /user/hadoop/mahout6/vecfile       \

-v  org.apache.mahout.math.RandomAccessSparseVector

数据集下载 : p04-17.txt


对于文本数据,数据处理及相关的类( 注解 : 文本 转换为 序列文件 , 序列文件转换为 向量文件 ,下面几个类,主要是对文本文件进行挖掘时用 ):


向量文本类型( 向量文件的存储方式 ):

B 、 K-means 、 canopy 、 fuzzy k-means 命令,参数简介

Mahout 之 k-means 命令使用参数简介:


Mahout 之 canopy 命令使用参数简介:


Mahout 之 fuzzy k-means 命令使用参数简介:


C 、 mahout 操作 k-means 、 canopy 、 fuzzy k-means 聚类的详细命令

Mahout 之数据预处理:

mahoutorg.apache.mahout.clustering.conversion.InputDriver \

–i  /user/hadoop/mahout6/p04-17.txt         \

-o  /user/hadoop/mahout6/vecfile       \

-v  org.apache.mahout.math.RandomAccessSparseVector

Mahout 之 k-means 命令:

mahout kmeans -i /user/hadoop/mahout6/vecfile -o/user/hadoop/mahout6/result1 -c /user/hadoop/mahout6/clu1 -x 20 -k 2 -cd 0.1-dm org.apache.mahout.common.distance.SquaredEuclideanDistanceMeasure -cl

Mahout 之 canopy 命令:

mahout canopy -i /user/hadoop/mahout6/vecfile -o /user/hadoop/mahout6/canopy-result-t1 1 -t2 2 –ow

Mahout 之 fuzzy k-means 命令:

mahoutfkmeans -i /user/hadoop/mahout6/vecfile

-o/user/hadoop/mahout6/fuzzy-kmeans-result

-c/user/hadoop/mahout6/fuzzy-kmeans-centerpt -m 2 -x 20 -k 2 -cd 0.1

-dmorg.apache.mahout.common.distance.SquaredEuclideanDistanceMeasure -ow -cl

D 、用 K-means 算法进行操作,之后用 R 进行可视化操作(导出 K-means 算法生成的数据)

聚类结果分析: 

 


数据导出命令帮助文档信息:



实例命令行如下所示(本案例脚本是用 mahout 之 k-means 算法生成的数据导出):

将数据转换为 CSV 格式:

mahoutclusterdump -s /user/hadoop/mahout6/result2/clusters-1-final -p/user/hadoop/mahout6/result2/clusteredPoints -o /home/hadoop/cluster1.csv -ofCSV

将数据转换为 TXT 格式:

mahoutclusterdump -s /user/hadoop/mahout6/result2/clusters-1-final -p/user/hadoop/mahout6/result2/clusteredPoints -o /home/hadoop/cluster1.txt -ofTEXT

导出后的数据格式:



用 R 语言进行效果展示(输出的数据格式可以参考上图所示):

mahoutkmeans -i /user/hadoop/mahout6/vecfile -o /user/hadoop/mahout6/resultTest2 -c/user/hadoop/mahout6/cluTest1 -x 20 -cd 0.00001 -dmorg.apache.mahout.common.distance.SquaredEuclideanDistanceMeasure -cl

mahoutclusterdump -s /user/hadoop/mahout6/result2/clusters-1-final -p/user/hadoop/mahout6/result2/clusteredPoints -o /home/hadoop/cluster1.csv -ofCSV


将上面聚类生成的四个数据进行处理,分成四个文件,之后按如下R代码进行可视化处理:

R参考代码:

> c1<-read.csv(file=\"2/cluster1.csv\",sep=\",\",header=FALSE)

> c2<-read.csv(file=\"2/cluster2.csv\",sep=\",\",header=FALSE)

> c3<-read.csv(file=\"2/cluster3.csv\",sep=\",\",header=FALSE)

> c4<-read.csv(file=\"2/cluster4.csv\",sep=\",\",header=FALSE)

> y<-rbind(c1,c2,c3,c4)

> cols<-c(rep(1,nrow(c1)),rep(2,nrow(c2)),rep(3,nrow(c3)),rep(4,nrow(c4)))

> plot(y, col=c(\"black\",\"blue\")[cols])

> q()

> plot(y, col=c(\"black\",\"blue\",\"green\",\"yellow\")[cols])

> center<-matrix(c(0.764, 0.182,0.369, 0.378,0.749, 0.551,0.422, 0.671),ncol=2,byrow=TRUE)

> points(center, col=\"violetred\", pch = 19)

 

第四部分:

数据预处理遇到的问题(输入如下命令报错):

mahoutorg.apache.mahout.clustering.conversion.InputDriver \

–i  /user/hadoop/mahout6/p04-17.txt         \

-o  /user/hadoop/mahout6/vecfile       \

-v  org.apache.mahout.math.RandomAccessSparseVector


问题解决方案(查看源代码——详细方法请参看文章开始):

这个类( mahoutorg.apache.mahout.clustering.conversion.InputDriver )位置位于源代码中的 mahout-integration-0.6.jar 的 jar 包下,如上图所示:

英文解析 :(摘录源码注释文件) 
This class converts text files containing  space-delimited floating point numbers intoMahout sequence files of VectorWritable suitable for input to the clusteringjobs in particular, and any Mahout job requiring this input in general. 
中文解析 :(摘自源码注释文件) 
这个类,是将文本文件中( .txt 格式)用空格分隔的浮点型数字转换为 Mahout 中的序列文件( VectorWritable 类型),这个类型适合集群任务,有些 Mahout 任务,则需要任务是一般类型。

mahout org.apache.mahout.clustering.conversion.InputDriver在源代码中的位置:


谢谢您的查看,如有问题,请留言!!!!

0 0