KernelLinearCombination.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. /**
  2. * @file KernelLinearCombination.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 "KernelLinearCombination.h"
  10. using namespace OBJREC;
  11. using namespace std;
  12. using namespace NICE;
  13. KernelLinearCombination::KernelLinearCombination( uint num, bool _exponential )
  14. : alpha ( num ), exponential(_exponential)
  15. {
  16. for ( uint i = 0 ; i < num ; i++ )
  17. alpha[i] = - log((double)num);
  18. }
  19. KernelLinearCombination::KernelLinearCombination ( const KernelLinearCombination & src )
  20. {
  21. alpha.resize ( src.alpha.size() );
  22. alpha = src.alpha;
  23. exponential = src.exponential;
  24. }
  25. KernelLinearCombination::~KernelLinearCombination()
  26. {
  27. }
  28. KernelLinearCombination *KernelLinearCombination::clone(void) const
  29. {
  30. return new KernelLinearCombination ( *this );
  31. }
  32. double KernelLinearCombination::K (const NICE::Vector & x, const NICE::Vector & y) const
  33. {
  34. fthrow(Exception, "Unable to calculate kernel values directly.");
  35. }
  36. void KernelLinearCombination::updateKernelData ( KernelData *kernelData ) const
  37. {
  38. NICE::Matrix & kernelMatrix = kernelData->getKernelMatrix();
  39. for ( uint k = 0 ; k < alpha.size(); k++ )
  40. {
  41. const NICE::Matrix & cachedMatrix = kernelData->getCachedMatrix ( k );
  42. if ( k == 0 ) {
  43. kernelMatrix.resize ( cachedMatrix.rows(), cachedMatrix.cols() );
  44. kernelMatrix.set(0.0);
  45. }
  46. kernelMatrix += exp(alpha[k]) * cachedMatrix;
  47. }
  48. if ( exponential ) {
  49. for ( uint i = 0 ; i < kernelMatrix.rows(); i++ )
  50. for ( uint j = 0 ; j < kernelMatrix.cols(); j++ )
  51. kernelMatrix(i,j) = exp(- kernelMatrix(i,j));
  52. }
  53. }
  54. void KernelLinearCombination::getKernelJacobi ( size_t parameter, const NICE::Vector & parameters, const KernelData *kernelData, NICE::Matrix & jacobiMatrix ) const
  55. {
  56. const NICE::Matrix & kernelMatrix = kernelData->getKernelMatrix();
  57. if ( parameter >= alpha.size() )
  58. fthrow(Exception, "Parameter index exceeds parameter vector size" );
  59. jacobiMatrix.resize ( kernelMatrix.rows(), kernelMatrix.cols() );
  60. const Matrix & kernelMatrixParameter = kernelData->getCachedMatrix( parameter );
  61. if ( exponential ) {
  62. for ( uint i = 0 ; i < jacobiMatrix.rows(); i++ )
  63. for ( uint j = 0 ; j < jacobiMatrix.cols(); j++ )
  64. jacobiMatrix(i,j) = - kernelMatrixParameter(i,j) * exp(alpha[parameter]) * kernelMatrix(i,j);
  65. } else {
  66. jacobiMatrix = exp(alpha[parameter]) * kernelMatrixParameter;
  67. }
  68. }
  69. void KernelLinearCombination::setParameters( const NICE::Vector & newParameters )
  70. {
  71. alpha = newParameters;
  72. }
  73. void KernelLinearCombination::getParameters( NICE::Vector & newParameters ) const
  74. {
  75. newParameters.resize ( alpha.size() );
  76. newParameters = alpha;
  77. }