namespace Domain.Helpers
{
public struct Point2D {
public double X;
public double Y;
}
public class LinearRegression
{
public static void Example()
{
// Voorbeeldwaarden
double slope = 1.4; // Helling
double intercept = 3.5; // Startpositie (intercept)
double x = 2.0; // x-coördinaat van het punt dat je wilt berekenen
// Gebruik CalculateY om het y-coördinaat te berekenen
double y = CalculateY(slope, intercept, x);
// Toon het berekende punt
Console.WriteLine($"Voor x = {x}, y = {y}");
// Voor x = 2, y = 6.3
}
public static double CalculateY(double slope, double intercept, double x) => slope * x + intercept;
public static double Slope(IEnumerable<Point2D> points)
{
if (!ValidInput(points)) return 0.0;
var x = points.Select(point => point.X).ToArray();
var y = points.Select(point => point.Y).ToArray();
return Correlation(x, y) / SumOfSquares(x);
}
public static double Intercept(IEnumerable<Point2D> points)
{
if (!ValidInput(points)) return 0.0;
var x = points.Select(point => point.X).ToArray();
var y = points.Select(point => point.Y).ToArray();
var xAverage = Average(x);
var yAverage = Average(y);
return yAverage - Slope(points) * xAverage;
}
public static double Average(double[] values)
{
if (!ValidInput(values)) return 0.0;
return values.Average();
}
public static double SumOfSquares(double[] values)
{
if (!ValidInput(values)) return 0.0;
var sumOfSquares = values.Select(v => v * v).Sum();
var average = Average(values);
sumOfSquares -= average * average * values.Length;
return sumOfSquares;
}
public static double Correlation(double[] x, double[] y)
{
if (!ValidInput(x, y)) return 0.0;
var correlation = 0.0;
for (int i = 0; i < x.Length; ++i)
correlation += x[i] * y[i];
var xAverage = Average(x);
var yAverage = Average(y);
correlation -= xAverage * yAverage * x.Length;
return correlation;
}
private static bool ValidInput(double[] x, double[] y) => x != null && y != null && x.Length == y.Length && x.Length != 0;
private static bool ValidInput(double[] x) => x != null && x.Length != 0;
private static bool ValidInput(IEnumerable<Point2D> points) => points != null && points.Any();
}
}
using Domain.Helpers;
using NUnit.Framework;
namespace Domain.Tests
{
[TestFixture]
public class LinearRegressionTests
{
public const double Tolerance = 1.0e-6;
[Test]
public void TestAverage_NullArray()
{
// setup
double[] x = null;
double expected = 0.0;
// exercise
double actual = LinearRegression.Average(x);
// assert
Assert.That(actual, Is.EqualTo(expected).Within(Tolerance));
}
[Test]
public void TestAverage_EmptyArray()
{
// setup
double[] x = new double[] { };
double expected = 0.0;
// exercise
double actual = LinearRegression.Average(x);
// assert
Assert.That(actual, Is.EqualTo(expected).Within(Tolerance));
}
[Test]
public void TestAverage_Success()
{
// setup
double[] x = new double[] { 1.0, 2.0, 2.0, 3.0, 4.0, 7.0, 9.0 };
double expected = 4.0;
// exercise
double actual = LinearRegression.Average(x);
// assert
Assert.That(actual, Is.EqualTo(expected).Within(Tolerance));
}
[Test]
public void TestSumOfSquares_NullArray()
{
// setup
double[] x = null;
double expected = 0.0;
// exercise
double actual = LinearRegression.SumOfSquares(x);
// assert
Assert.That(actual, Is.EqualTo(expected).Within(Tolerance));
}
[Test]
public void TestSumOfSquares_EmptyArray()
{
// setup
double[] x = new double[] { };
double expected = 0.0;
// exercise
double actual = LinearRegression.SumOfSquares(x);
// assert
Assert.That(actual, Is.EqualTo(expected).Within(Tolerance));
}
[Test]
public void TestSumOfSquares_Success()
{
// setup
double[] x = new double[] { 1.0, 2.0, 2.0, 3.0, 4.0, 7.0, 9.0 };
double expected = 52.0;
// exercise
double actual = LinearRegression.SumOfSquares(x);
// assert
Assert.That(actual, Is.EqualTo(expected).Within(Tolerance));
}
[Test]
public void TestCorrelation_NullX_NullY()
{
// setup
double[] x = null;
double[] y = null;
double expected = 0.0;
// exercise
double actual = LinearRegression.Correlation(x, y);
// assert
Assert.That(actual, Is.EqualTo(expected).Within(Tolerance));
}
[Test]
public void TestCorrelation_DifferentLengths()
{
// setup
double[] x = new double[] { 1.0, 2.0, 3.0, 5.0, 8.0 };
double[] y = new double[] { 0.11, 0.12, 0.13, 0.15, 0.18, 0.20 };
double expected = 0.0;
// exercise
double actual = LinearRegression.Correlation(x, y);
// assert
Assert.That(actual, Is.EqualTo(expected).Within(Tolerance));
}
[Test]
public void TestCorrelation_Success()
{
// setup
double[] x = new double[] { 1.0, 2.0, 3.0, 5.0, 8.0 };
double[] y = new double[] { 0.11, 0.12, 0.13, 0.15, 0.18 };
double expected = 0.308;
// exercise
double actual = LinearRegression.Correlation(x, y);
// assert
Assert.That(actual, Is.EqualTo(expected).Within(Tolerance));
}
[Test]
public void TestSlope()
{
// setup
var points = new List<Point2D> {
new Point2D { X = 1.0, Y = 6.0 },
new Point2D { X = 2.0, Y = 5.0 },
new Point2D { X = 3.0, Y = 7.0 },
new Point2D { X = 4.0, Y = 10.0 }
};
double expected = 1.4;
// exercise
double actual = LinearRegression.Slope(points);
// assert
Assert.That(actual, Is.EqualTo(expected).Within(Tolerance));
}
[Test]
public void TestIntercept()
{
var points = new List<Point2D> {
new Point2D { X = 1.0, Y = 6.0 },
new Point2D { X = 2.0, Y = 5.0 },
new Point2D { X = 3.0, Y = 7.0 },
new Point2D { X = 4.0, Y = 10.0 }
};
double expected = 3.5;
// exercise
double actual = LinearRegression.Intercept(points);
// assert
Assert.That(actual, Is.EqualTo(expected).Within(Tolerance));
}
}
}
809400cookie-checkLinearRegression