package cc.mallet.cluster.neighbor_evaluator;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import cc.mallet.classify.Classifier;
import cc.mallet.types.Instance;
import cc.mallet.types.LabelVector;
/**
* Uses a {@link Classifier} that scores an array of {@link
* Neighbor}s. The Classifier expects {@link Instance}s with data
* equal to an array of {@link Neighbor}s. The labeling of each
* Instance is a set of {@link Integer}s, with labeling i
* corresponding the likelihood that {@link Neighbor} i is the "best"
* {@link Neighbor}.
*
* @author "Aron Culotta" <culotta@degas.cs.umass.edu>
* @version 1.0
* @since 1.0
* @see ClassifyingNeighborEvaluator
*/
public class RankingNeighborEvaluator extends ClassifyingNeighborEvaluator {
/**
*
* @param classifier The Classifier used to assign a score to a {@link Neighbor}.
* @return
*/
public RankingNeighborEvaluator (Classifier classifier) {
super(classifier, null);
}
public double evaluate (Neighbor neighbor) {
throw new UnsupportedOperationException("This class expects an array of Neighbors to choose from");
}
/**
*
* @param neighbors
* @return An array containing a score for each of the elements of <code>neighbors</code>.
*/
public double[] evaluate (Neighbor[] neighbors) {
double[] scores = new double[neighbors.length];
LabelVector ranks = classifier.classify(neighbors).getLabelVector();
for (int i = 0; i < ranks.numLocations(); i++) {
int idx = ((Integer)ranks.getLabelAtRank(i).getEntry()).intValue();
scores[idx] = ranks.getValueAtRank(i);
}
return scores;
}
public void reset () { }
public String toString () {
return "class=" + this.getClass().getName() +
" classifier=" + classifier.getClass().getName();
}
// SERIALIZATION
private static final long serialVersionUID = 1;
private static final int CURRENT_SERIAL_VERSION = 1;
private void writeObject (ObjectOutputStream out) throws IOException {
out.defaultWriteObject ();
out.writeInt (CURRENT_SERIAL_VERSION);
}
private void readObject (ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject ();
int version = in.readInt ();
}
}