Mercurial > dive4elements > river
view flys-artifacts/src/main/java/de/intevation/flys/artifacts/math/StdDevOutlier.java @ 5785:d38004f0c52f
Datacage: Always clone XML template for builders. If the first is not cloned they get interlinked somehow. Feels like a bug in Java's DOM implementation.
author | Sascha L. Teichmann <teichmann@intevation.de> |
---|---|
date | Mon, 22 Apr 2013 17:01:17 +0200 |
parents | 846b0441f905 |
children |
line wrap: on
line source
package de.intevation.flys.artifacts.math; import java.util.List; import org.apache.commons.math.stat.descriptive.moment.StandardDeviation; import org.apache.log4j.Logger; public class StdDevOutlier { public static final double DEFAULT_FACTOR = 3; private static Logger log = Logger.getLogger(StdDevOutlier.class); protected StdDevOutlier() { } public static Integer findOutlier(List<Double> values) { return findOutlier(values, DEFAULT_FACTOR, null); } public static Integer findOutlier( List<Double> values, double factor, double [] stdDevResult ) { boolean debug = log.isDebugEnabled(); if (debug) { log.debug("factor for std dev: " + factor); } int N = values.size(); if (debug) { log.debug("Values to check: " + N); } if (N < 3) { return null; } StandardDeviation stdDev = new StandardDeviation(); double maxValue = -Double.MAX_VALUE; int maxIndex = -1; for (int i = N-1; i >= 0; --i) { double value = Math.abs(values.get(i)); stdDev.increment(value); if (value > maxValue) { maxValue = value; maxIndex = i; } } double sd = stdDev.getResult(); double accepted = factor * sd; if (debug) { log.debug("std dev: " + stdDev); log.debug("accepted: " + accepted); log.debug("max value: " + maxValue); } if (stdDevResult != null) { stdDevResult[0] = sd; } return maxValue > accepted ? maxIndex : null; } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :