From 5c025248739dc77f599f89fa4b4bd9dc32f81dfd Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Mon, 30 May 2016 21:10:17 +0200 Subject: [PATCH] Regression/forecast for charting --- Math/Stochastic/Average.js | 31 +++++++++++++++++ Math/Stochastic/Forecast/LinearRegression.js | 35 ++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 Math/Stochastic/Average.js create mode 100644 Math/Stochastic/Forecast/LinearRegression.js diff --git a/Math/Stochastic/Average.js b/Math/Stochastic/Average.js new file mode 100644 index 0000000..1b58342 --- /dev/null +++ b/Math/Stochastic/Average.js @@ -0,0 +1,31 @@ +/** + * Average class. + * + * @author OMS Development Team + * @author Dennis Eichhorn + * @copyright 2013 Dennis Eichhorn + * @license OMS License 1.0 + * @version 1.0.0 * @since 1.0.0 + */ +(function (jsOMS, undefined) +{ + "use strict"; + /** @namespace jsOMS.Math.Stochastic.Average */ + jsOMS.Autoloader.defineNamespace('jsOMS.Math.Stochastic.Average'); + + jsOMS.Math.Stochastic.Average.arithmeticMean = function (values, offset = 0) + { + Array.sort(values); + let length = values.length; + + if (offset > 0) { + values = Array.splice(offset, length - offset); + } + + if (length === 0) { + throw 'Division zero'; + } + + return values.reduce((a, b) => a + b, 0) / count; + }; +}(window.jsOMS = window.jsOMS || {})); \ No newline at end of file diff --git a/Math/Stochastic/Forecast/LinearRegression.js b/Math/Stochastic/Forecast/LinearRegression.js new file mode 100644 index 0000000..15d5db2 --- /dev/null +++ b/Math/Stochastic/Forecast/LinearRegression.js @@ -0,0 +1,35 @@ +/** + * Linear regression class. + * + * @author OMS Development Team + * @author Dennis Eichhorn + * @copyright 2013 Dennis Eichhorn + * @license OMS License 1.0 + * @version 1.0.0 * @since 1.0.0 + */ +(function (jsOMS, undefined) +{ + "use strict"; + /** @namespace jsOMS.Math.Stochastic.Forecast.LinearRegression */ + jsOMS.Autoloader.defineNamespace('jsOMS.Math.Stochastic.Forecast.LinearRegression'); + + jsOMS.Math.Stochastic.Forecast.LinearRegression.getLinearRegresseion = function (x, y) + { + let count = x.length, + meanX = jsOMS.Math.Stochastic.Average.arithmeticMean(x), + meanY = jsOMS.Math.Stochastic.Average.arithmeticMean(y), + sum1 = 0, + sum2 = 0, + b0, b1; + + for (let i = 0; i < count; i++) { + sum1 += (y[i] - meanY) * (x[i] - meanX); + sum2 += (x[i] - meanX) ** 2; + } + + b1 = sum1 / sum2; + b0 = meanY - b1 * meanX; + + return {b0: b0, b1: b1}; + }; +}(window.jsOMS = window.jsOMS || {})); \ No newline at end of file