LinRegression.cpp 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. /**
  2. * @file LinRegression.cpp
  3. * @brief Algorithm for linear regression
  4. * @author Frank Prüfer
  5. * @date 08/13/2013
  6. */
  7. #include "vislearning/regression/linregression/LinRegression.h"
  8. using namespace OBJREC;
  9. using namespace std;
  10. using namespace NICE;
  11. LinRegression::LinRegression(){
  12. dim = 2;
  13. }
  14. LinRegression::LinRegression(uint dimension){
  15. dim = dimension;
  16. }
  17. LinRegression::~LinRegression()
  18. {
  19. }
  20. void LinRegression::teach ( const NICE::VVector & x, const NICE::Vector & y ){
  21. if (dim == 0){ //dimension not specified via constructor
  22. dim = x[0].size()+1; //use full dimension of data
  23. }
  24. cerr<<"dim: "<<dim<<endl;
  25. cerr<<"examples: "<<x.size()<<endl;
  26. for ( uint i = 0;i < dim;i++ ){ //initialize alpha-vector
  27. alpha.push_back(0.0);
  28. }
  29. if ( dim == 2 ){ //two-dimensional least squares
  30. double meanX;
  31. double meanY = y.Mean();
  32. double sumX = 0.0;
  33. for ( uint i = 0;i < x.size();i++ ){
  34. sumX += x[i][0];
  35. }
  36. meanX = sumX / (double)x.size();
  37. for ( uint i = 0; i < x.size(); i++ ){
  38. alpha[1] += x[i][0] * y[i];
  39. }
  40. alpha[1] -= x.size() * meanX * meanY;
  41. double tmpAlpha = 0.0;
  42. for ( uint i = 0; i < x.size(); i++ ){
  43. tmpAlpha += x[i][0] * x[i][0];
  44. }
  45. tmpAlpha -= x.size() * meanX * meanX;
  46. alpha[1] /= tmpAlpha;
  47. alpha[0] = meanY - alpha[1] * meanX;
  48. }
  49. }
  50. double LinRegression::predict ( const NICE::Vector & x ){
  51. double y;
  52. if ( dim = 2 ){ //two-dimensional least squares
  53. y = alpha[0] + alpha[1] * x[0];
  54. }
  55. return y;
  56. }