package tr.gov.ulakbim.jDenetX.core; import tr.gov.ulakbim.jDenetX.AbstractMOAObject; import weka.core.*; import weka.core.logging.Logger; import java.util.ArrayList; /** * Created by IntelliJ IDEA. * User: caglar * Date: Oct 18, 2010 * Time: 9:42:50 AM * To change this template use File | Settings | File Templates. */ public class EuclideanSimilarityDiscoverer extends AbstractMOAObject { private Instances SimilarityInstances; private ArrayList<Attribute> AttList; private static final int DefaultCapacity = 2; private Instance Center; private static int ProcessedInstances = 0; public EuclideanSimilarityDiscoverer(ArrayList<Attribute> attList) { AttList = attList; SimilarityInstances = new Instances("similarity_insts", attList, DefaultCapacity); SimilarityInstances.setClassIndex(attList.size() - 1); Center = new DenseInstance(attList.size()); } public void addInstance(Instance inst) { if (SimilarityInstances.size() == 0) { SimilarityInstances.add(inst); for (int i = 0; i < Center.numAttributes(); i++) { Center.setValue(i, inst.value(i)); } } else { if (SimilarityInstances.size() == 1) { SimilarityInstances.add(1, inst); } else { SimilarityInstances.set(1, inst); } try { ProcessedInstances++; Center = getCenter(); } catch (Exception e) { Logger.log(Logger.Level.WARNING, e.getMessage()); } SimilarityInstances.set(0, Center); } } protected Instance getCenter() throws Exception { if (SimilarityInstances.size() > 0) { Center = new DenseInstance(SimilarityInstances.numAttributes()); Center.setDataset(SimilarityInstances); final double InstanceWeight = 1 / ProcessedInstances; final double CenterWeight = 1 - InstanceWeight; SimilarityInstances.get(0).setWeight(CenterWeight); SimilarityInstances.get(1).setWeight(InstanceWeight); for (int i = 0; i < Center.numAttributes() - 1; i++) { Center.setValue(i, SimilarityInstances.meanOrMode(i)); } } else { throw new Exception("Warning SimilarityInstances is empty, can't find the center!"); } return Center; } public double findDistanceToCenteroid(Instance inst) { double distance = 0.0; try { Center = SimilarityInstances.firstInstance(); if (Center != null) { EuclideanDistance eucDistFun = new EuclideanDistance(); eucDistFun.setInstances(SimilarityInstances); distance = eucDistFun.distance(inst, Center); } else { throw new NullPointerException("Center is null!"); } } catch (Exception e) { Logger.log(Logger.Level.WARNING, e.getMessage()); e.printStackTrace(); System.out.println("Center" + Center); System.out.println("Instance" + inst); } return distance; } public void clear() { if (SimilarityInstances != null || SimilarityInstances.size() > 0) { SimilarityInstances.clear(); } } public int size() { return SimilarityInstances.size(); } @Override public void getDescription(StringBuilder sb, int indent) { //To change body of implemented methods use File | Settings | File Templates. } /** * MultilabelInstancesHeader. */ public static class MultilabelInstancesHeader extends InstancesHeader { private int m_NumLabels = -1; public MultilabelInstancesHeader(Instances i, int numLabels) { super(i); m_NumLabels = numLabels; } public int getNumClassLabels() { return m_NumLabels; } } }