algorithms-for-computing-li.../LinearRegressionTool/src/main/java/de/wwwu/awolf/presenter/algorithms/naiv/NaivLeastMedianOfSquaresEst...

114 lines
3.0 KiB
Java
Raw Normal View History

2020-03-21 00:37:09 +00:00
package de.wwwu.awolf.presenter.algorithms.naiv;
2020-03-21 00:37:09 +00:00
import de.wwwu.awolf.model.Line;
import de.wwwu.awolf.model.Point;
import de.wwwu.awolf.presenter.algorithms.Algorithm;
import de.wwwu.awolf.presenter.util.FastElementSelector;
import de.wwwu.awolf.presenter.util.Logging;
import java.util.ArrayList;
import java.util.Collections;
2020-03-21 00:37:09 +00:00
import java.util.List;
/**
* Implementierung verschiedener Algorithmen zur Berechnung von Ausgleichsgeraden.
*
* @Author: Armin Wolf
* @Email: a_wolf28@uni-muenster.de
* @Date: 15.09.2017.
*/
public class NaivLeastMedianOfSquaresEstimator implements Algorithm {
2020-03-21 00:37:09 +00:00
private List<Point> set = new ArrayList<>();
private int n;
private double ds, b, m;
2017-10-15 13:21:53 +00:00
/**
* Konstruktor
2020-03-20 17:08:18 +00:00
*
2017-10-15 13:21:53 +00:00
* @param lines Liste des Geraden
*/
2020-03-21 00:37:09 +00:00
public NaivLeastMedianOfSquaresEstimator(List<Line> lines) {
for (Line l : lines) {
set.add(new Point(l.getM(), l.getB()));
}
}
2017-10-15 13:21:53 +00:00
/**
* Crude Algorithmus zum berechnen des LSM-Schätzers.
*/
private void crudeAlg() {
ds = Double.MAX_VALUE;
b = 0d;
m = 0d;
2020-03-21 00:37:09 +00:00
List<Point> triple = new ArrayList<>();
double beta;
double alpha;
double dijk;
2020-03-21 00:37:09 +00:00
Logging.logInfo("=== S T A R T - naiv L M S ===");
long start;
long end;
start = System.currentTimeMillis();
for (Point i : set) {
for (Point j : set) {
for (Point k : set) {
triple.add(i);
triple.add(j);
triple.add(k);
Collections.sort(triple);
beta = (triple.get(0).getY() - triple.get(2).getY()) / (triple.get(0).getX() - triple.get(2).getX());
2020-03-21 00:37:09 +00:00
alpha = (triple.get(1).getY() + triple.get(2).getY() - (beta * (triple.get(1).getX() + triple.get(2).getX()))) * 0.5;
dijk = f(alpha, beta);
if (dijk < ds) {
ds = dijk;
b = alpha;
m = beta;
}
triple.clear();
}
}
}
end = System.currentTimeMillis();
2020-03-21 00:37:09 +00:00
Logging.logInfo("Zeit: " + ((end - start) / 1000));
}
2017-10-15 13:21:53 +00:00
/**
* Berechnet die Gerade mit dem medianen Fehler
2020-03-20 17:08:18 +00:00
*
2017-10-15 13:21:53 +00:00
* @param a y-Achsenabschnitt
* @param b Steigung
* @return medianer Fehler
*/
private Double f(double a, double b) {
2020-03-21 00:37:09 +00:00
List<Double> res = new ArrayList<>();
for (Point p : set) {
res.add(Math.abs(p.getY() - (a + b * p.getX())));
}
2020-03-21 00:37:09 +00:00
return FastElementSelector.randomizedSelect(res, res.size() * 0.5);
}
@Override
public void run() {
crudeAlg();
}
@Override
public void pepareResult() {
}
2017-10-15 13:21:53 +00:00
/**
* @return y-Achsenabschnitt
*/
public Double getB() {
return b * -1;
}
2017-10-15 13:21:53 +00:00
/**
* @return Steigung
*/
public Double getM() {
return m * -1;
}
}