simple examples of how to

Thursday, October 20, 2011

[C++] Linear Regression Source Code

here it goes.

class LinearRegression
{
        public:
                // Constructor using an array of Point2D objects
                // This is also the default constructor
                LinearRegression(Point2D *p = 0, long size = 0);

                // Constructor using arrays of x values and y values
                LinearRegression(double *x, double *y, long size = 0);

                virtual void addXY(const double& x, const double& y);
                void clear() { sumX = sumY = sumXsquared = sumYsquared = sumXY = n = 0; }
                void addPoint(const Point2D& p) { addXY(p.getX(), p.getY()); }

                // Must have at least 3 points to calculate
                // standard error of estimate. Do we have enough data?
                int haveData() const { return (n > 2 ? 1 : 0); }
                long items() const { return n; }

                virtual double getA() const { return a; }
                virtual double getB() const { return b; }

                double getCoefDeterm() const { return coefD; }
                double getCoefCorrel() const { return coefC; }
                double getStdErrorEst() const { return stdError; }
                virtual double estimateY(double x) const { return (a + b * x); }

        protected:
                long n;       // number of data points input so far
                double sumX, sumY; // sums of x and y
                double sumXsquared, // sum of x squares
                    sumYsquared; // sum y squares
                double sumXY;    // sum of x*y

                double a, b;    // coefficients of f(x) = a + b*x
                double coefD,    // coefficient of determination
                    coefC,    // coefficient of correlation
                    stdError;  // standard error of estimate

                void Calculate();  // calculate coefficients
};

LinearRegression::LinearRegression(Point2D *p, long size)
{
  long i;
  a = b = sumX = sumY = sumXsquared = sumYsquared = sumXY = 0.0;
  n = 0L;

  if (size > 0L) // if size greater than zero there are data arrays
    for (n = 0, i = 0L; i < size; i++)
      addPoint(p[i]);
}

LinearRegression::LinearRegression(double *x, double *y, long size)
{
  long i;
  a = b = sumX = sumY = sumXsquared = sumYsquared = sumXY = 0.0;
  n = 0L;

  if (size > 0L) // if size greater than zero there are data arrays
    for (n = 0, i = 0L; i < size; i++)
      addXY(x[i], y[i]);
}

void LinearRegression::addXY(const double& x, const double& y)
{
  n++;
  sumX += x;
  sumY += y;
  sumXsquared += x * x;
  sumYsquared += y * y;
  sumXY += x * y;
  Calculate();
}

void LinearRegression::Calculate()
{
  if (haveData())
  {
    if (fabs( double(n) * sumXsquared - sumX * sumX) > DBL_EPSILON)
    {
      b = ( double(n) * sumXY - sumY * sumX) /
        ( double(n) * sumXsquared - sumX * sumX);
      a = (sumY - b * sumX) / double(n);

      double sx = b * ( sumXY - sumX * sumY / double(n) );
      double sy2 = sumYsquared - sumY * sumY / double(n);
      double sy = sy2 - sx;

      coefD = sx / sy2;
      coefC = sqrt(coefD);
      stdError = sqrt(sy / double(n - 2));
    }
    else
    {
      a = b = coefD = coefC = stdError = 0.0;
    }
  }
}

No comments:

Post a Comment