KernelExp.cpp 3.1 KB

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