2020-03-21 00:37:09 +00:00
|
|
|
package de.wwwu.awolf.presenter.algorithms.naiv;
|
2017-09-15 18:18:36 +00:00
|
|
|
|
2020-03-21 00:37:09 +00:00
|
|
|
import de.wwwu.awolf.model.Line;
|
2020-03-28 15:24:35 +00:00
|
|
|
import de.wwwu.awolf.model.communication.Data;
|
|
|
|
import de.wwwu.awolf.presenter.AbstractPresenter;
|
2020-03-21 00:37:09 +00:00
|
|
|
import de.wwwu.awolf.presenter.algorithms.Algorithm;
|
|
|
|
import de.wwwu.awolf.presenter.util.FastElementSelector;
|
|
|
|
import de.wwwu.awolf.presenter.util.Logging;
|
2017-09-15 18:18:36 +00:00
|
|
|
|
2020-03-28 15:24:35 +00:00
|
|
|
import java.util.*;
|
|
|
|
import java.util.concurrent.Flow;
|
2017-09-15 18:18:36 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* 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-28 15:24:35 +00:00
|
|
|
|
|
|
|
private static final Algorithm.Type type = Type.NAIV_LMS;
|
|
|
|
private List<Line> setOfLines = new ArrayList<>();
|
2017-09-15 18:18:36 +00:00
|
|
|
|
2019-08-01 05:19:04 +00:00
|
|
|
private int n;
|
|
|
|
private double ds, b, m;
|
2020-03-28 15:24:35 +00:00
|
|
|
private Flow.Subscriber<? super Data> subscriber;
|
|
|
|
private AbstractPresenter presenter;
|
2017-09-15 18:18:36 +00:00
|
|
|
|
|
|
|
|
2017-10-15 13:21:53 +00:00
|
|
|
/**
|
|
|
|
* Crude Algorithmus zum berechnen des LSM-Schätzers.
|
|
|
|
*/
|
2020-03-21 19:54:03 +00:00
|
|
|
private Line crudeAlg() {
|
2017-09-15 18:18:36 +00:00
|
|
|
ds = Double.MAX_VALUE;
|
2017-09-16 13:26:33 +00:00
|
|
|
b = 0d;
|
|
|
|
m = 0d;
|
2020-03-28 15:24:35 +00:00
|
|
|
List<Line> triple = new ArrayList<>();
|
2019-08-01 05:19:04 +00:00
|
|
|
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 ===");
|
2017-10-12 15:21:16 +00:00
|
|
|
long start;
|
|
|
|
long end;
|
|
|
|
start = System.currentTimeMillis();
|
2020-03-28 15:24:35 +00:00
|
|
|
for (Line i : setOfLines) {
|
|
|
|
for (Line j : setOfLines) {
|
|
|
|
for (Line k : setOfLines) {
|
2017-09-15 18:18:36 +00:00
|
|
|
triple.add(i);
|
|
|
|
triple.add(j);
|
|
|
|
triple.add(k);
|
|
|
|
Collections.sort(triple);
|
2020-03-28 15:24:35 +00:00
|
|
|
beta = (triple.get(0).getB() - triple.get(2).getB()) / (triple.get(0).getM() - triple.get(2).getM());
|
|
|
|
alpha = (triple.get(1).getB() + triple.get(2).getB() - (beta * (triple.get(1).getM() + triple.get(2).getM()))) * 0.5;
|
2017-09-19 11:34:06 +00:00
|
|
|
dijk = f(alpha, beta);
|
|
|
|
if (dijk < ds) {
|
2017-09-15 18:18:36 +00:00
|
|
|
ds = dijk;
|
2017-09-16 13:26:33 +00:00
|
|
|
b = alpha;
|
|
|
|
m = beta;
|
2017-09-15 18:18:36 +00:00
|
|
|
}
|
|
|
|
triple.clear();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2017-10-12 15:21:16 +00:00
|
|
|
end = System.currentTimeMillis();
|
2020-03-28 15:24:35 +00:00
|
|
|
Logging.logInfo("=== E N D - naiv L M S ===");
|
|
|
|
Logging.logInfo("Slope: " + getSlope() + ", y-Interception: " + getYInterception());
|
2020-03-21 19:54:03 +00:00
|
|
|
|
|
|
|
return new Line(getSlope(), getYInterception());
|
2017-09-15 18:18:36 +00:00
|
|
|
}
|
|
|
|
|
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
|
|
|
|
*/
|
2019-08-01 05:19:04 +00:00
|
|
|
private Double f(double a, double b) {
|
2020-03-21 00:37:09 +00:00
|
|
|
List<Double> res = new ArrayList<>();
|
2020-03-28 15:24:35 +00:00
|
|
|
for (Line p : setOfLines) {
|
|
|
|
res.add(Math.abs(p.getB() - (a + b * p.getM())));
|
2017-09-15 18:18:36 +00:00
|
|
|
}
|
2020-03-21 00:37:09 +00:00
|
|
|
return FastElementSelector.randomizedSelect(res, res.size() * 0.5);
|
2017-09-15 18:18:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2020-03-21 19:54:03 +00:00
|
|
|
public Line call() {
|
|
|
|
return crudeAlg();
|
2017-09-15 18:18:36 +00:00
|
|
|
}
|
|
|
|
|
2020-03-28 15:24:35 +00:00
|
|
|
@Override
|
|
|
|
public void setInput(Set<Line> lines) {
|
|
|
|
this.setOfLines = new LinkedList<>(lines);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public Type getType() {
|
|
|
|
return type;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void setPresenter(AbstractPresenter presenter) {
|
|
|
|
this.presenter = presenter;
|
|
|
|
subscribe(presenter);
|
|
|
|
}
|
|
|
|
|
2017-10-15 13:21:53 +00:00
|
|
|
/**
|
|
|
|
* @return y-Achsenabschnitt
|
|
|
|
*/
|
2020-03-21 19:54:03 +00:00
|
|
|
public Double getYInterception() {
|
2017-09-16 13:26:33 +00:00
|
|
|
return b * -1;
|
2017-09-15 18:18:36 +00:00
|
|
|
}
|
|
|
|
|
2017-10-15 13:21:53 +00:00
|
|
|
/**
|
|
|
|
* @return Steigung
|
|
|
|
*/
|
2020-03-21 19:54:03 +00:00
|
|
|
public Double getSlope() {
|
2017-09-16 13:26:33 +00:00
|
|
|
return m * -1;
|
2017-09-15 18:18:36 +00:00
|
|
|
}
|
2020-03-28 15:24:35 +00:00
|
|
|
|
|
|
|
@Override
|
|
|
|
public void subscribe(Flow.Subscriber<? super Data> subscriber) {
|
|
|
|
this.subscriber = subscriber;
|
|
|
|
}
|
2017-09-15 18:18:36 +00:00
|
|
|
}
|