2017-09-15 18:18:36 +00:00
|
|
|
package presenter.algorithms.naiv;
|
|
|
|
|
|
|
|
import model.Line;
|
|
|
|
import model.Point;
|
|
|
|
import presenter.algorithms.Algorithm;
|
|
|
|
import presenter.algorithms.util.FastElementSelector;
|
|
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.Collections;
|
|
|
|
import java.util.LinkedList;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 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 {
|
|
|
|
private ArrayList<Point> set = new ArrayList<>();
|
|
|
|
|
|
|
|
private Integer n;
|
2017-09-16 13:26:33 +00:00
|
|
|
private Double ds, b, m;
|
2017-09-15 18:18:36 +00:00
|
|
|
|
|
|
|
public NaivLeastMedianOfSquaresEstimator(LinkedList<Line> lines) {
|
2017-09-19 11:34:06 +00:00
|
|
|
for (Line l : lines) {
|
|
|
|
set.add(new Point(l.getM(), l.getB()));
|
2017-09-15 18:18:36 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2017-09-19 11:34:06 +00:00
|
|
|
private void 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;
|
2017-09-15 18:18:36 +00:00
|
|
|
ArrayList<Point> triple = new ArrayList<>();
|
|
|
|
Double beta;
|
|
|
|
Double alpha;
|
|
|
|
Double dijk;
|
2017-09-19 11:34:06 +00:00
|
|
|
for (Point i : set) {
|
2017-09-19 15:38:10 +00:00
|
|
|
System.out.println(i);
|
2017-09-15 18:18:36 +00:00
|
|
|
for (Point j : set) {
|
2017-09-19 11:34:06 +00:00
|
|
|
for (Point k : set) {
|
2017-09-15 18:18:36 +00:00
|
|
|
triple.add(i);
|
|
|
|
triple.add(j);
|
|
|
|
triple.add(k);
|
|
|
|
Collections.sort(triple);
|
2017-09-19 11:34:06 +00:00
|
|
|
beta = (triple.get(0).getY() - triple.get(2).getY()) / (triple.get(0).getX() - triple.get(2).getX());
|
|
|
|
alpha = (triple.get(1).getY() + triple.get(2).getY() - (beta * (triple.get(1).getX() + triple.get(2).getX()))) / 2f;
|
|
|
|
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-19 11:34:06 +00:00
|
|
|
// System.out.printf("Distanz: %6.2f\tAlpha: %6.2f\tBeta: %6.2f",ds,b,m);
|
2017-09-15 18:18:36 +00:00
|
|
|
}
|
|
|
|
triple.clear();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2017-09-16 13:26:33 +00:00
|
|
|
System.out.printf("Naiv LMS: %6.2f * x + %6.3f\n", m, b);
|
2017-09-15 18:18:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2017-09-19 11:34:06 +00:00
|
|
|
private Double f(Double a, Double b) {
|
2017-09-15 18:18:36 +00:00
|
|
|
ArrayList<Double> res = new ArrayList<>();
|
2017-09-19 11:34:06 +00:00
|
|
|
for (Point p : set) {
|
2017-09-15 18:18:36 +00:00
|
|
|
res.add(Math.abs(p.getY() - (a + b * p.getX())));
|
|
|
|
}
|
2017-09-19 11:34:06 +00:00
|
|
|
return FastElementSelector.randomizedSelect(res, res.size() / 2);
|
2017-09-15 18:18:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void run() {
|
|
|
|
crudeAlg();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void getResult() {
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2017-09-16 13:26:33 +00:00
|
|
|
public Double getB() {
|
|
|
|
return b * -1;
|
2017-09-15 18:18:36 +00:00
|
|
|
}
|
|
|
|
|
2017-09-16 13:26:33 +00:00
|
|
|
public Double getM() {
|
|
|
|
return m * -1;
|
2017-09-15 18:18:36 +00:00
|
|
|
}
|
|
|
|
}
|