view flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/sq/Outlier.java @ 3572:b8b1280606c2

Removed superfluous imports. flys-artifacts/trunk@5179 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Thu, 09 Aug 2012 08:04:06 +0000
parents 8d0f06b76e09
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 :

http://dive4elements.wald.intevation.org