/* * BioJava development code * * This code may be freely distributed and modified under the * terms of the GNU Lesser General Public Licence. This should * be distributed with the code. If you do not have a copy, * see: * * http://www.gnu.org/copyleft/lesser.html * * Copyright for this code is held jointly by the individual * authors. These should be listed in @author doc comments. * * For more information on the BioJava project and its aims, * or to join the biojava-l mailing list, visit the home page * at: * * http://www.biojava.org/ * */ package org.biojava.stats.svm; import java.util.HashSet; import java.util.Set; /** * Adds a class specific constant to k(x, x). * * @author Matthew Pocock */ public class DiagonalAddKernel extends NestedKernel { private Set posClass; private Set negClass; { posClass = new HashSet(); negClass = new HashSet(); } public void addPos(Object o) { posClass.add(o); } public void addNeg(Object o) { negClass.add(o); } /** * The scale vactor. */ private double lambda = 1.0; /** * Set the scale factor. * * @param l the new scale factor */ public void setLambda(double l) { this.lambda = l; } /** * Retrieve the scale factor. * * @return the current scale factor */ public double getLambda() { return lambda; } /** * Return the dot product of a, b. *
* This is equal to
* k(a, b) + d(a, b) * ||class(a)|| / (||class||)
* where d(a, b) is zero if a != b, and 1 if a == b. class(a) is the set of all
* items in the same class as a. class is all items with a classification.
*/
public double evaluate(Object a, Object b) {
double dot = getNestedKernel().evaluate(a, b);
if(a == b) {
int size = 0;
if(posClass.contains(a)) {
size = posClass.size();
} else if(negClass.contains(a)) {
size = negClass.size();
}
dot += getLambda() * size / (posClass.size() + negClass.size());
}
return dot;
}
public String toString() {
return
"DiagonalAdd K(a, b | l, s+, s-, k) = k(a, b) + d[a, b]; d[a, b] = " +
"{ a != b, 0; a == b, l * {class(a == +), s+; class(a == -), s-} }; k = " +
getNestedKernel().toString();
}
}