source: trunk/c++_tools/classifier/GaussianKernelFunction.cc @ 627

Last change on this file since 627 was 627, checked in by Peter, 15 years ago

fixes #124 also extended interface of AveragerPairWeighted? supporting DataLookupWeighted1D

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date ID
File size: 2.6 KB
Line 
1// $Id$
2
3#include <c++_tools/classifier/GaussianKernelFunction.h>
4
5#include <c++_tools/classifier/KernelFunction.h>
6#include <c++_tools/classifier/DataLookup1D.h>
7#include <c++_tools/classifier/DataLookupWeighted1D.h>
8
9#include <math.h>
10
11namespace theplu {
12namespace classifier { 
13
14  GaussianKernelFunction::GaussianKernelFunction(double sigma) 
15    : KernelFunction(), sigma2_(sigma*sigma)
16  {
17  }
18
19  double GaussianKernelFunction::operator()(const DataLookup1D& x,
20                                            const DataLookup1D& y) const
21  {
22    assert(x.size()==y.size());
23    double d2 = 0;
24    for (size_t i=0; i<x.size(); i++){
25      double d = x(i)-y(i);
26      d2 += d*d;
27    }
28    return exp(-d2/sigma2_); 
29  }
30
31
32  double GaussianKernelFunction::operator()(const DataLookup1D& x,
33                                            const DataLookupWeighted1D& y) const
34  {
35    assert(x.size()==y.size());
36    double d2 = 0;
37    double normalization_factor = 0;
38    for (size_t i=0; i<x.size(); i++) {
39      // ignoring Nan with accompanied weight zero
40      if (y.weight(i)){
41        d2 += y.weight(i) * (x(i)-y.data(i)) * (x(i)-y.data(i));
42        normalization_factor += y.weight(i);
43      }
44    }
45    // to make it coherent with no weight case
46    normalization_factor /= x.size(); 
47    return exp(d2/normalization_factor/sigma2_);
48  }
49
50
51  double GaussianKernelFunction::operator()(const DataLookupWeighted1D& x,
52                                            const DataLookupWeighted1D& y) const
53  {
54    assert(x.size()==y.size());
55    double d2 = 0;
56    double normalization_factor = 0;
57    for (size_t i=0; i<x.size(); i++) {
58      // ignoring Nan with accompanied weight zero
59      if (x.weight(i) && y.weight(i)){
60        d2 += x.weight(i) * y.weight(i) * (x.data(i)-y.data(i)) * 
61          (x.data(i)-y.data(i));
62        normalization_factor += x.weight(i) * y.weight(i);
63      }
64    }
65    // to make it coherent with no weight case
66    normalization_factor /= x.size(); 
67    return exp(d2/normalization_factor/sigma2_);
68  }
69
70
71  double GaussianKernelFunction::operator()(const DataLookup1D& a1,
72                                            const DataLookup1D& a2,
73                                            const DataLookup1D& w1,
74                                            const DataLookup1D& w2) const   
75  {
76    assert(a1.size()==a2.size());
77    assert(w1.size()==w2.size());
78    assert(a1.size()==w1.size());
79    double d2 = 0;
80    double normalization_factor = 0;
81    for (size_t i=0; i<a1.size(); i++) {
82      // ignoring Nan with accompanied weight zero
83      if (w1(i) && w2(i)){
84        d2 += w1(i) * w2(i) * (a1(i)-a2(i)) * (a1(i)-a2(i));
85        normalization_factor += w1(i) * w2(i);
86      }
87    }
88    // to make it coherent with no weight case
89    normalization_factor /= a1.size(); 
90    return exp(d2/normalization_factor/sigma2_);
91  }
92 
93
94
95}} // of namespace svn and namespace theplu
Note: See TracBrowser for help on using the repository browser.