Mercurial > dive4elements > river
comparison flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/sq/Outlier.java @ 3188:1e46ced2bb57
SQ: Added fitting shell for SQ curves.
flys-artifacts/trunk@4803 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Tue, 26 Jun 2012 17:05:11 +0000 |
parents | 1e2733f749b5 |
children | 49fe2ed03c12 |
comparison
equal
deleted
inserted
replaced
3187:1e2733f749b5 | 3188:1e46ced2bb57 |
---|---|
1 package de.intevation.flys.artifacts.model.sq; | 1 package de.intevation.flys.artifacts.model.sq; |
2 | 2 |
3 import java.util.ArrayList; | 3 import java.util.ArrayList; |
4 import java.util.Iterator; | |
4 import java.util.List; | 5 import java.util.List; |
6 | |
7 import org.apache.commons.math.MathException; | |
5 | 8 |
6 import org.apache.commons.math.stat.descriptive.moment.StandardDeviation; | 9 import org.apache.commons.math.stat.descriptive.moment.StandardDeviation; |
7 | 10 |
8 public class Outlier | 11 public class Outlier |
9 { | 12 { |
14 double eval(SQ sq); | 17 double eval(SQ sq); |
15 | 18 |
16 void iteration(int i); | 19 void iteration(int i); |
17 | 20 |
18 void outlier(SQ sq); | 21 void outlier(SQ sq); |
22 | |
23 void standardDeviation(double stdDev); | |
24 | |
25 void reinitialize(Iterator<SQ> good) throws MathException; | |
19 | 26 |
20 void finished(); | 27 void finished(); |
21 | 28 |
22 } // interface Callback | 29 } // interface Callback |
23 | 30 |
32 | 39 |
33 public static List<SQ> detectOutliers( | 40 public static List<SQ> detectOutliers( |
34 Callback callback, | 41 Callback callback, |
35 List<SQ> sqs, | 42 List<SQ> sqs, |
36 double stdDevFactor | 43 double stdDevFactor |
37 ) { | 44 ) |
45 throws MathException | |
46 { | |
38 List<EvalSQ> data = new ArrayList<EvalSQ>(sqs.size()); | 47 List<EvalSQ> data = new ArrayList<EvalSQ>(sqs.size()); |
39 | 48 |
40 for (SQ sq: sqs) { | 49 for (SQ sq: sqs) { |
41 data.add(new EvalSQ(sq)); | 50 data.add(new EvalSQ(sq)); |
42 } | 51 } |
43 | 52 |
44 List<EvalSQ> good = new ArrayList<EvalSQ>(sqs.size()); | 53 List<EvalSQ> good = new ArrayList<EvalSQ>(sqs.size()); |
45 | 54 |
46 for (int i = 0; i < MAX_ITERATIONS && data.size() > 2; ++i) { | 55 for (int i = 1; i <= MAX_ITERATIONS && data.size() > 2; ++i) { |
47 | 56 |
48 StandardDeviation stdDev = new StandardDeviation(); | 57 StandardDeviation stdDev = new StandardDeviation(); |
49 | 58 |
50 for (EvalSQ esq: data) { | 59 for (EvalSQ esq: data) { |
51 stdDev.increment(esq.value = callback.eval(esq.sq)); | 60 stdDev.increment(esq.value = callback.eval(esq.sq)); |
52 } | 61 } |
53 | 62 |
54 double accepted = stdDevFactor * stdDev.getResult(); | 63 double sd = stdDev.getResult(); |
64 | |
65 callback.standardDeviation(sd); | |
66 | |
67 double accepted = stdDevFactor * sd; | |
55 | 68 |
56 callback.iteration(i); | 69 callback.iteration(i); |
57 | 70 |
58 for (EvalSQ esq: data) { | 71 for (EvalSQ esq: data) { |
59 if (Math.abs(esq.value) > accepted) { | 72 if (Math.abs(esq.value) > accepted) { |
65 } | 78 } |
66 | 79 |
67 if (good.size() == data.size()) { | 80 if (good.size() == data.size()) { |
68 break; | 81 break; |
69 } | 82 } |
83 | |
84 callback.reinitialize(asSQIterator(good)); | |
70 | 85 |
71 List<EvalSQ> tmp = good; | 86 List<EvalSQ> tmp = good; |
72 good = data; | 87 good = data; |
73 data = tmp; | 88 data = tmp; |
74 good.clear(); | 89 good.clear(); |
82 result.add(esq.sq); | 97 result.add(esq.sq); |
83 } | 98 } |
84 | 99 |
85 return result; | 100 return result; |
86 } | 101 } |
102 | |
103 protected static Iterator<SQ> asSQIterator(List<EvalSQ> esqs) { | |
104 final Iterator<EvalSQ> parent = esqs.iterator(); | |
105 return new Iterator<SQ>() { | |
106 @Override | |
107 public boolean hasNext() { | |
108 return parent.hasNext(); | |
109 } | |
110 | |
111 @Override | |
112 public SQ next() { | |
113 return parent.next().sq; | |
114 } | |
115 | |
116 @Override | |
117 public void remove() { | |
118 throw new UnsupportedOperationException(); | |
119 } | |
120 }; | |
121 } | |
87 } | 122 } |
88 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : | 123 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : |