/** * Created on May 18, 2006 * @author Vitor R. Carvalho */ package edu.cmu.minorthird.classify; import java.util.*; /** * Multi-class version of a binary classifier; Generalizes OneVsAllLearner. * OneVsAll allows one class with positive labels for each example, and the rest with negative labels. * In ManyVsRest, in each example many classes may be positive. * * @author Vitor Carvalho. */ public class ManyVsRestLearner extends OneVsAllLearner{ public ManyVsRestLearner() { super(); } public ManyVsRestLearner(BatchClassifierLearner learner1) { super(learner1); } public ManyVsRestLearner(String learnerName) { super(learnerName); } @Override public ClassifierLearner copy() { ManyVsRestLearner learner = null; try { learner =(ManyVsRestLearner)(this.clone()); if(innerLearner!= null) { learner.innerLearner.clear(); for (int i=0; i<innerLearner.size(); i++) { ClassifierLearner inner = (innerLearner.get(i)); learner.innerLearner.add(inner.copy()); } } } catch (Exception e) { System.out.println("Can't CLONE ManyVsRestLearner!!"); e.printStackTrace(); } return learner; } @Override public void addExample(Example answeredQuery) { Set<String> possibleLabels = answeredQuery.getLabel().possibleLabels(); for (int i=0; i<innerLearner.size(); i++) { boolean positive = possibleLabels.contains(schema.getClassName(i)); ClassLabel label = positive ? ClassLabel.positiveLabel(1.0) : ClassLabel.negativeLabel(-1.0); ((innerLearner.get(i))).addExample( new Example( answeredQuery.asInstance(), label ) ); } } }