{"id":8094,"date":"2023-11-06T15:26:25","date_gmt":"2023-11-06T14:26:25","guid":{"rendered":"https:\/\/solidt.eu\/site\/?p=8094"},"modified":"2023-11-10T17:22:56","modified_gmt":"2023-11-10T16:22:56","slug":"linearregression","status":"publish","type":"post","link":"https:\/\/solidt.eu\/site\/linearregression\/","title":{"rendered":"LinearRegression"},"content":{"rendered":"\n<div style=\"height: 250px; position:relative; margin-bottom: 50px;\" class=\"wp-block-simple-code-block-ace\"><pre class=\"wp-block-simple-code-block-ace\" style=\"position:absolute;top:0;right:0;bottom:0;left:0\" data-mode=\"csharp\" data-theme=\"monokai\" data-fontsize=\"14\" data-lines=\"Infinity\" data-showlines=\"true\" data-copy=\"false\">namespace Domain.Helpers\n{\n    public struct Point2D {\n        public double X;\n        public double Y;\n    }\n\n    public class LinearRegression\n    {\n        public static void Example()\n        {\n            \/\/ Voorbeeldwaarden\n            double slope = 1.4;    \/\/ Helling\n            double intercept = 3.5; \/\/ Startpositie (intercept)\n            double x = 2.0;        \/\/ x-co\u00f6rdinaat van het punt dat je wilt berekenen\n\n            \/\/ Gebruik CalculateY om het y-co\u00f6rdinaat te berekenen\n            double y = CalculateY(slope, intercept, x);\n\n            \/\/ Toon het berekende punt\n            Console.WriteLine($\"Voor x = {x}, y = {y}\");\n            \/\/ Voor x = 2, y = 6.3\n        }\n\n        public static double CalculateY(double slope, double intercept, double x) => slope * x + intercept;\n\n        public static double Slope(IEnumerable&lt;Point2D> points)\n        {\n            if (!ValidInput(points)) return 0.0;\n\n            var x = points.Select(point => point.X).ToArray();\n            var y = points.Select(point => point.Y).ToArray();\n\n            return Correlation(x, y) \/ SumOfSquares(x);\n        }\n\n        public static double Intercept(IEnumerable&lt;Point2D> points)\n        {\n            if (!ValidInput(points)) return 0.0;\n\n            var x = points.Select(point => point.X).ToArray();\n            var y = points.Select(point => point.Y).ToArray();\n\n            var xAverage = Average(x);\n            var yAverage = Average(y);\n\n            return yAverage - Slope(points) * xAverage;\n        }\n\n        public static double Average(double[] values)\n        {\n            if (!ValidInput(values)) return 0.0;\n            return values.Average();\n        }\n\n        public static double SumOfSquares(double[] values)\n        {\n            if (!ValidInput(values)) return 0.0;\n            var sumOfSquares = values.Select(v => v * v).Sum();\n            var average = Average(values);\n            sumOfSquares -= average * average * values.Length;\n            return sumOfSquares;\n        }\n\n        public static double Correlation(double[] x, double[] y)\n        {\n            if (!ValidInput(x, y)) return 0.0;\n            var correlation = 0.0;\n            for (int i = 0; i &lt; x.Length; ++i)\n                correlation += x[i] * y[i];\n            var xAverage = Average(x);\n            var yAverage = Average(y);\n            correlation -= xAverage * yAverage * x.Length;\n            return correlation;\n        }\n\n        private static bool ValidInput(double[] x, double[] y) => x != null &amp;&amp; y != null &amp;&amp; x.Length == y.Length &amp;&amp; x.Length != 0;\n        private static bool ValidInput(double[] x) => x != null &amp;&amp; x.Length != 0;\n        private static bool ValidInput(IEnumerable&lt;Point2D> points) => points != null &amp;&amp; points.Any();\n    }\n}\n<\/pre><\/div>\n\n\n\n<div style=\"height: 250px; position:relative; margin-bottom: 50px;\" class=\"wp-block-simple-code-block-ace\"><pre class=\"wp-block-simple-code-block-ace\" style=\"position:absolute;top:0;right:0;bottom:0;left:0\" data-mode=\"csharp\" data-theme=\"monokai\" data-fontsize=\"14\" data-lines=\"Infinity\" data-showlines=\"true\" data-copy=\"false\">using Domain.Helpers;\nusing NUnit.Framework;\n\nnamespace Domain.Tests\n{\n    [TestFixture]\n    public class LinearRegressionTests\n    {\n        public const double Tolerance = 1.0e-6;\n\n        [Test]\n        public void TestAverage_NullArray()\n        {\n            \/\/ setup\n            double[] x = null;\n            double expected = 0.0;\n            \/\/ exercise\n            double actual = LinearRegression.Average(x);\n            \/\/ assert\n            Assert.That(actual, Is.EqualTo(expected).Within(Tolerance));\n        }\n\n        [Test]\n        public void TestAverage_EmptyArray()\n        {\n            \/\/ setup\n            double[] x = new double[] { };\n            double expected = 0.0;\n            \/\/ exercise\n            double actual = LinearRegression.Average(x);\n            \/\/ assert\n            Assert.That(actual, Is.EqualTo(expected).Within(Tolerance));\n        }\n\n        [Test]\n        public void TestAverage_Success()\n        {\n            \/\/ setup\n            double[] x = new double[] { 1.0, 2.0, 2.0, 3.0, 4.0, 7.0, 9.0 };\n            double expected = 4.0;\n            \/\/ exercise\n            double actual = LinearRegression.Average(x);\n            \/\/ assert\n            Assert.That(actual, Is.EqualTo(expected).Within(Tolerance));\n        }\n\n        [Test]\n        public void TestSumOfSquares_NullArray()\n        {\n            \/\/ setup\n            double[] x = null;\n            double expected = 0.0;\n            \/\/ exercise\n            double actual = LinearRegression.SumOfSquares(x);\n            \/\/ assert\n            Assert.That(actual, Is.EqualTo(expected).Within(Tolerance));\n        }\n\n        [Test]\n        public void TestSumOfSquares_EmptyArray()\n        {\n            \/\/ setup\n            double[] x = new double[] { };\n            double expected = 0.0;\n            \/\/ exercise\n            double actual = LinearRegression.SumOfSquares(x);\n            \/\/ assert\n            Assert.That(actual, Is.EqualTo(expected).Within(Tolerance));\n        }\n\n        [Test]\n        public void TestSumOfSquares_Success()\n        {\n            \/\/ setup\n            double[] x = new double[] { 1.0, 2.0, 2.0, 3.0, 4.0, 7.0, 9.0 };\n            double expected = 52.0;\n            \/\/ exercise\n            double actual = LinearRegression.SumOfSquares(x);\n            \/\/ assert\n            Assert.That(actual, Is.EqualTo(expected).Within(Tolerance));\n        }\n\n        [Test]\n        public void TestCorrelation_NullX_NullY()\n        {\n            \/\/ setup\n            double[] x = null;\n            double[] y = null;\n            double expected = 0.0;\n            \/\/ exercise\n            double actual = LinearRegression.Correlation(x, y);\n            \/\/ assert\n            Assert.That(actual, Is.EqualTo(expected).Within(Tolerance));\n        }\n\n        [Test]\n        public void TestCorrelation_DifferentLengths()\n        {\n            \/\/ setup\n            double[] x = new double[] { 1.0, 2.0, 3.0, 5.0, 8.0 };\n            double[] y = new double[] { 0.11, 0.12, 0.13, 0.15, 0.18, 0.20 };\n            double expected = 0.0;\n            \/\/ exercise\n            double actual = LinearRegression.Correlation(x, y);\n            \/\/ assert\n            Assert.That(actual, Is.EqualTo(expected).Within(Tolerance));\n        }\n\n        [Test]\n        public void TestCorrelation_Success()\n        {\n            \/\/ setup\n            double[] x = new double[] { 1.0, 2.0, 3.0, 5.0, 8.0 };\n            double[] y = new double[] { 0.11, 0.12, 0.13, 0.15, 0.18 };\n            double expected = 0.308;\n            \/\/ exercise\n            double actual = LinearRegression.Correlation(x, y);\n            \/\/ assert\n            Assert.That(actual, Is.EqualTo(expected).Within(Tolerance));\n        }\n\n        [Test]\n        public void TestSlope()\n        {\n            \/\/ setup\n            var points = new List&lt;Point2D> {\n                new Point2D { X = 1.0, Y = 6.0 },\n                new Point2D { X = 2.0, Y = 5.0 },\n                new Point2D { X = 3.0, Y = 7.0 },\n                new Point2D { X = 4.0, Y = 10.0 }\n                };\n            double expected = 1.4;\n            \/\/ exercise\n            double actual = LinearRegression.Slope(points);\n            \/\/ assert\n            Assert.That(actual, Is.EqualTo(expected).Within(Tolerance));\n        }\n\n        [Test]\n        public void TestIntercept()\n        {\n            var points = new List&lt;Point2D> {\n                new Point2D { X = 1.0, Y = 6.0 },\n                new Point2D { X = 2.0, Y = 5.0 },\n                new Point2D { X = 3.0, Y = 7.0 },\n                new Point2D { X = 4.0, Y = 10.0 }\n                };\n\n            double expected = 3.5;\n            \/\/ exercise\n            double actual = LinearRegression.Intercept(points);\n            \/\/ assert\n            Assert.That(actual, Is.EqualTo(expected).Within(Tolerance));\n        }\n    }\n}\n<\/pre><\/div>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-8094","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/8094","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/comments?post=8094"}],"version-history":[{"count":2,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/8094\/revisions"}],"predecessor-version":[{"id":8096,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/8094\/revisions\/8096"}],"wp:attachment":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/media?parent=8094"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/categories?post=8094"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/tags?post=8094"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}