view flys-artifacts/src/main/java/de/intevation/flys/artifacts/math/StdDevOutlier.java @ 5242:88e3473a3846 2.9.12

Add kind handling for floodplains and crossectiontracks getFloodplain / getCrossection now return only the "current" one 1 is current 0 is misc
author Andre Heinecke <aheinecke@intevation.de>
date Tue, 12 Mar 2013 11:29:10 +0100
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 :

http://dive4elements.wald.intevation.org