package arida.ufc.br.moap.optics; import java.util.List; import arida.ufc.br.moap.clustering.api.ICluster; import arida.ufc.br.moap.core.imp.Reporter; import arida.ufc.br.moap.core.imp.Reporter.ReporterLevel; import arida.ufc.br.moap.function.api.IDistanceFunction; public class OpticsEvaluation { private final Reporter reporter = new Reporter(this.getClass()); public void evaluate(Optics<Object> optics){ this.reporter.setReport("Optics evaluation", ReporterLevel.INFO ); int nClusters = optics.getResult().getInstances().size()-1; System.out.println("Optics Evaluation:"); System.out.println("N of clusters "+nClusters); for(Object object : optics.getResult().getInstances()){ @SuppressWarnings("unchecked") ICluster<Object> cluster = (ICluster<Object>)object; if(cluster.getId() != Optics.NOISE_ID){ System.out.println("Cluster "+cluster.getId()+" with "+cluster.getObjects().size()+" members"); } else{ System.out.println("Noise "+cluster.getObjects().size()); } } double intraCluster = intraClusterDistance(optics); System.out.println("Intra-Cluster Distance: "+intraCluster); } private double intraClusterDistance(Optics<Object> optics){ // List<Object> list = new ArrayList<>(); // list.add(opt) double avg = 0.0; int count = 0; IDistanceFunction<Object> df = optics.getDistanceFunction(); for(Object object : optics.getResult().getInstances()){ @SuppressWarnings("unchecked") ICluster<Object> cluster = (ICluster<Object>)object; List<Object> list = cluster.getObjects(); int size = list.size(); for(int i=0;i<size;i++){ Object m1 = list.get(i); for(int j=i+1;j<size;j++){ Object m2 = list.get(j); avg += df.evaluate(m1, m2); count++; } } } return (double)avg/count; } }