Mercurial > dive4elements > river
diff artifacts/src/main/java/org/dive4elements/river/artifacts/model/fixings/fitting/ChiSquare.java @ 9646:0380717105ba
Implemented alternative fitting strategy for Log-Linear function.
author | Gernot Belger <g.belger@bjoernsen.de> |
---|---|
date | Mon, 02 Dec 2019 17:56:15 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/fixings/fitting/ChiSquare.java Mon Dec 02 17:56:15 2019 +0100 @@ -0,0 +1,52 @@ +/** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde + * Software engineering by + * Björnsen Beratende Ingenieure GmbH + * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt + * + * This file is Free Software under the GNU AGPL (>=v3) + * and comes with ABSOLUTELY NO WARRANTY! Check out the + * documentation coming with Dive4Elements River for details. + */ +package org.dive4elements.river.artifacts.model.fixings.fitting; + +import java.util.Arrays; + +import org.apache.commons.math3.exception.MathIllegalArgumentException; +import org.apache.commons.math3.stat.descriptive.AbstractUnivariateStatistic; +import org.apache.commons.math3.stat.descriptive.UnivariateStatistic; + +/** + * @author Gernot Belger + */ +final class ChiSquare extends AbstractUnivariateStatistic { + + private final double[] observation; + + public ChiSquare(final double[] observation) { + this.observation = observation; + } + + @Override + public UnivariateStatistic copy() { + /* stateless, hence we can return this */ + return this; + } + + @Override + public double evaluate(final double[] values, final int begin, final int length) throws MathIllegalArgumentException { + test(values, begin, length, true); + + final double[] residualsWeights = new double[length]; + Arrays.fill(residualsWeights, 0, length - 1, 1.0); + + double cost = 0; + + for (int i = begin; i < begin + length; i++) { + final double residual = values[i + begin] - this.observation[i + begin]; + // final double wresiduals = residual * FastMath.sqrt(residualsWeights[i]); + cost += residualsWeights[i] * residual * residual; + } + + return cost; + } +} \ No newline at end of file