package weka.core.metrics; import java.util.ArrayList; import java.io.Serializable; import weka.core.*; public class DotP extends Metric{ public void buildMetric(int numAttributes) throws Exception{ m_numAttributes=numAttributes; System.out.println("About to build metric with "+m_numAttributes+" attributes"); } 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--; 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 similarity=similarity(instance1,instance2); return 1-similarity; } public double penaltySymmetric(Instance instance1,Instance instance2) throws Exception{ return penalty(instance1,instance2); } public double distanceNonWeighted(Instance instance1,Instance instance2) throws Exception{ return 1/(1+similarityNonWeighted(instance1,instance2)); } public double similarityNonWeighted(Instance instance1,Instance instance2) throws Exception{ double similarity=0; double [] values1=instance1.toDoubleArray(); double [] values2=instance2.toDoubleArray(); double length1=0,length2=0; for (int i=0;i<values1.length;i++){ if(i==m_classIndex)continue; similarity+=values1[i]*values2[i]; length1+=values1[i]*values1[i]; length2+=values2[i]*values2[i]; } if(length1!=0&&length2!=0){ similarity/=Math.sqrt(length1)*Math.sqrt(length2); } return similarity; } public boolean isDistanceBased(){ return false; } }