/* Copyright 2003, Carnegie Mellon, All Rights Reserved */
package edu.cmu.minorthird.classify;
import java.io.Serializable;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import edu.cmu.minorthird.util.gui.ComponentViewer;
import edu.cmu.minorthird.util.gui.SmartVanillaViewer;
import edu.cmu.minorthird.util.gui.Viewer;
import edu.cmu.minorthird.util.gui.Visible;
/** A Classifier composed of a bunch of binary classifiers, each of
* which separates one class from the others.
*
* @author William Cohen
*/
public class OneVsAllClassifier implements Classifier,Visible,Serializable{
//private static Logger log=Logger.getLogger(OneVsAllClassifier.class);
static private final long serialVersionUID = 1;
private String[] classNames;
private Classifier[] binaryClassifiers;
/** Create a OneVsAllClassifier.
*/
public OneVsAllClassifier(String[] classNames,Classifier[] binaryClassifiers) {
if (classNames.length!=binaryClassifiers.length) {
throw new IllegalArgumentException("arrays must be parallel");
}
this.classNames = classNames;
this.binaryClassifiers = binaryClassifiers;
}
public Classifier[] getBinaryClassifiers() { return binaryClassifiers; }
@Override
public ClassLabel classification(Instance instance){
ClassLabel classLabel = new ClassLabel();
for (int i=0; i<classNames.length; i++){
classLabel.add(classNames[i],binaryClassifiers[i].classification(instance).posWeight());
}
return classLabel;
}
@Override
public String explain(Instance instance)
{
StringBuffer buf = new StringBuffer("");
for (int i=0; i<binaryClassifiers.length; i++) {
buf.append("score for "+classNames[i]+": ");
buf.append( binaryClassifiers[i].explain(instance) );
buf.append( "\n" );
}
buf.append( "classification = "+classification(instance).toString() );
return buf.toString();
}
@Override
public Explanation getExplanation(Instance instance) {
Explanation.Node top = new Explanation.Node("OneVsAll Explanation");
for (int i=0; i<binaryClassifiers.length; i++) {
Explanation.Node binClassifierNode = new Explanation.Node(classNames[i] + " Tree");
Explanation.Node explanation = binaryClassifiers[i].getExplanation(instance).getTopNode();
binClassifierNode.add(explanation);
top.add(binClassifierNode);
}
Explanation ex = new Explanation(top);
return ex;
}
public String[] getClassNames() { return classNames; }
@Override
public String toString() {
StringBuffer buf = new StringBuffer("[OneVsAllClassifier:\n");
for (int i=0; i<classNames.length; i++) {
buf.append(classNames[i]+": "+binaryClassifiers[i]+"\n");
}
buf.append("end OneVsAllClassifier]\n");
return buf.toString();
}
@Override
public Viewer toGUI()
{
final Viewer v = new ComponentViewer() {
static final long serialVersionUID=20071015;
@Override
public JComponent componentFor(Object o) {
OneVsAllClassifier c = (OneVsAllClassifier)o;
JPanel panel = new JPanel();
for (int i=0; i<c.classNames.length; i++) {
panel.add(new JLabel(c.classNames[i]));
Viewer subView = new SmartVanillaViewer();
subView.setContent( c.binaryClassifiers[i] );
subView.setSuperView(this);
panel.add(subView);
}
return new JScrollPane(panel);
}
};
v.setContent(this);
return v;
}
}