MapReduce实现kmeans算法

本文介绍了如何在Hadoop的MapReduce框架下实现KMeans聚类算法。首先阐述了KMeans的基本思想,接着详细讲解了MapReduce代码的四个部分:kmeansInit用于设置初始中心点并分类,kmeansIter负责迭代更新中心点,kmeansViewer展示分类结果,kmeansDriver进行任务调度。在kmeansIter中,通过setup方法读取上一轮的中心点并保存到数组,以备后续使用。
摘要由CSDN通过智能技术生成

先来介绍一下kmeans算法的思想:(以下是我自己的理解):

  1.先随机选取几个中心点作为初始的中心点

  2.然后根据每个点到这些点的距离远近,找到最近的那个点作为它的中心点,将这些点进行分类。

  3.计算每一类的点形成的新的中心点。

重复2,3步。

hadoop中mapreduce的代码我分成了4部分,是有一点的繁琐,但是比较好理解。

第一部分:kmeansInit:

这部分就是设置了初始的三个点的坐标,在map中对这些点进行分类,在reduce中对点重新计算中心点。

map的的输入:

 

每一行的key是默认的偏移值,value是一行的点。

reduce的输入是:

前面是第几类,后面是点的坐标。

而输出是:

key是新的中心点,value是属于这个类的点的列表。

第二部分:kmeansIter

第二部分其实跟第一部分差别不大,不过增加了一个setup方法,这个方法是为了将上一次的迭代的中心点从文件中读取出来然后保存到数组里,方便后面的使用。而map和reduce跟之前的一样。下面详细的说明一下setup。

setup:用缓存的方式读取上次产生的文件

输入格式为:

所以用每一行的“\t”做分割,前面是新的中心点坐标,读取出来保存到数组里即可,后面map在使用就可以了。

第三部分:kmeansViewer

其实这部分也跟前面的差别不大,主要是因为输入只是每个点的类别,所以我们不用之前的reduce了,setupmap与之前的一样,而reduce的功能就是输出。

reduce:

输入依然是这样的形式:

输出的key是map输出的key,value是map的输出的value,因为可能在map时会有合并的项

-_-||(发现这里其实可以不要reduce的,用默认的就行)

最后一部分:kmeansDriver

就是调度的部分,整个程序执行一次kmeansInit,数次kmeansIter,一次kmeansViewer。

附上四部分的代码:

一:kmeansInit

//package org.apache.hadoop.examples;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.Reducer.Context;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;

//import GraphBuilder.GraphBuilderMapper;
//import GraphBuilder.GraphBuilderReducer;
 
import java.io.IOException;
import java.net.URI;
import java.util.StringTokenizer;
 
 
/**
 * MapReduce开发WordCount应用程序
 * */
public class kmeansInit {
	
 
    /**
     *
     * Map:读取输入的文件
     * */
    public static class MyMapper extends Mapper<LongWritable, Text, Text, Text> {
    	//private final IntWritable one = new IntWritable(1); 
    	private Text word = new Text();
    	//String dd=new String();
    	double[][] k={
  {467,41},{500,334},{724,169}};
    	int[] kind=new int[20000];
    	int count=0;
        @Override
        protected void map(LongWritable key, Text value, Context contex
  • 1
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值