sascha@3187: package de.intevation.flys.artifacts.model.sq; sascha@3187: sascha@3187: import java.util.ArrayList; sascha@3187: import java.util.List; sascha@3187: sascha@3188: import org.apache.commons.math.MathException; sascha@3188: sascha@3187: import org.apache.commons.math.stat.descriptive.moment.StandardDeviation; sascha@3187: sascha@3552: import org.apache.log4j.Logger; sascha@3552: sascha@3187: public class Outlier sascha@3187: { sascha@3552: private static Logger log = Logger.getLogger(Outlier.class); sascha@3552: sascha@3187: public interface Callback { sascha@3187: sascha@3566: void initialize(List sqs) throws MathException; sascha@3552: sascha@3187: double eval(SQ sq); sascha@3187: sascha@3566: void iterationFinished( sascha@3566: double stdDev, sascha@3566: SQ outlier, sascha@3566: List remaining); sascha@3187: sascha@3187: } // interface Callback sascha@3187: sascha@3552: public static void detectOutliers( sascha@3187: Callback callback, sascha@3187: List sqs, sascha@3187: double stdDevFactor sascha@3188: ) sascha@3188: throws MathException sascha@3188: { sascha@3552: boolean debug = log.isDebugEnabled(); sascha@3552: sascha@3552: if (debug) { sascha@3552: log.debug("stdDevFactor: " + stdDevFactor); sascha@3552: } sascha@3552: sascha@3566: List data = new ArrayList(sqs); sascha@3187: sascha@3566: while (data.size() > 2) { sascha@3187: sascha@3566: callback.initialize(data); sascha@3187: sascha@3187: StandardDeviation stdDev = new StandardDeviation(); sascha@3187: sascha@3566: double maxValue = -Double.MAX_VALUE; sascha@3566: int maxIndex = -1; sascha@3566: sascha@3566: for (int i = data.size()-1; i >= 0; --i) { sascha@3566: double value = Math.abs(callback.eval(data.get(i))); sascha@3566: stdDev.increment(value); sascha@3566: if (value > maxValue) { sascha@3566: maxValue = value; sascha@3566: maxIndex = i; sascha@3566: } sascha@3187: } sascha@3187: sascha@3188: double sd = stdDev.getResult(); sascha@3188: sascha@3188: double accepted = stdDevFactor * sd; sascha@3187: sascha@3552: if (debug) { sascha@3566: log.debug("std dev: " + stdDev); sascha@3552: log.debug("accepted: " + accepted); sascha@3566: log.debug("max value: " + maxValue); sascha@3187: } sascha@3187: sascha@3566: SQ outlier = maxValue > accepted sascha@3566: ? data.remove(maxIndex) sascha@3566: : null; sascha@3188: sascha@3566: callback.iterationFinished(sd, outlier, data); sascha@3188: sascha@3566: if (outlier == null) { sascha@3566: break; sascha@3188: } sascha@3566: } sascha@3188: } sascha@3187: } sascha@3187: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :