PLearn 0.1
|
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 :