From b1c026e574faca2f89c6b97061cefd4e6f6c75b0 Mon Sep 17 00:00:00 2001 From: Armin Wolf Date: Sat, 16 Sep 2017 15:26:33 +0200 Subject: [PATCH] =?UTF-8?q?ScaledErrorBasedMeasure=20hinzugef=C3=BCgt=20mi?= =?UTF-8?q?t=20den=20naiven=20algorithmen=20berechnet.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../NaivLeastMedianOfSquaresEstimator.java | 22 +++---- .../naiv/NaivRepeatedMedianEstimator.java | 8 +-- .../naiv/NaivTheilSenEstimator.java | 8 +-- .../evaluation/EvaluateAlgorithms.java | 64 ++++++++++++++----- .../evaluation/ScaledErrorBasedMeasure.java | 24 ++++--- .../java/view/panels/EvaluationPanel.java | 5 ++ 6 files changed, 87 insertions(+), 44 deletions(-) diff --git a/src/main/java/presenter/algorithms/naiv/NaivLeastMedianOfSquaresEstimator.java b/src/main/java/presenter/algorithms/naiv/NaivLeastMedianOfSquaresEstimator.java index de93ce8..00aa371 100644 --- a/src/main/java/presenter/algorithms/naiv/NaivLeastMedianOfSquaresEstimator.java +++ b/src/main/java/presenter/algorithms/naiv/NaivLeastMedianOfSquaresEstimator.java @@ -20,7 +20,7 @@ public class NaivLeastMedianOfSquaresEstimator implements Algorithm { private ArrayList set = new ArrayList<>(); private Integer n; - private Double ds,as,bs; + private Double ds, b, m; public NaivLeastMedianOfSquaresEstimator(LinkedList lines) { for (Line l :lines){ @@ -31,8 +31,8 @@ public class NaivLeastMedianOfSquaresEstimator implements Algorithm { private void crudeAlg(){ ds = Double.MAX_VALUE; - as = 0d; - bs = 0d; + b = 0d; + m = 0d; ArrayList triple = new ArrayList<>(); Double beta; Double alpha; @@ -49,15 +49,15 @@ public class NaivLeastMedianOfSquaresEstimator implements Algorithm { dijk = f(alpha, beta); if (dijk < ds){ ds = dijk; - as = alpha; - bs = beta; - // System.out.printf("Distanz: %6.2f\tAlpha: %6.2f\tBeta: %6.2f",ds,as,bs); + b = alpha; + m = beta; + // System.out.printf("Distanz: %6.2f\tAlpha: %6.2f\tBeta: %6.2f",ds,b,m); } triple.clear(); } } } - System.out.printf("Naiv LMS: %6.2f * x + %6.3f\n",bs, as); + System.out.printf("Naiv LMS: %6.2f * x + %6.3f\n", m, b); } @@ -80,11 +80,11 @@ public class NaivLeastMedianOfSquaresEstimator implements Algorithm { } - public Double getAs() { - return as; + public Double getB() { + return b * -1; } - public Double getBs() { - return bs; + public Double getM() { + return m * -1; } } diff --git a/src/main/java/presenter/algorithms/naiv/NaivRepeatedMedianEstimator.java b/src/main/java/presenter/algorithms/naiv/NaivRepeatedMedianEstimator.java index 1e2f229..d8b2f4c 100644 --- a/src/main/java/presenter/algorithms/naiv/NaivRepeatedMedianEstimator.java +++ b/src/main/java/presenter/algorithms/naiv/NaivRepeatedMedianEstimator.java @@ -111,11 +111,11 @@ public class NaivRepeatedMedianEstimator implements Algorithm{ return new Point(m,b); } - public Double getMedianX() { - return medianX; + public Double getM() { + return medianX * -1; } - public Double getMedianY() { - return medianY; + public Double getB() { + return medianY * -1; } } diff --git a/src/main/java/presenter/algorithms/naiv/NaivTheilSenEstimator.java b/src/main/java/presenter/algorithms/naiv/NaivTheilSenEstimator.java index f0e8c15..d854ca3 100644 --- a/src/main/java/presenter/algorithms/naiv/NaivTheilSenEstimator.java +++ b/src/main/java/presenter/algorithms/naiv/NaivTheilSenEstimator.java @@ -65,11 +65,11 @@ public class NaivTheilSenEstimator implements Algorithm { } - public Double getSlope() { - return slope; + public Double getM() { + return slope * -1; } - public Double getyInterception() { - return yInterception; + public Double getB() { + return yInterception * -1; } } diff --git a/src/main/java/presenter/evaluation/EvaluateAlgorithms.java b/src/main/java/presenter/evaluation/EvaluateAlgorithms.java index f3feeda..adac9e6 100644 --- a/src/main/java/presenter/evaluation/EvaluateAlgorithms.java +++ b/src/main/java/presenter/evaluation/EvaluateAlgorithms.java @@ -45,7 +45,7 @@ public class EvaluateAlgorithms extends Observable { private DatasetGenerator generator; - private String[][] names = {{"MSE", "RMSE", "MAE", "MDAE","Steigung","y-Achsenabschnitt"}, {"MAPE", "MDAPE", "RMSPE", "RMDSPE","Steigung","y-Achsenabschnitt"}}; + private String[][] names = {{"MSE", "RMSE", "MAE", "MDAE","Steigung","y-Achsenabschnitt", "S-MSE", "S-RMSE", "S-MAE", "S-MDAE", "Brute-force Steigung", "Brute-force y-Achsenabschnitt"}, {"MAPE", "MDAPE", "RMSPE", "RMDSPE","Steigung","y-Achsenabschnitt"}}; //übergebene Parameter private int type; @@ -103,8 +103,7 @@ public class EvaluateAlgorithms extends Observable { ArrayList result; ArrayList> multipleResults = new ArrayList<>(); - /* DEBUG */ - + /* DEBUG NaivLeastMedianOfSquaresEstimator l = new NaivLeastMedianOfSquaresEstimator(arrangement.getLines()); NaivRepeatedMedianEstimator r = new NaivRepeatedMedianEstimator(arrangement.getLines()); NaivTheilSenEstimator t = new NaivTheilSenEstimator(arrangement.getLines()); @@ -113,9 +112,8 @@ public class EvaluateAlgorithms extends Observable { r.run(); t.run(); System.out.println(); + DEBUG */ - - /* DEBUG */ startLMS(); startRM(); startTS(); @@ -123,17 +121,52 @@ public class EvaluateAlgorithms extends Observable { case 0: //der alg der gewählt wurde if (alg == 0) { + final double[] m = new double[1]; + final double[] b = new double[1]; + Thread t = new Thread(() -> { + NaivLeastMedianOfSquaresEstimator l = new NaivLeastMedianOfSquaresEstimator(arrangement.getLines()); + l.run(); + m[0] = l.getM(); + b[0] = l.getB(); + }); + t.start(); startLMS(); + t.join(); + result = getScaleDependentMeasure(arrangement.getLines(), lmsRes[0], lmsRes[1]); - sendPlotLineResults(lmsRes, 0); + result.addAll(getScaledErrorBasedMeasure(arrangement.getLines(), lmsRes[0], lmsRes[1],m[0], b[0])); + Double[] tmp = {lmsRes[0], lmsRes[1],m[0], b[0]}; + sendPlotLineResults(tmp, 0); } else if (alg == 1) { + final double[] m = new double[1]; + final double[] b = new double[1]; + Thread t = new Thread(() -> { + NaivRepeatedMedianEstimator r = new NaivRepeatedMedianEstimator(arrangement.getLines()); + r.run(); + m[0] = r.getM(); + b[0] = r.getB(); + }); + t.start(); startRM(); result = getScaleDependentMeasure(arrangement.getLines(), rmRes[0], rmRes[1]); - sendPlotLineResults(rmRes, 1); + result.addAll(getScaledErrorBasedMeasure(arrangement.getLines(), rmRes[0], rmRes[1],m[0], b[0])); + Double[] tmp = {rmRes[0], rmRes[1],m[0], b[0]}; + sendPlotLineResults(tmp, 1); } else { + final double[] m = new double[1]; + final double[] b = new double[1]; + Thread t = new Thread(() -> { + NaivTheilSenEstimator ts = new NaivTheilSenEstimator(arrangement.getLines()); + ts.run(); + m[0] = ts.getM(); + b[0] = ts.getB(); + }); + t.start(); startTS(); result = getScaleDependentMeasure(arrangement.getLines(), tsRes[0], tsRes[1]); - sendPlotLineResults(tsRes, 2); + result.addAll(getScaledErrorBasedMeasure(arrangement.getLines(), tsRes[0], tsRes[1],m[0], b[0])); + Double[] tmp = {tsRes[0], tsRes[1],m[0], b[0]}; + sendPlotLineResults(tmp, 2); } sendTableApproximationTypes(); sendTableApproximationData(result, alg); @@ -265,9 +298,9 @@ public class EvaluateAlgorithms extends Observable { lines.add("lines-res"); lines.add("" + alg); //lms res - lines.add(res[0] + ""); - lines.add(res[1] + ""); - + for (int i=0;i getScaleDependentMeasure(final LinkedList lines, final Double m, final Double b) { ScaleDependentMeasure scaleDependentMeasure = new ScaleDependentMeasure(lines, m, b); ArrayList ret = new ArrayList<>(); @@ -350,15 +384,15 @@ public class EvaluateAlgorithms extends Observable { return ret; } - public ArrayList getScaledErrorBasedMeasure(final LinkedList lines, final Double m, final Double b) { - ScaledErrorBasedMeasure scaledErrorBasedMeasure = new ScaledErrorBasedMeasure(lines, m, b); + public ArrayList getScaledErrorBasedMeasure(final LinkedList lines, final Double m, final Double b, final Double nM, final Double nB) { + ScaledErrorBasedMeasure scaledErrorBasedMeasure = new ScaledErrorBasedMeasure(lines, m, b, nM, nB); ArrayList ret = new ArrayList<>(); ret.add(scaledErrorBasedMeasure.mse().toString()); ret.add(scaledErrorBasedMeasure.rmse().toString()); ret.add(scaledErrorBasedMeasure.mae().toString()); ret.add(scaledErrorBasedMeasure.mdae().toString()); - ret.add(m.toString()); - ret.add(b.toString()); + ret.add(nM.toString()); + ret.add(nB.toString()); return ret; } diff --git a/src/main/java/presenter/evaluation/ScaledErrorBasedMeasure.java b/src/main/java/presenter/evaluation/ScaledErrorBasedMeasure.java index da5eafa..b263d15 100644 --- a/src/main/java/presenter/evaluation/ScaledErrorBasedMeasure.java +++ b/src/main/java/presenter/evaluation/ScaledErrorBasedMeasure.java @@ -16,25 +16,29 @@ import java.util.LinkedList; public class ScaledErrorBasedMeasure { + private ArrayList sampsonError; + private ArrayList naivSampsonError; private ArrayList scaledError; - public ScaledErrorBasedMeasure(final LinkedList lines, Double m, Double b) { - //Liste mit den Fehler zu jedem Punkt - ArrayList sampson = new ArrayList<>(); + public ScaledErrorBasedMeasure(final LinkedList lines, Double m, Double b, Double naivSlope, Double naivInterception) { + + this.sampsonError = new ArrayList<>(); + this.naivSampsonError = new ArrayList<>(); + this.scaledError = new ArrayList<>(); - Double denum = 0d; - for (int i = 2; i < lines.size(); i++) { - denum += Math.abs(lines.get(i).getM() - lines.get(i - 1).getM()); + for (Line line : lines) { + Double e = Math.pow(naivSlope * line.getM() - line.getB() + naivInterception, 2) / (Math.pow(naivSlope, 2) + 1); + naivSampsonError.add(e); } - denum *= 1 / (lines.size() - 1); for (Line line : lines) { Double e = Math.pow(m * line.getM() - line.getB() + b, 2) / (Math.pow(m, 2) + 1); - sampson.add(e); + sampsonError.add(e); + } - Double val = e / (denum); - scaledError.add(val); + for (int i=0;i points) {