From beecb3bd2cab0ebda2a0d9deb2bf6ba68d25f285 Mon Sep 17 00:00:00 2001 From: Ahmet Inan Date: Wed, 8 Aug 2018 10:16:28 +0200 Subject: [PATCH] added simple linear regression --- README.md | 4 ++++ regression.hh | 52 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 regression.hh diff --git a/README.md b/README.md index 960cf16..9916b82 100644 --- a/README.md +++ b/README.md @@ -54,3 +54,7 @@ for (uint8_t c: std::string("Hello World!")) crc(c); assert(!crc(uint32_t(~0x1C291CA3))); ``` +### [regression.hh](regression.hh) + +Implemented [Simple linear regression](https://en.wikipedia.org/wiki/Simple_linear_regression) for [Regression analysis](https://en.wikipedia.org/wiki/Regression_analysis) of data. + diff --git a/regression.hh b/regression.hh new file mode 100644 index 0000000..208c02a --- /dev/null +++ b/regression.hh @@ -0,0 +1,52 @@ +/* +Regression analysis + +Copyright 2018 Ahmet Inan +*/ + +#ifndef REGRESSION_HH +#define REGRESSION_HH + +namespace DSP { + +template +class SimpleLinearRegression +{ + TYPE avgX, avgY; + TYPE varX, covXY; +public: + SimpleLinearRegression(TYPE *x, TYPE *y, int LEN) : avgX(0), avgY(0), varX(0), covXY(0) + { + for (int i = 0; i < LEN; ++i) { + avgX += x[i]; + avgY += y[i]; + } + avgX /= LEN; + avgY /= LEN; + for (int i = 0; i < LEN; ++i) { + varX += (x[i] - avgX) * (x[i] - avgX); + covXY += (x[i] - avgX) * (y[i] - avgY); + } + } + TYPE xint() + { + return avgX - avgY * varX / covXY; + } + TYPE slope() + { + return covXY / varX; + } + TYPE yint() + { + return avgY - slope() * avgX; + } + TYPE operator () (TYPE x) + { + return yint() + slope() * x; + } +}; + +} + +#endif +