KernelRBF.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. /**
  2. * @file KernelRBF.cpp
  3. * @brief Interface for the popular exponential mercer kernels
  4. * @author Erik Rodner
  5. * @date 10/24/2007
  6. */
  7. #include <iostream>
  8. #include <math.h>
  9. #include "KernelRBF.h"
  10. using namespace OBJREC;
  11. using namespace std;
  12. using namespace NICE;
  13. KernelRBF::KernelRBF( double loggamma, double _noise )
  14. {
  15. gammasq = exp(2*loggamma);
  16. noise = _noise;
  17. }
  18. KernelRBF::KernelRBF ( const KernelRBF & src )
  19. {
  20. gammasq = src.gammasq;
  21. noise = src.noise;
  22. }
  23. KernelRBF::~KernelRBF()
  24. {
  25. }
  26. KernelRBF *KernelRBF::clone(void) const
  27. {
  28. return new KernelRBF ( *this );
  29. }
  30. double KernelRBF::K (const NICE::Vector & x, const NICE::Vector & y) const
  31. {
  32. if ( x.size() != y.size() ) {
  33. cerr << "KernelRBF: dimensions: " << x.size() << " vs " << y.size() << endl;
  34. fthrow(Exception, "Vector dimensions do not match!");
  35. }
  36. double dist = 0.0;
  37. for ( size_t i = 0 ; i < x.size() ; i++ )
  38. {
  39. double d = x[i] - y[i];
  40. dist += d*d;
  41. }
  42. return exp( - dist / gammasq );
  43. }
  44. void KernelRBF::updateKernelData ( KernelData *kernelData ) const
  45. {
  46. const NICE::Matrix & quadraticDistances = kernelData->getCachedMatrix ( KernelData::QUADRATIC_DISTANCES );
  47. NICE::Matrix & kernelMatrix = kernelData->getKernelMatrix();
  48. kernelMatrix.resize ( quadraticDistances.rows(), quadraticDistances.cols() );
  49. for ( size_t i = 0 ; i < kernelMatrix.rows(); i++ )
  50. for ( size_t j = 0 ; j < kernelMatrix.cols(); j++ )
  51. {
  52. double dist = quadraticDistances(i,j);
  53. kernelMatrix(i,j) = exp ( - dist / gammasq );
  54. }
  55. kernelMatrix.addIdentity ( noise );
  56. }
  57. void KernelRBF::calcKernelData ( const VVector & X, KernelData *kernelData ) const
  58. {
  59. CachedQuadraticDistances::calcKernelData ( X, kernelData );
  60. if ( noise != 0.0 ) {
  61. cerr << "KernelRBF: adding some noise" << endl;
  62. kernelData->getKernelMatrix().addIdentity(noise);
  63. }
  64. }
  65. void KernelRBF::getKernelJacobi ( size_t parameter, const NICE::Vector & parameters, const KernelData *kernelData, NICE::Matrix & jacobiMatrix ) const
  66. {
  67. // double _gammasq = exp(2*parameters[0]);
  68. const NICE::Matrix & kernelMatrix = kernelData->getKernelMatrix();
  69. jacobiMatrix.resize ( kernelMatrix.rows(), kernelMatrix.cols() );
  70. if ( parameter == 0 ) {
  71. for ( size_t i = 0 ; i < kernelMatrix.rows(); i++ )
  72. for ( size_t j = 0 ; j < kernelMatrix.cols(); j++ )
  73. {
  74. double K = kernelMatrix(i,j);
  75. if ( almostZero(K) )
  76. jacobiMatrix(i,j) = 0.0;
  77. else
  78. jacobiMatrix(i,j) = - K * 2.0 * log (K);
  79. }
  80. } else{
  81. fthrow(Exception, "Wrong parameter index!");
  82. }
  83. }
  84. void KernelRBF::setParameters( const NICE::Vector & newParameters )
  85. {
  86. gammasq = exp(2*newParameters[0]);
  87. }
  88. void KernelRBF::getParameters( NICE::Vector & newParameters ) const
  89. {
  90. newParameters.resize(1);
  91. newParameters[0] = 0.5 * log(gammasq);
  92. }