Code development platform for open source projects from the European Union institutions :large_blue_circle: EU Login authentication by SMS has been phased out. To see alternatives please check here

Skip to content
Snippets Groups Projects
Commit 31f28dab authored by Markus Quaritsch's avatar Markus Quaritsch
Browse files

linear regression: handle casees where only 1 entry or null is given, refacotr duplicate code

parent 1716582c
No related branches found
No related tags found
No related merge requests found
...@@ -339,6 +339,12 @@ namespace TUGraz.VectoCommon.Utils ...@@ -339,6 +339,12 @@ namespace TUGraz.VectoCommon.Utils
public static void LeastSquaresFitting<T>(IEnumerable<T> entries, Func<T, double> getX, Func<T, double> getY, public static void LeastSquaresFitting<T>(IEnumerable<T> entries, Func<T, double> getX, Func<T, double> getY,
out double k, out double d, out double r) out double k, out double d, out double r)
{
LeastSquaresFitting(entries?.Select(x => new Point(getX(x), getY(x))), out k, out d, out r);
}
public static void LeastSquaresFitting(IEnumerable<Point> entries, out double k, out double d, out double r)
{ {
// algoritm taken from http://mathworld.wolfram.com/LeastSquaresFitting.html (eqn. 27 & 28) // algoritm taken from http://mathworld.wolfram.com/LeastSquaresFitting.html (eqn. 27 & 28)
var count = 0; var count = 0;
...@@ -347,39 +353,12 @@ namespace TUGraz.VectoCommon.Utils ...@@ -347,39 +353,12 @@ namespace TUGraz.VectoCommon.Utils
var sumXSquare = 0.0; var sumXSquare = 0.0;
var sumYSquare = 0.0; var sumYSquare = 0.0;
var sumXY = 0.0; var sumXY = 0.0;
foreach (var entry in entries) { if (entries == null) {
var x = getX(entry);
var y = getY(entry);
sumX += x;
sumY += y;
sumXSquare += x * x;
sumYSquare += y * y;
sumXY += x * y;
count++;
}
if (count == 0) {
k = 0; k = 0;
d = 0; d = 0;
r = 0; r = 0;
return; return;
} }
var ssxx = sumXSquare - sumX * sumX / count;
var ssxy = sumXY - sumX * sumY / count;
var ssyy = sumYSquare - sumY * sumY / count;
k = ssxy / ssxx;
d = (sumY - k * sumX) / count;
r = ssxy * ssxy / ssxx / ssyy;
}
public static void LeastSquaresFitting(IEnumerable<Point> entries, out double k, out double d, out double r)
{
// algoritm taken from http://mathworld.wolfram.com/LeastSquaresFitting.html (eqn. 27 & 28)
var count = 0;
var sumX = 0.0;
var sumY = 0.0;
var sumXSquare = 0.0;
var sumYSquare = 0.0;
var sumXY = 0.0;
foreach (var entry in entries) { foreach (var entry in entries) {
var x = entry.X; var x = entry.X;
var y = entry.Y; var y = entry.Y;
...@@ -396,6 +375,12 @@ namespace TUGraz.VectoCommon.Utils ...@@ -396,6 +375,12 @@ namespace TUGraz.VectoCommon.Utils
r = 0; r = 0;
return; return;
} }
if (count == 1) {
k = 0;
d = sumY;
r = 0;
return;
}
var ssxx = sumXSquare - sumX * sumX / count; var ssxx = sumXSquare - sumX * sumX / count;
var ssxy = sumXY - sumX * sumY / count; var ssxy = sumXY - sumX * sumY / count;
var ssyy = sumYSquare - sumY * sumY / count; var ssyy = sumYSquare - sumY * sumY / count;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment