MapReduce的Kmeans聚类算法

本文详细介绍了如何使用MapReduce实现K-means聚类算法,通过一个实例展示了从数据读取、中心点计算到结果比较的全过程。文章补充了原示例中的注释,便于初学者理解。步骤包括Map阶段的中心分配、Reduce阶段的平均值计算以及中心更新规则。提供了数据集链接和运行结果的对比方法。
摘要由CSDN通过智能技术生成

最近在网上查看用MapReduce实现的Kmeans算法,例子是不错,http://blog.csdn.net/jshayzf/article/details/22739063

但注释太少了,而且参数太多,如果新手学习的话不太好理解。所以自己按照个人的理解写了一个简单的例子并添加了详细的注释。

大致的步骤是:

1,Map每读取一条数据就与中心做对比,求出该条记录对应的中心,然后以中心的ID为Key,该条数据为value将数据输出。

2,利用reduce的归并功能将相同的Key归并到一起,集中与该Key对应的数据,再求出这些数据的平均值,输出平均值。

3,对比reduce求出的平均值与原来的中心,如果不相同,这将清空原中心的数据文件,将reduce的结果写到中心文件中。(中心的值存在一个HDFS的文件中)

     删掉reduce的输出目录以便下次输出。

     继续运行任务。

4,对比reduce求出的平均值与原来的中心,如果相同。则删掉reduce的输出目录,运行一个没有reduce的任务将中心ID与值对应输出。


package MyKmeans;

import java.io.IOException;
import java.util.ArrayList;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;

import java.util.Arrays;
import java.util.Iterator;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;


public class MapReduce {
	
	public static class Map extends Mapper<LongWritable, Text, IntWritable, Text>{

		//中心集合
		ArrayList<ArrayList<Double>> centers = null;
		//用k个中心
		int k = 0;
		
		//读取中心
		protected void setup(Context context) throws IOException,
				InterruptedException {
			centers = Utils.getCentersFromHDFS(context.getConfiguration().get("centersPath"),false);
			k = centers.size();
		}


		/**
		 * 1.每次读取一条要分类的条记录与中心做对比,归类到对应的中心
		 * 2.以中心ID为key,中心包含的记录为value输出(例如: 1 0.2 。  1为聚类中心的ID,0.2为靠近聚类中心的某个值)
		 */
		protected void map(LongWritable key, Text value, Context context)
				throws IOException, InterruptedException {
			//读取一行数据
			ArrayList<Double> fileds = Utils.textToArray(value);
			int sizeOfFileds = fileds.size();
			
			double minDistance = 99999999;
			int centerIndex = 0;
			
			//依次取出k个中心点与当
  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值