Mercurial > dive4elements > river
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 : |