Mahout  K-means聚类

一、Kmeans 聚类原理

K-means算法是最为经典的基于划分的聚类方法,是十大经典数据挖掘算法之一。K-means算法的基本思想是:以空间中k个点为中心进行聚类,对最靠近他们的对象归类。通过迭代的方法,逐次更新各聚类中心的值,直至得到最好的聚类结果。

假设要把样本集分为c个类别,算法描述如下:

(1)适当选择c个类的初始中心;

(2)在第k次迭代中,对任意一个样本,求其到c各中心的距离,将该样本归到距离最短的中心所在的类;

(3)利用均值等方法更新该类的中心值;

(4)对于所有的c个聚类中心,如果利用(2)(3)的迭代法更新后,值保持不变,则迭代结束,否则继续迭代。

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

二、Mahout kmeans实现

Mahout kmeans MapReduce实现的原理和上述的一致,值得注意的是,Mahout将数据存储在HDFS,用MapReduce做批量并行的计算。在做kmeans之前,需要将文本用Mahout向量化模块工具做向量化。计算过程主要分为三个步骤:初始中心选取,寻找簇中心,划分数据。

(一) 簇定义

簇Cluster是一个实体,保存该簇的关键信息。

 privateint id;
簇编号

核心参数:计算完数据后最终的簇属性

private long numPoints;
簇中点的个数

private Vector center;
中心向量 center=

private Vector radius;
半径向量 radius =

调整参数:簇中加入一个点后调整的参数

private double s0; s0= 权重和。对于Kmeans,w=1
,所有s0=numPoints

private Vector s1;  s1=  x
为point,w为权重。对kmeansw =1

private Vector s2 ;  s2= x
为point,w为权重。对kmeansw =1

(二) 初始中心点选择

(1)RandomSeedGenerator 将输入的向量随机选择K个输出到HDFS作为Kmeans 聚类的初始中心点。

(2)另一种将Canopy计算出的簇中心作为kmeans聚类的初始中心点。

(三) 迭代更新中心

通过不断的迭代,移动簇中心。该过程划分为两个部分,一个是簇划分Job,一个是控制迭代循环。

1.簇划分Job过程:

Map:

Collection<Cluster> clusters = newArrayList<Cluster>()

setUp(){

读入上一次输出的全部中心点,填充cluster。

}

Map(WritableComparable<?> key, VectorWritable point){

用KMeansClustererclusterer 将point 划分到cluster中距离最近的一个cluster中。

输出: key  clusterID ,value  ClusterObservations

}

}

  Combiner:

Reduce(key clusterID ,value  Iterator<ClusterObservations> it ){

计算同一个cluster的局部参数。

}

   Reduce:

Reduce(key  clusterID ,value  ClusterObservations){

计算同一cluster的全局参数。

计算cluster的新中心。

对比之前的中心,计算是否收敛。

替换新的中心点作为cluster的中心。

输出 keyclusterID,value Cluster

}

2.循环过程

while(!收敛||没有达到相应的迭代次数){

1.执行迭代Job,输入全部数据,输出新的簇中心;

2.判断是否有簇没有收敛。只要有一个簇没有收敛,则断定为全局不收敛。

}

(四) 划分数据

划分数据过程是对简单的,只需要计算向量和所有簇的距离,将其划分到距离最小的一个簇中。由一个map完成。

Map:

Collection<Cluster> clusters = new ArrayList<Cluster>()

setUp(){

读取最终收敛的簇,填充clusters。

}

Map(WritableComparable<?> key, VectorWritable point){

Double min = 0 ;

String clusterID ;

While(cluster :clusters){

计算min;

得到最小距离的clusterID;

}

输出:clusterID ,point

}

三、API说明

API

KMeansDriver.main(args);

--input(-i)

输入路径

--outpu(-o)

输出路径

--distanceMeasure(-dm)

距离类权限命名,如“org.apache.mahout.common.distance.Cosine

DistanceMeasure”

--clusters(-c)

中心点存储路径,如果该路径下没有中心点,则随机生成并写入该目录

--numClusters(-k)

簇个数

--convergenceDelta(-cd)

收敛值

--maxIter(-x)

最大迭代次数

--overwrite(-ow)

是否覆盖上次操作

--clustering(-cl)

是否执行聚类

--method(-xm)

默认”mapreduce”,或”sequential”

 

示例

String  [] arg=           {"-x","10",

"-c","kmeans_center",

"-i","vector\tfidf-vectors",

"-o","kmeans",

"-dm","org.apache.mahout.common.distance.   EuclideanDistanceMeasure",

"-k","3",

"-cd","0.01",

"-ow",

"-cl",

"-xm","mapreduce"};

KMeansDriver.main(arg);

 

输出

结果文件

Key类型

Value类型

说明

clusters-*

类id (org.apache.hadoop.io.Text)

类中心

(org.apache.mahout.

clustering.kmeans.Cluster)

每条记录以类id和类中心表示一个类别

clusteredPoints

类id (org.apache.hadoop.io.IntWritable)

文档向量

(org.apache.

mahout.clustering.WeightedVectorWritable)

每条记录中,文档向量代表文档,类id代表该文档所属类别

