KernelExp.cpp 3.0 KB

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