KernelRBF.cpp 2.8 KB

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