Mercurial > dive4elements > river
view flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/sq/Outlier.java @ 4357:11cf29eb002c
FacetTypes: New type: exreme_wq_curve_base (for the Stuetz-Q-Poits).
author | Felix Wolfsteller <felix.wolfsteller@intevation.de> |
---|---|
date | Fri, 02 Nov 2012 11:58:11 +0100 |
parents | b8b1280606c2 |
children | a7d080347ac3 |
line wrap: on
line source
package de.intevation.flys.artifacts.model.sq; import java.util.ArrayList; import java.util.List; import org.apache.commons.math.MathException; import org.apache.commons.math.stat.descriptive.moment.StandardDeviation; import org.apache.log4j.Logger; public class Outlier { private static Logger log = Logger.getLogger(Outlier.class); public interface Callback { void initialize(List<SQ> sqs) throws MathException; double eval(SQ sq); void iterationFinished( double stdDev, SQ outlier, List<SQ> remaining); } // interface Callback public static void detectOutliers( Callback callback, List<SQ> sqs, double stdDevFactor ) throws MathException { boolean debug = log.isDebugEnabled(); if (debug) { log.debug("stdDevFactor: " + stdDevFactor); } List<SQ> data = new ArrayList<SQ>(sqs); while (data.size() > 2) { callback.initialize(data); StandardDeviation stdDev = new StandardDeviation(); double maxValue = -Double.MAX_VALUE; int maxIndex = -1; for (int i = data.size()-1; i >= 0; --i) { double value = Math.abs(callback.eval(data.get(i))); stdDev.increment(value); if (value > maxValue) { maxValue = value; maxIndex = i; } } double sd = stdDev.getResult(); double accepted = stdDevFactor * sd; if (debug) { log.debug("std dev: " + stdDev); log.debug("accepted: " + accepted); log.debug("max value: " + maxValue); } SQ outlier = maxValue > accepted ? data.remove(maxIndex) : null; callback.iterationFinished(sd, outlier, data); if (outlier == null) { break; } } } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :