第一部分:

学习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创建一个javaproject,将解压缩的源码文件加入到这个project。既能够查看。

Mahout官网:

http://mahout.apache.org/

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

Mahout中的Shell命令进行操作:

/bin/mahout  方法名  -h

第二部分:

数据挖掘(机器学习)——聚类算法的简单介绍(如何使用各种聚类算法):

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

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

)不同的数据次序。

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

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

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

在高维下。全部点对的距离都差点儿相同(如欧式距离),或者是差点儿随意两个向量都是正交(利用夹角进行进行度量)。这样聚类就非常困难。

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

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

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

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-范数

6. k-means、k均值算法

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

算法过程例如以下:

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

)计算每一个点分别到k个簇的中心。并将点分配到其距离近期的簇中

,继续算法,直到簇的中心变化小于某个阈值

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

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

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

8. CURE算法

使用场景:

不论什么形状的簇,如S形、环形等等,不须要满足正态分布,欧式空间。能够用于内存不足的情况

特征:

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

算法步骤:

)初始化。

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

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

)点分配。

对全部点进行分配。即将点分配给与代表点近期的簇。

9. GRGPF算法

场景:

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

特征:

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

怎样表示簇?

数据特征:簇包括点的数目,簇中心点,离中心点近期的一些点集和最远的一些点集,ROWSUM(p)即点p到簇中其它店的距离平方和。

靠近中心的点集便于改动中心点的位置,而远离中心的点便于对簇进行合并。

簇的组织:类似B-树结构。首先。抽取样本点,然后做层次聚类。就形成了树T的结构。

然后,从树T中选取一系列簇。即是GRGPF算法的初始簇。然后将T中具有同样祖先的簇聚合,表示树中的内部节点。

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

详细处理的细节更为复杂,假设对B-树比較了解,应该有帮助。

10. 流聚类,怎样对近期m个点进行聚类?

的个数。

的次幂,每一级桶的个数最多是b个。

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

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

)查询应答:对近期的m个点进行聚类,当m不在桶的分界线上时。能够採用近似的方式求解,仅仅需求出包括m个点的最少桶的结果。

第三部分:

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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhvbmd3ZW43NzEw/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

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

 

皮尔森相关度

类名:PearsonCorrelationSimilarity

原理:用来反映两个变量线性相关程度的统计量

范围:[-1,1]。绝对值越大。说明相关性越强,负相关对于推荐的意义小。

,做除数)。

该相似度并非最好的选择,也不是最坏的选择,仅仅是由于其easy理解。在早期研究中常常被提起。使用Pearson线性相关系数必须如果数据是成对地从正态分布中取得的。而且数据至少在逻辑范畴内必须是等间距的数据。

Mahout中,为皮尔森相关计算提供了一个扩展,通过添加一个枚举类型(Weighting)的參数来使得重叠数也成为计算相似度的影响因子。

欧式距离相似度

类名:EuclideanDistanceSimilarity

原理:利用欧式距离d定义的相似度s。s=1 / (1+d)。

范围:[0,1],值越大,说明d越小。也就是距离越近,则相似度越大。

说明:同皮尔森相似度一样,该相似度也没有考虑重叠数对结果的影响。相同地,Mahout通过添加一个枚举类型(Weighting)的參数来使得重叠数也成为计算相似度的影响因子。

余弦相似度

类名:PearsonCorrelationSimilarity和UncenteredCosineSimilarity

原理:多维空间两点与所设定的点形成夹角的余弦值。

范围:[-1,1],值越大,说明夹角越大,两点相距就越远,相似度就越小。

说明:在数学表达中,假设对两个项的属性进行了数据中心化。计算出来的余弦相似度和皮尔森相似度是一样的,在mahout中,实现了数据中心化的过程,所以皮尔森相似度值也是数据中心化后的余弦相似度。

另外在新版本号中,Mahout提供了UncenteredCosineSimilarity类作为计算非中心化数据的余弦相似度。

Spearman秩相关系数

类名:SpearmanCorrelationSimilarity

原理:Spearman秩相关系数通常被觉得是排列后的变量之间的Pearson线性相关系数。

范围:{-1.0,1.0}。当一致时为1.0,不一致时为-1.0。

说明:计算很慢,有大量排序。针对推荐系统中的数据集来讲,用Spearman秩相关系数作为相似度量是不合适的。

曼哈顿距离

类名:CityBlockSimilarity

原理:曼哈顿距离的实现,同欧式距离相似。都是用于多维数据空间距离的測度

范围:[0,1],同欧式距离一致,值越小。说明距离值越大,相似度越大。

说明:比欧式距离计算量少,性能相对高。

Tanimoto系数

类名:TanimotoCoefficientSimilarity

原理:又名广义Jaccard系数,是对Jaccard系数的扩展,等式为

说明越相似。

说明:处理无打分的偏好数据。

对数似然相似度

类名:LogLikelihoodSimilarity

原理:重叠的个数。不重叠的个数,都没有的个数

范围:详细可去百度文库中查找论文《Accurate Methods for the Statistics ofSurprise and Coincidence》

说明:处理无打分的偏好数据,比Tanimoto系数的计算方法更为智能。

參考网址:http://www.cnblogs.com/dlts26/archive/2012/06/20/2555772.html

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在源码中的位置:



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

參考文献:

http://mahout.apache.org/

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

http://f.dataguru.cn/thread-281665-1-1.html

http://blog.csdn.net/viewcode/article/details/9146965

http://mahout.apache.org/users/basics/algorithms.html

http://mahout.apache.org/users/clustering/k-means-clustering.html

http://mahout.apache.org/users/clustering/canopy-clustering.html

http://mahout.apache.org/users/clustering/fuzzy-k-means.html

http://mahout.apache.org/users/clustering/cluster-dumper.html

http://mahout.apache.org/users/clustering/k-means-commandline.html

http://mahout.apache.org/users/clustering/canopy-commandline.html

http://mahout.apache.org/users/clustering/fuzzy-k-means-commandline.html

Mahout机器学习平台之聚类算法具体剖析(含实例分析)的更多相关文章

  1. Hadoop平台K-Means聚类算法分布式实现+MapReduce通俗讲解

        Hadoop平台K-Means聚类算法分布式实现+MapReduce通俗讲解 在Hadoop分布式环境下实现K-Means聚类算法的伪代码如下: 输入:参数0--存储样本数据的文本文件inpu ...

  2. 机器学习六--K-means聚类算法

    机器学习六--K-means聚类算法 想想常见的分类算法有决策树.Logistic回归.SVM.贝叶斯等.分类作为一种监督学习方法,要求必须事先明确知道各个类别的信息,并且断言所有待分类项都有一个类别 ...

  3. Python实现的选择排序算法原理与用法实例分析

    Python实现的选择排序算法原理与用法实例分析 这篇文章主要介绍了Python实现的选择排序算法,简单描述了选择排序的原理,并结合实例形式分析了Python实现与应用选择排序的具体操作技巧,需要的朋 ...

  4. 机器学习:K-Means聚类算法

    本文来自同步博客. 前面几篇文章介绍了回归或分类的几个算法,它们的共同点是训练数据包含了输出结果,要求算法能够通过训练数据掌握规律,用于预测新输入数据的输出值.因此,回归算法或分类算法被称之为监督学习 ...

  5. 机器学习中K-means聚类算法原理及C语言实现

    本人以前主要focus在传统音频的软件开发,接触到的算法主要是音频信号处理相关的,如各种编解码算法和回声消除算法等.最近切到语音识别上,接触到的算法就变成了各种机器学习算法,如GMM等.K-means ...

  6. 【Python机器学习实战】聚类算法(1)——K-Means聚类

    实战部分主要针对某一具体算法对其原理进行较为详细的介绍,然后进行简单地实现(可能对算法性能考虑欠缺),这一部分主要介绍一些常见的一些聚类算法. K-means聚类算法 0.聚类算法算法简介 聚类算法算 ...

  7. 机器学习sklearn19.0聚类算法——Kmeans算法

    一.关于聚类及相似度.距离的知识点 二.k-means算法思想与流程 三.sklearn中对于kmeans算法的参数 四.代码示例以及应用的知识点简介 (1)make_blobs:聚类数据生成器 sk ...

  8. 机器学习入门-DBSCAN聚类算法

    DBSCAN 聚类算法又称为密度聚类,是一种不断发张下线而不断扩张的算法,主要的参数是半径r和k值 DBSCAN的几个概念: 核心对象:某个点的密度达到算法设定的阈值则其为核心点,核心点的意思就是一个 ...

  9. 机器学习之K-Mean聚类算法

    知识点: # coding = utf-8 import numpy as np import pandas as pd from sklearn.cluster import KMeans &quo ...

随机推荐

  1. JavaScriptCore.framework基本用法(二)

    接着上节我们讲到的iOS调用js 下来我们使用js调用iOS js调用iOS分两种情况 一,js里面直接调用方法 二,js里面通过对象调用方法 首先我们看第一种,直接调用方法. 其中用到了iOS的bl ...

  2. Android应用开发基础篇(11)-----ViewFlipper

    链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/01/2376067.html 一.概述 ViewFlipper这个部件是用来实现多页显示的,多页 ...

  3. jvm 调优 工具

    1.用于打开运行中的jvm进程的gc 监控日志以及查看相关参数设置:jinfo 2.其它工具如:jps.jstack.jstat.jmap

  4. iptables 简单配置

    通过命令 netstat -tnl 可以查看当前服务器打开了哪些端口  Ssh代码   netstat -tnl     查看防火墙设置  Ssh代码   iptables -L -n      开放 ...

  5. php如何开启GD库

    GD库是干什么用的呢!它是php处理图形的扩展库,GD库提供了一系列用来处理图片的API,使用GD库可以处理图片,或者生成图片.GD库在php中默认是没有开启的,如果想让它支持图片处理功能,那么就要手 ...

  6. bzoj 1007 : [HNOI2008]水平可见直线 计算几何

    题目链接 给出n条直线, 问从y轴上方向下看, 能看到哪些直线, 输出这些直线的编号. 首先我们按斜率排序, 然后依次加入一个栈里面, 如果刚加入的直线, 和之前的那条直线斜率相等, 那么显然之前的会 ...

  7. Page Cache, the Affair Between Memory and Files

    Previously we looked at how the kernel manages virtual memory for a user process, but files and I/O ...

  8. 面试题:在O(1)时间删除链表结点

    题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. 链表结点与函数的定义如下: struct ListNode { int m_nValue; ListNode* m_p ...

  9. Strata 2014 上的 AzureCAT 粉笔会谈

     本周,AzureCAT 团队非常高兴在 Strata 会议上首次集体亮相.对于那些对 AzureCAT 团队不太熟悉的人来说,我们是 Microsoft 云与企业部门一个核心的国际性团队,由大约 ...

  10. C++模板:字典树

    //插入 void insert(char *s,char *s1){ for(int l=strlen(s),x=0,i=0;i<l;i++){ if(!trie[x].son[s[i]-'a ...