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 :

http://dive4elements.wald.intevation.org