Lineaarisessa regressiossa sovitetaan suora pistejoukkoon. Monesti mitattava data on kohinaista ja tapahtumaa kuvaava suora on "haettava" pisteiden seasta.
Code Block |
---|
double Statistic::LineFit(const double *const x, const double *const y, const size_t n, double *m, double *b)
{
int error = 0;
double sumx = 0, sumy = 0, sumx2 = 0, sumxy = 0;
double dn = (double) n;
size_t i;
if (n <= 1)
{
*m = 0;
*b = 0;
error = 1;
}
else
{
double divisor;
error = 0;
for (i = 0; i < n; i++)
{
sumx += x[i];
sumy += y[i];
sumx2 += (x[i] * x[i]);
sumxy += (x[i] * y[i]);
}
divisor = (sumx2 - ((sumx * sumx) / dn));
if (divisor != 0)
{
*m = (sumxy - ((sumx * sumy) / dn)) / divisor;
*b = (sumy - ((*m) * sumx)) / dn;
}
else
{
*m = 0;
*b = 0;
error = 2;
}
}
return *m;
};
|
Code Block |
---|
int main() { // exact line: double x0[] = {-1, 0, 1, 2, 3}; double y0[] = {-1, 0, 1, 2, 3}; // noisy line: double x1[] = {-1.1, 0.01, .9999, 1.99998, 3.01}; double y1[] = {-1.02, -.00001, 1.002, 1.99872, 2.999973}; size_t length = sizeof x0 / sizeof x0[0]; double m; double b; linfit(x0, y0, length, &m, &b); printf("Slope is %f, intercept is %f\n", m, b); linfit(x1, y1, length, &m, &b); printf("Slope is %f, intercept is %f\n", m, b); cin.get(); return 0; } |