先来介绍一下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了,setup和map与之前的一样,而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