注:clusters-*中*代表数字,第i次迭代产生的类信息即为clusters-i

四、参考文献

1.《web数据挖掘》

Mahout kmeans聚类的更多相关文章

  1. Mahout系列之----kmeans 聚类

    Kmeans是最经典的聚类算法之一,它的优美简单.快速高效被广泛使用. Kmeans算法描述 输入:簇的数目k:包含n个对象的数据集D. 输出:k个簇的集合. 方法: 从D中任意选择k个对象作为初始簇 ...

  2. mahout in Action2.2-聚类介绍-K-means聚类算法

    聚类介绍 本章包含 1 实战操作了解聚类 2.了解相似性概念 3 使用mahout执行一个简单的聚类实例 4.用于聚类的各种不同的距离測算方法 作为人类,我们倾向于与志同道合的人合作-"鸟的 ...

  3. K-Means 聚类算法

    K-Means 概念定义: K-Means 是一种基于距离的排他的聚类划分方法. 上面的 K-Means 描述中包含了几个概念: 聚类(Clustering):K-Means 是一种聚类分析(Clus ...

  4. k-means聚类JAVA实例

    <mahout in action>第六章. datafile/cluster/simple_k-means.txt数据集例如以下: 1 1 2 1 1 2 2 2 3 3 8 8 8 9 ...

  5. (转)Mahout Kmeans Clustering 学习

    一.Mahout命令使用 合成控制的数据集 synthetic_control.data 可以从 此处下载,总共由600行X60列double型的数据组成, 意思是有600个元组,每个元组是一个时间序 ...

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

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

  7. 改用MyAnalyzer的KMeans聚类算法

    <strong><span style="font-size:18px;">/*** * @author YangXin * @info 改用MyAnaly ...

  8. 用scikit-learn学习K-Means聚类

    在K-Means聚类算法原理中,我们对K-Means的原理做了总结,本文我们就来讨论用scikit-learn来学习K-Means聚类.重点讲述如何选择合适的k值. 1. K-Means类概述 在sc ...

  9. K-Means聚类算法原理

    K-Means算法是无监督的聚类算法,它实现起来比较简单,聚类效果也不错,因此应用很广泛.K-Means算法有大量的变体,本文就从最传统的K-Means算法讲起,在其基础上讲述K-Means的优化变体 ...

随机推荐

  1. 热烈庆祝自已厉精13年开发的 DB查询分析器 7.01(最新版本) 在中关村在线本月获得近6000次的下载量

    中国本土程序员马根峰(CSDN专访马根峰:海量数据处理与分析大师的中国本土程序员)推出的个人作品----万能数据库查询分析器,中文版本 DB 查询分析器.英文版本DB Query Analyzer.它 ...

  2. 如何对n个大小都小于100的整数进行排序,要求时间复杂度O(n),空间复杂度O(1)。

    提示:hash表 #include <iostream> using namespace std; #define N 100 #define RANGE 100 int* getRand ...

  3. [Matlab]技巧笔记

    1.将字符串作为Matlab命令执行 md = 'dir'; eval(md); 2.将字符串作为系统命令执行 md = 'dir'; system(md); 3.使显示图像的坐标轴使用相同的度量单位 ...

  4. Cocoa层粒子发射器动画添加多个cell的一种重构

    在iOS动画之旅第19章中最后的挑战中需要我们在雪花例子发生器中添加多个雪花贴图,也就是多个cell,因为我们不可能将每个cell的参数都重新写一遍,所以有必要写一个helper方法来做这件事: fu ...

  5. 自制 Python小工具 将markdown文件转换成Html文件

    今天看到了一个Python库,名为markdown.瞬间就给了我一个灵感,那就是制作一个将markdown文件转换成html文件的小工具. 我的实验环境 操作系统: Windows 7 64位 旗舰版 ...

  6. Django开发自己的博客系统

    好久之前就想做一下自己的博客系统了,但是在网上查了查好像是需要会一些Node.js的相关知识,而且还要安装辣么多的库什么的,就不想碰了.但是我遇到了Django这么一款神器,没想到我的博客系统就这么建 ...

  7. NET中小型企业级项目开发架构系列(一)

    前端时间我们开发了基于Net的一套搭建sprint.NET+NHibernate+MVC+WCF+EasyUI等中小型企业级系统开发平台,现在把整个开发过程中的步步进展整理出来和大家分享,这个系列可能 ...

  8. 【Unity技巧】四元数(Quaternion)和旋转

    四元数介绍 旋转,应该是三种坐标变换--缩放.旋转和平移,中最复杂的一种了.大家应该都听过,有一种旋转的表示方法叫四元数.按照我们的习惯,我们更加熟悉的是另外两种旋转的表示方法--矩阵旋转和欧拉旋转. ...

  9. Android文本框-android学习之旅(十七 )

    文本框简介 文本框属于基本的andoid控件,TextView继承了View是最基本的文本框,它的子类包括EditView和Button等,TextView的大部分方法,它的子类也可以使用. Text ...

  10. malloc、calloc、relloc

    1.malloc void * malloc(size_t _Size); malloc函数在堆中分配参数_Size指定大小的内存,单位:字节,函数返回void *指针. 2.calloc void ...