comparison flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/sq/Outlier.java @ 3187:1e2733f749b5

SQ: Added specialized outlier test for the S/Q relation. flys-artifacts/trunk@4802 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Tue, 26 Jun 2012 16:00:59 +0000
parents
children 1e46ced2bb57
comparison
equal deleted inserted replaced
3186:c130be3fa809 3187:1e2733f749b5
1 package de.intevation.flys.artifacts.model.sq;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import org.apache.commons.math.stat.descriptive.moment.StandardDeviation;
7
8 public class Outlier
9 {
10 public static final int MAX_ITERATIONS = 1000;
11
12 public interface Callback {
13
14 double eval(SQ sq);
15
16 void iteration(int i);
17
18 void outlier(SQ sq);
19
20 void finished();
21
22 } // interface Callback
23
24 private static final class EvalSQ {
25 protected SQ sq;
26 protected double value;
27
28 public EvalSQ(SQ sq) {
29 this.sq = sq;
30 }
31 } // class EvalSQ
32
33 public static List<SQ> detectOutliers(
34 Callback callback,
35 List<SQ> sqs,
36 double stdDevFactor
37 ) {
38 List<EvalSQ> data = new ArrayList<EvalSQ>(sqs.size());
39
40 for (SQ sq: sqs) {
41 data.add(new EvalSQ(sq));
42 }
43
44 List<EvalSQ> good = new ArrayList<EvalSQ>(sqs.size());
45
46 for (int i = 0; i < MAX_ITERATIONS && data.size() > 2; ++i) {
47
48 StandardDeviation stdDev = new StandardDeviation();
49
50 for (EvalSQ esq: data) {
51 stdDev.increment(esq.value = callback.eval(esq.sq));
52 }
53
54 double accepted = stdDevFactor * stdDev.getResult();
55
56 callback.iteration(i);
57
58 for (EvalSQ esq: data) {
59 if (Math.abs(esq.value) > accepted) {
60 callback.outlier(esq.sq);
61 }
62 else {
63 good.add(esq);
64 }
65 }
66
67 if (good.size() == data.size()) {
68 break;
69 }
70
71 List<EvalSQ> tmp = good;
72 good = data;
73 data = tmp;
74 good.clear();
75 }
76
77 callback.finished();
78
79 List<SQ> result = new ArrayList<SQ>(good.size());
80
81 for (EvalSQ esq: good) {
82 result.add(esq.sq);
83 }
84
85 return result;
86 }
87 }
88 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org