KMeans算法的Hadoop实现.docx
- 文档编号:1259400
- 上传时间:2022-10-19
- 格式:DOCX
- 页数:19
- 大小:223.25KB
KMeans算法的Hadoop实现.docx
《KMeans算法的Hadoop实现.docx》由会员分享,可在线阅读,更多相关《KMeans算法的Hadoop实现.docx(19页珍藏版)》请在冰豆网上搜索。
KMeans算法的Hadoop实现
K-Means算法的Hadoop实现
K-Means算法的Hadoop实现
K-Means算法简介
k-Means是一种聚类分析算法,它是一种无监督学习算法。
它主要用来计算数据的聚集,将数据相近的点归到同一数据蔟。
学习聚类时我们需要了解聚类与分类的区别,分类的类别是我们实现设定好的,而聚类的类别是通过计算得到的。
算法原理
维基百科的算法描述如下:
已知观测集(x1,x2,x3,...,xn),其中每个观测都是一个d-维实向量,k-平均聚类要把这n个观测划分到k个集合中(k≤n),使得组内平方和(WCSSwithin-clustersumofsquares)最小。
换句话说,它的目标是找到使得下式满足的聚类Si
argminS=∑i=1k∑x∈Si||x−μi||2
其中μi是Si中所有点的均值。
简单描述就是:
不断迭代计算各个数据簇的中心点,直到该中心点趋于稳定。
该算法的优点是实现非常简单,主要缺点有如下:
对异常数据敏感。
当单独几个数据远离数据簇时会影响聚类效果。
由于K值是事先给定的,所以K值的选择难以估计。
也就是我们事先并不知道需要分多少个类别。
ISODATA算法可用于解决此问题,得到较为合理的类型数目K
初始的数据簇的中心点需要事先给定,初始种子点很大程度上会影响聚类的结果。
K-Means++算法可以用来解决这个问题,其可以有效地选择初始点
步骤
创建k个数据簇的中心点。
计算所有数据点到这k个中心点的距离,将其划归到距离自己最近的中心点。
根据上次聚类结果,计算各个数据簇的算数平均值作为新的数据簇中心点。
将所有数据在新的中心点上重新聚类。
重复第4步,直到中心点趋于稳定。
中心点距离算法
求某一数据点到中心点的距离可以采用欧几里得距离公式:
distance=∑k=1n(xik−xjk)2−−−−−−−−−−−−−−√
可以参考K-Means算法(CoolShell)里面的求点群中心的算法这一节,有三种距离公式。
Hadoop环境简介
HadoopVersion
root@hadoop-master:
/myjob/kmeans#hadoopversion
Hadoop2.7.2
SubversionUnknown-rUnknown
Compiledbyrooton2016-05-27T18:
05Z
Compiledwithprotoc2.5.0
Fromsourcewithchecksumd0fda26633fa762bff87ec759ebe689c
Thiscommandwasrunusing/usr/local/hadoop/share/hadoop/common/hadoop-common-2.7.2.jar
Hadoop参数设置
core-site.xml
xmlversion="1.0"?
>
//hadoop-master:
9000/
hdfs-site.xml
xmlversion="1.0"?
>
///root/hdfs/namenode
///root/hdfs/datanode
mapred-site.xml
xmlversion="1.0"?
>
yarn-site.xml
xmlversion="1.0"?
>
NameNodeInformation
在本机通过Docker启动Hadoop集群后共有一个master节点和四个slave节点,如下图:
MapReduce编程
整体思路
整体设计思路如下图:
每次迭代过程都是一个HadoopJob,通过不断迭代计算得到新的中心点文件,然后跟旧的中心点文件进行比较,直到新的中心点与旧的中心点误差小于给定的阙值,此时迭代结束,最后一次得到的中心点为计算结果。
KMeansData(辅助K-Means算法的单个数据点类)
为辅助计算,设计了类KMeansData,其用于保存K-Means计算过程中的数据,并实现了WritableComparable接口使其支持在Hadoop计算过程中向下传递。
成员变量
TextkMeansData
格式:
12...67,多维数据用空格隔开,使用Double解析
含义:
一行多维数据;或者在Combiner和Reducer过程中累加的多维数据
IntWritabledataSize
含义:
该对象的kMeansData字段是有几行数据累加的
主要成员函数
publicvoidadd(KMeansDatadata,intdimension)
在当前KMeansData对象上累加一个KMeansData对象,更新kMeansData和dataSize的值。
该函数主要在Combiner和Reducer计算过程中用到。
@paramdata一个KMeansData数据对象
@paramdimension数据对象的维度
@throwsKMeansCentroidFormatException
publicStringgetNewCentroids()
根据当前KMeansData对象生成新的中心点,也就是将kMeansData中各维的数据除以dataSize。
该函数主要用于Reducer过程中的最后一步,生成新中心点。
@return新中心点,数据以空格隔开
代码
publicclassKMeansDataimplementsWritableComparable
privateTextkMeansData;
privateIntWritabledataSize;
publicKMeansData(){
set(newText(),newIntWritable());
}
publicKMeansData(Texttext,IntWritableintWritable){
this.kMeansData=text;
this.dataSize=intWritable;
}
privatevoidset(TexttextWritable,IntWritableintWritable){
this.kMeansData=textWritable;
this.dataSize=intWritable;
}
publicTextgetkMeansData(){
returnkMeansData;
}
publicIntWritablegetDataSize(){
returndataSize;
}
/**
*isEqual
*
*@paramo
*@return
*/
publicintcompareTo(KMeansDatao){
intflag=0;
if(kMeansDpareTo(o.kMeansData)!
=0||dataSpareTo(o.dataSize)!
=0){
flag=1;
}
returnflag;
}
publicvoidwrite(DataOutputdataOutput)throwsIOException{
kMeansData.write(dataOutput);
dataSize.write(dataOutput);
}
publicvoidreadFields(DataInputdataInput)throwsIOException{
kMeansData.readFields(dataInput);
dataSize.readFields(dataInput);
}
/**
*addaKMeansDatatothis
*@paramdataaKMeansData
*@paramdimensiondimension
*@throwsKMeansCentroidFormatException
*/
publicvoidadd(KMeansDatadata,intdimension)throwsKMeansCentroidFormatException{
TextnewData=data.kMeansData;
String[]newStrings=newData.toString().trim().split("");
String[]strings=kMeansData.toString().trim().split("");
if(newStrings.length!
=dimension||strings.length!
=dimension){
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- KMeans 算法 Hadoop 实现