PLearn 0.1
EpanechnikovKernel.cc
Go to the documentation of this file.
00001 // -*- C++ -*-
00002 
00003 // EpanechnikovKernel.cc
00004 //
00005 // Copyright (C) 2004 Nicolas Chapados 
00006 // 
00007 // Redistribution and use in source and binary forms, with or without
00008 // modification, are permitted provided that the following conditions are met:
00009 // 
00010 //  1. Redistributions of source code must retain the above copyright
00011 //     notice, this list of conditions and the following disclaimer.
00012 // 
00013 //  2. Redistributions in binary form must reproduce the above copyright
00014 //     notice, this list of conditions and the following disclaimer in the
00015 //     documentation and/or other materials provided with the distribution.
00016 // 
00017 //  3. The name of the authors may not be used to endorse or promote
00018 //     products derived from this software without specific prior written
00019 //     permission.
00020 // 
00021 // THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
00022 // IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
00023 // OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
00024 // NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
00025 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
00026 // TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
00027 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
00028 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00029 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00030 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00031 // 
00032 // This file is part of the PLearn library. For more information on the PLearn
00033 // library, go to the PLearn Web site at www.plearn.org
00034 
00035 /* *******************************************************      
00036  * $Id: EpanechnikovKernel.cc 3994 2005-08-25 13:35:03Z chapados $ 
00037  ******************************************************* */
00038 
00039 // Authors: Nicolas Chapados
00040 
00044 #include "EpanechnikovKernel.h"
00045 
00046 namespace PLearn {
00047 using namespace std;
00048 
00049 EpanechnikovKernel::EpanechnikovKernel()
00050     : gamma(1)
00051 {
00052 }
00053 
00054 PLEARN_IMPLEMENT_OBJECT(
00055     EpanechnikovKernel,
00056     "Classical Epanechnikov kernel for local regression",
00057     "The Epanechnikov kernel is very appropriate for locally-weighted regression\n"
00058     "and nearest-neighbors problems.  It is designed to have finite support, unlike\n"
00059     "the GaussianKernel, and integrates to 1. \n"
00060     "(For examples of use, see KNNRegressor, KNNClassifier, and\n"
00061     "classes derived from GenericNearestNeighbors.)\n"
00062     "\n"
00063     "In each dimension, the Epanechnikov kernel is defined as follows:\n"
00064     "    K_gamma(x0,x) = D(|x-x0|/gamma) \n"
00065     "where\n"
00066     "    D(t) = 3/4 (1-t^2),   if |t| <= 1;\n"
00067     "         = 0          ,   otherwise,\n"
00068     "with the user-specified gamma a smoothing parameter.\n");
00069 
00070 
00072 // declareOptions //
00074 void EpanechnikovKernel::declareOptions(OptionList& ol)
00075 {
00076     declareOption(ol, "gamma", &EpanechnikovKernel::gamma,
00077                   OptionBase::buildoption,
00078                   "Smoothing parameter for the Epanechnikov kernel (default=1.0)");
00079 
00080     // Now call the parent class' declareOptions
00081     inherited::declareOptions(ol);
00082 }
00083 
00085 // build //
00087 void EpanechnikovKernel::build()
00088 {
00089     // ### Nothing to add here, simply calls build_
00090     inherited::build();
00091     build_();
00092 }
00093 
00095 // build_ //
00097 void EpanechnikovKernel::build_()
00098 {
00099     if (gamma <= 0.0)
00100         PLERROR("EpanechnikovKernel::build_: the 'gamma' option must be strictly positive");
00101 }
00102 
00104 // evaluate //
00106 real EpanechnikovKernel::evaluate(const Vec& x1, const Vec& x2) const
00107 {
00108     real t = L2distance(x1,x2) / gamma;
00109     if (t <= 1.0)
00110         return 3 * (1-t*t) / 4;
00111     return 0;
00112 }
00113 
00115 // makeDeepCopyFromShallowCopy //
00117 void EpanechnikovKernel::makeDeepCopyFromShallowCopy(CopiesMap& copies)
00118 {
00119     inherited::makeDeepCopyFromShallowCopy(copies);
00120 }
00121 
00122 } // end of namespace PLearn
00123 
00124 
00125 /*
00126   Local Variables:
00127   mode:c++
00128   c-basic-offset:4
00129   c-file-style:"stroustrup"
00130   c-file-offsets:((innamespace . 0)(inline-open . 0))
00131   indent-tabs-mode:nil
00132   fill-column:79
00133   End:
00134 */
00135 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=79 :
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines