testKernelOptimization.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. /**
  2. * @file testKernelOptimization.cpp
  3. * @brief test kernel optimization
  4. * @author Erik Rodner
  5. * @date 12/08/2009
  6. */
  7. #include <sstream>
  8. #include "core/basics/Config.h"
  9. #include "vislearning/cbaselib/LabeledSet.h"
  10. #include "vislearning/math/kernels/KernelExp.h"
  11. #include "vislearning/regression/gpregression/GPRegressionOptimizationProblem.h"
  12. using namespace std;
  13. using namespace OBJREC;
  14. using namespace NICE;
  15. void testOverallDeriv ( KernelData *kernelData, const VVector & y, ParameterizedKernel & kernelFunction, const Vector & iparameters, double step, double interval )
  16. {
  17. double a_max = 0.0;
  18. bool firstIteration = true;
  19. double oldObj = 0.0;
  20. GPRegressionOptimizationProblem gp_problem ( kernelData, y, &kernelFunction, true, NULL );
  21. for ( double s = -interval ; s <= interval ; s+=step )
  22. {
  23. Vector parameters ( iparameters );
  24. parameters[0] += s;
  25. gp_problem.setParameters( parameters );
  26. double obj = gp_problem.computeObjective ( );
  27. Vector gradient;
  28. gp_problem.computeGradient( gradient );
  29. double deriv = gradient[0];
  30. if ( ! firstIteration )
  31. {
  32. double derivApprox = ( obj - oldObj ) / step;
  33. double a = fabs(deriv - derivApprox);
  34. if ( a > a_max )
  35. a_max = a;
  36. cerr << "EVAL: " << parameters[0] << " objective " << obj << " D(closedform) " << deriv << " D(approximated) " << derivApprox << endl;
  37. }
  38. firstIteration = false;
  39. oldObj = obj;
  40. }
  41. cerr << "Maximum difference between real derivative and approximation: " << a_max << endl;
  42. }
  43. void testKernelDeriv ( KernelData *kernelData, ParameterizedKernel & kernelFunction, const Vector & iparameters, double step )
  44. {
  45. double oldKernelSum = 0.0;
  46. bool firstIteration = true;
  47. double a_max = 0.0;
  48. for ( double s = -1.0 ; s <= 1.0 ; s+=step )
  49. {
  50. Vector parameters ( iparameters );
  51. parameters[0] += s;
  52. //cerr << parameters << endl;
  53. kernelFunction.setParameters ( parameters );
  54. kernelFunction.updateKernelData ( kernelData );
  55. Matrix jacobiMatrix;
  56. kernelFunction.getKernelJacobi ( 0, parameters, kernelData, jacobiMatrix );
  57. const Matrix & kernelMatrix = kernelData->getKernelMatrix();
  58. double kernelSum = 0.0;
  59. double derivSum = 0.0;
  60. for ( uint i = 0 ; i < kernelMatrix.rows() ; i++ )
  61. for ( uint j = 0 ; j < kernelMatrix.cols(); j++ )
  62. {
  63. kernelSum += kernelMatrix(i,j);
  64. derivSum += jacobiMatrix(i,j);
  65. }
  66. kernelSum /= kernelMatrix.rows() * kernelMatrix.cols();
  67. derivSum /= kernelMatrix.rows() * kernelMatrix.cols();
  68. if ( ! firstIteration )
  69. {
  70. double derivApprox = ( kernelSum - oldKernelSum ) / step;
  71. double a = fabs(derivSum - derivApprox);
  72. if ( a > a_max )
  73. a_max = a;
  74. //cerr << "K " << kernelSum << " D " << derivSum << " Diff " << ( kernelSum - oldKernelSum ) / step << endl;
  75. }
  76. firstIteration = false;
  77. oldKernelSum = kernelSum;
  78. }
  79. cerr << "Maximum difference between real derivative and approximation: " << a_max << endl;
  80. }
  81. /**
  82. test kernel optimization
  83. */
  84. int main (int argc, char **argv)
  85. {
  86. #ifndef __clang__
  87. #ifndef __llvm__
  88. std::set_terminate(__gnu_cxx::__verbose_terminate_handler);
  89. #endif
  90. #endif
  91. Config conf ( argc, argv );
  92. KernelExp kernelFunction ( conf.gD("KCGPRegression", "rbf_gamma", -2.5), 0.0 );
  93. LabeledSetVector train;
  94. string setfn = conf.gS("main", "train");
  95. int format = conf.gI("main", "format", 2 );
  96. train.read ( setfn, format );
  97. VVector trainUnlabeled;
  98. Vector y;
  99. train.getFlatRepresentation ( trainUnlabeled, y );
  100. KernelData kernelData ( &conf );
  101. for ( VVector::iterator i = trainUnlabeled.begin(); i != trainUnlabeled.end(); i++ )
  102. {
  103. Vector & v = *i;
  104. v.normL2();
  105. }
  106. kernelFunction.calcKernelData ( trainUnlabeled, &kernelData );
  107. Vector iparameters ( 2 );
  108. iparameters[0] = conf.gD("KCGPRegression", "rbf_gamma", -2.5);
  109. iparameters[1] = 0.0;
  110. double step = conf.gD("main", "step", 0.01 );
  111. double interval = conf.gD("main", "interval", 1.0 );
  112. bool testkernelderiv = conf.gB("main", "testkernelderiv", true );
  113. if ( testkernelderiv )
  114. testKernelDeriv ( &kernelData, kernelFunction, iparameters, step );
  115. else {
  116. VVector yy;
  117. if ( (y.Max() == 1) && (y.Min() == 0) )
  118. {
  119. cerr << "Binary classification problem" << endl;
  120. Vector by ( y.size() );
  121. for ( size_t j = 0 ; j < y.size() ; j++ )
  122. by[j] = 2*y[j] - 1;
  123. yy.push_back (by);
  124. } else {
  125. int numClasses = y.Max() + 1;
  126. for ( size_t i = 0 ; i < numClasses ; i++ )
  127. {
  128. Vector by ( y.size() );
  129. for ( size_t j = 0 ; j < y.size() ; j++ )
  130. if ( y[j] == i ) by[j] = 1;
  131. else by[j] = -1;
  132. yy.push_back(by);
  133. }
  134. }
  135. testOverallDeriv ( &kernelData, yy, kernelFunction, iparameters, step, interval );
  136. }
  137. return 0;
  138. }