package weka.clusterers.initializers;
import java.io.*;
import java.util.*;
import weka.core.*;
import weka.clusterers.*;
import weka.core.metrics.*;
public class FurthestInitializer extends Initializer{
Instances instances;
Metric metric;
boolean [] selected;
public void setClusterer(Clusterer clusterer) throws Exception{
super.setClusterer(clusterer);
instances=clusterer.instances;
metric=clusterer.metric;
selected=new boolean[instances.numInstances()];
}
public Instances initialize() throws Exception{
Instances centroids=new Instances(instances,0);
int index;
for(int i=0;i<numClusters;i++){
index=furthest();
centroids.add(instances.instance(index));
selected[index]=true;
System.out.println("FurthestInitializer.initialize centroid "+i+" : "+index);
}
return centroids;
}
public int getUnselectedIndex(){
Random random=new Random();
int index;
do{
index=random.nextInt(instances.numInstances());
}while(selected[index]);
return index;
}
public double distance(Instance instance) throws Exception{
double nearest=Double.POSITIVE_INFINITY,distance;
for(int i=0;i<selected.length;i++)if(selected[i]){
distance=metric.distance(instances.instance(i),instance);
if(distance<nearest){
nearest=distance;
}
}
return nearest;
}
public int furthest() throws Exception{
ArrayList indexes=new ArrayList();
double furthest=Double.NEGATIVE_INFINITY,distance;
for(int i=0;i<selected.length;i++)if(!selected[i]){
distance=distance(instances.instance(i));
if(distance>=furthest){
furthest=distance;
indexes.add(new Integer(i));
}
}
Random random=new Random();
int index=random.nextInt(indexes.size());
index=((Integer)(indexes.get(index))).intValue();
return index;
}
}