001    /*
002     * JNI_SVM-light - A Java Native Interface for SVM-light
003     * 
004     * Copyright (C) 2005 
005     * Tom Crecelius & Martin Theobald 
006     * Max-Planck Institute for Computer Science
007     * 
008     * This program is free software; you can redistribute it and/or modify it under
009     * the terms of the GNU General Public License as published by the Free Software
010     * Foundation.
011     * 
012     * This program is distributed in the hope that it will be useful, but WITHOUT
013     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
014     * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
015     * details.
016     * 
017     * You should have received a copy of the GNU General Public License along with
018     * this program; if not, write to the Free Software Foundation, Inc., 51
019     * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
020     */
021    
022    package jnisvmlight;
023    
024    /**
025     * A radial base kernel.
026     * 
027     * @author Tom Crecelius & Martin Theobald
028     */
029    public class RadialBaseKernel extends Kernel {
030    
031      private double m_width;
032    
033      protected RadialBaseKernel() {
034        this(new LinearKernel(), 1.0);
035      }
036    
037      public RadialBaseKernel(Kernel nestedKernel, double width) {
038        super(nestedKernel);
039        this.m_width = width;
040      }
041    
042      public double evaluate(FeatureVector v1, FeatureVector v2) {
043        return Math.exp(-Math.abs(2.0 * m_kernel.evaluate(v1, v2)
044            - m_kernel.evaluate(v1, v1) - m_kernel.evaluate(v2, v2))
045            / (2.0 * m_width * m_width));
046      }
047    
048      public double getWidth() {
049        return m_width;
050      }
051    
052      public void setWidth(double width) {
053        this.m_width = width;
054      }
055    
056      public String toString() {
057        return "Radial base kernel K(x, k) = exp(-abs(k(x,x) - k(y,y)) / (2*"
058            + m_width + "^2)" + "; k = " + m_kernel.toString();
059      }
060    }