package weka.core.metrics; import java.util.ArrayList; import java.io.Serializable; import weka.core.*; public class Euclidean extends Metric{ public void buildMetric(int numAttributes) throws Exception{ m_numAttributes=numAttributes; m_attrIdxs=new int[numAttributes]; for(int i = 0;i< numAttributes;i++){ m_attrIdxs[i]=i; } } public void buildMetric(int numAttributes, String[] options) throws Exception{ buildMetric(numAttributes); } public void buildMetric(Instances data) throws Exception{ m_numAttributes=data.numAttributes(); m_classIndex=data.classIndex(); if(m_classIndex!=-1)m_numAttributes--; System.out.println("About to build metric with " +m_numAttributes+ " attributes"); buildMetric(m_numAttributes); } public double distance(Instance instance1,Instance instance2) throws Exception{ return distanceNonWeighted(instance1,instance2); } public double similarity(Instance instance1,Instance instance2) throws Exception{ return similarityNonWeighted(instance1,instance2); } public double penalty(Instance instance1,Instance instance2) throws Exception{ double distance=distance(instance1,instance2); return distance*distance; } public double penaltySymmetric(Instance instance1,Instance instance2) throws Exception{ return penalty(instance1,instance2); } public double distanceNonWeighted(Instance instance1,Instance instance2) throws Exception{ double value1,value2,diff,distance=0; double [] values1=instance1.toDoubleArray(); double [] values2=instance2.toDoubleArray(); for (int i=0;i<values1.length;i++){ if(i==m_classIndex)continue; diff=values1[i]-values2[i]; distance+=diff*diff; } distance=Math.sqrt(distance); return distance; } public double similarityNonWeighted(Instance instance1,Instance instance2) throws Exception{ return 1/(1+distanceNonWeighted(instance1,instance2)); } public boolean isDistanceBased(){ return true; } }