Java tutorial
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package assign00; import static java.lang.Math.abs; import static java.lang.Math.pow; import java.util.TreeMap; import weka.classifiers.Classifier; import weka.core.Instance; import weka.core.Instances; /** * * @author Iceman */ public class KNNClassifier extends Classifier { Integer k = 10; Instances data; TreeMap<Double, Integer> map; @Override public void buildClassifier(Instances i) throws Exception { data = i; } @Override public double classifyInstance(Instance instance) throws Exception { createMap(instance); return classify(instance); } double classify(Instance instance) { int tally[] = new int[data.numClasses()]; int i = 0; for (Double key : map.keySet()) { tally[map.get(key)]++; if (i >= k) break; i++; } int highestValue = 0; int highestIndex = 0; i = 0; for (int value : tally) { if (highestValue < value) { highestValue = value; highestIndex = i; } i++; } return highestIndex; } double EuclideanDistance(Instance instanceLHS, Instance instanceRHS) { double distance = 0; for (int i = 0; i < instanceLHS.numAttributes() - 1 && i < instanceRHS.numAttributes() - 1; i++) { if (instanceLHS.attribute(i).isNumeric() && instanceRHS.attribute(i).isNumeric()) { distance += pow(instanceLHS.value(i) - instanceRHS.value(i), 2); } else { if (instanceLHS.stringValue(i).equals(instanceRHS.stringValue(i))) { distance += 0; } else { distance += 1; } } } return distance; } void createMap(Instance instance) { map = new TreeMap<>(); for (int i = 0; i < data.numInstances(); i++) map.put(EuclideanDistance(data.instance(i), instance), (int) (data.instance(i).classValue())); } double ManhattenDistance(Instance instanceLHS, Instance instanceRHS) { double distance = 0; for (int i = 0; i < instanceLHS.numAttributes() - 1 && i < instanceRHS.numAttributes() - 1; i++) { if (instanceLHS.attribute(i).isNumeric() && instanceRHS.attribute(i).isNumeric()) { distance += abs(instanceLHS.value(i) - instanceRHS.value(i)); } else { if (instanceLHS.stringValue(i).equals(instanceRHS.stringValue(i))) { distance += 0; } else { distance += 1; } } } return distance; } }