package com.github.stakafum.mapreduce.KMeans; import com.github.stakafum.mapreduce.Mapper; /** * KMeansのMapperのサブクラス */ public class MapKM extends Mapper<VectorKM, VectorKM[], VectorKM, VectorKM> { double measuredDistance(VectorKM v1, VectorKM v2){ return Math.sqrt(Math.pow(v1.getX() - v2.getX(), 2) + Math.pow(v1.getY() - v2.getY(), 2)); } /** * Kmeansのmap処理を行うメソッド * 1.入力バリューとして与えられたクラスタの重点の中で、最も入力キーとして与えられたプロットの座標に近いものを探す * 2.キーを最も近いクラスタの重点の座標、バリューを入力キーのプロットの座標としてemit関数に渡す */ @Override protected void map() { double mindistance = 0; VectorKM minvector = new VectorKM(); for(VectorKM vkm : this.getInputValue()){ double distance = measuredDistance(this.getInputKey(), vkm); if(mindistance == 0){ minvector = vkm; mindistance = distance; } else if(distance < mindistance){ minvector = vkm; mindistance = distance; } } emit(minvector, this.getInputKey()); } }