Adjust variance. - Java java.lang

Java examples for java.lang:Math Statistics

Description

Adjust variance.

Demo Code

/**//from   www  .j av  a2 s  .com
 * Copyright 2004-2006 DFKI GmbH.
 * All Rights Reserved.  Use is subject to license terms.
 * 
 * Permission is hereby granted, free of charge, to use and distribute
 * this software and its documentation without restriction, including
 * without limitation the rights to use, copy, modify, merge, publish,
 * distribute, sublicense, and/or sell copies of this work, and to
 * permit persons to whom this work is furnished to do so, subject to
 * the following conditions:
 * 
 * 1. The code must retain the above copyright notice, this list of
 *    conditions and the following disclaimer.
 * 2. Any modifications must be clearly marked as such.
 * 3. Original authors' names are not deleted.
 * 4. The authors' names are not used to endorse or promote products
 *    derived from this software without specific prior written
 *    permission.
 *
 * DFKI GMBH AND THE CONTRIBUTORS TO THIS WORK DISCLAIM ALL WARRANTIES WITH
 * REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL DFKI GMBH NOR THE
 * CONTRIBUTORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
 * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
 * THIS SOFTWARE.
 */
//package com.java2s;
import java.util.Arrays;

public class Main {
    /**
     * Adjust variance.
     *
     * @param x the x
     * @param newVariance the new variance
     */
    public static void adjustVariance(double[] x, double newVariance) {
        adjustStandardDeviation(x, Math.sqrt(newVariance));
    }

    /**
     * Adjust standard deviation.
     *
     * @param x the x
     * @param newStandardDeviation the new standard deviation
     */
    public static void adjustStandardDeviation(double[] x,
            double newStandardDeviation) {
        double currentMean = mean(x);
        double currentStdDev = standardDeviation(x, currentMean);

        for (int i = 0; i < x.length; i++)
            x[i] = ((x[i] - currentMean) * newStandardDeviation / currentStdDev)
                    + currentMean;
    }

    /**
     * Mean.
     *
     * @param data the data
     * @return the double
     */
    public static double mean(double[] data) {
        return mean(data, 0, data.length - 1);
    }

    /**
     * Compute the mean of all elements in the array. No missing values (NaN) are allowed.
     *
     * @param data the data
     * @param startIndex the start index
     * @param endIndex the end index
     * @return the double
     */
    public static double mean(double[] data, int startIndex, int endIndex) {
        double mean = 0;
        int total = 0;
        startIndex = Math.max(startIndex, 0);
        startIndex = Math.min(startIndex, data.length - 1);
        endIndex = Math.max(endIndex, 0);
        endIndex = Math.min(endIndex, data.length - 1);

        if (startIndex > endIndex)
            startIndex = endIndex;

        for (int i = startIndex; i <= endIndex; i++) {
            if (Double.isNaN(data[i]))
                throw new IllegalArgumentException(
                        "NaN not allowed in mean calculation");
            mean += data[i];
            total++;
        }
        mean /= total;
        return mean;
    }

    /**
     * Compute the mean of all elements in the array with given indices. No missing values (NaN) are allowed.
     *
     * @param data the data
     * @param inds the inds
     * @return the double
     */
    public static double mean(double[] data, int[] inds) {
        double mean = 0;
        for (int i = 0; i < inds.length; i++) {
            if (Double.isNaN(data[inds[i]]))
                throw new IllegalArgumentException(
                        "NaN not allowed in mean calculation");

            mean += data[inds[i]];
        }
        mean /= inds.length;
        return mean;
    }

    /**
     * Compute the mean of all elements in the array. No missing values (NaN) are allowed.
     *
     * @param data the data
     * @param startIndex the start index
     * @param endIndex the end index
     * @return the float
     */
    public static float mean(float[] data, int startIndex, int endIndex) {
        float mean = 0;
        int total = 0;
        startIndex = Math.max(startIndex, 0);
        startIndex = Math.min(startIndex, data.length - 1);
        endIndex = Math.max(endIndex, 0);
        endIndex = Math.min(endIndex, data.length - 1);

        if (startIndex > endIndex)
            startIndex = endIndex;

        for (int i = startIndex; i <= endIndex; i++) {
            if (Float.isNaN(data[i]))
                throw new IllegalArgumentException(
                        "NaN not allowed in mean calculation");
            mean += data[i];
            total++;
        }
        mean /= total;
        return mean;
    }

    /**
     * Mean.
     *
     * @param data the data
     * @return the float
     */
    public static float mean(float[] data) {
        return mean(data, 0, data.length - 1);
    }

    /**
     * Compute the mean of all elements in the array with given indices. No missing values (NaN) are allowed.
     *
     * @param data the data
     * @param inds the inds
     * @return the float
     */
    public static float mean(float[] data, int[] inds) {
        float mean = 0;
        for (int i = 0; i < inds.length; i++) {
            if (Float.isNaN(data[inds[i]]))
                throw new IllegalArgumentException(
                        "NaN not allowed in mean calculation");

            mean += data[inds[i]];
        }
        mean /= inds.length;
        return mean;
    }

    /**
     * Mean.
     *
     * @param x the x
     * @return the double[]
     */
    public static double[] mean(double[][] x) {
        return mean(x, true);
    }

    /**
     * Mean.
     *
     * @param x the x
     * @param isAlongRows the is along rows
     * @return the double[]
     */
    public static double[] mean(double[][] x, boolean isAlongRows) {
        int[] indices = null;
        int i;

        if (isAlongRows) {
            indices = new int[x.length];
            for (i = 0; i < x.length; i++)
                indices[i] = i;
        } else {
            indices = new int[x[0].length];
            for (i = 0; i < x[0].length; i++)
                indices[i] = i;
        }

        return mean(x, isAlongRows, indices);
    }

    /**
     * Mean.
     *
     * @param x the x
     * @param isAlongRows the is along rows
     * @param indicesOfX the indices of x
     * @return the double[]
     */
    public static double[] mean(double[][] x, boolean isAlongRows,
            int[] indicesOfX) {
        double[] meanVector = null;
        int i, j;
        if (isAlongRows) {
            meanVector = new double[x[indicesOfX[0]].length];
            Arrays.fill(meanVector, 0.0);

            for (i = 0; i < indicesOfX.length; i++) {
                for (j = 0; j < x[indicesOfX[0]].length; j++)
                    meanVector[j] += x[indicesOfX[i]][j];
            }

            for (j = 0; j < meanVector.length; j++)
                meanVector[j] /= indicesOfX.length;
        } else {
            meanVector = new double[x.length];
            Arrays.fill(meanVector, 0.0);

            for (i = 0; i < indicesOfX.length; i++) {
                for (j = 0; j < x.length; j++)
                    meanVector[j] += x[j][indicesOfX[i]];
            }

            for (j = 0; j < meanVector.length; j++)
                meanVector[j] /= indicesOfX.length;
        }

        return meanVector;
    }

    /**
     * Standard deviation.
     *
     * @param data the data
     * @return the double
     */
    public static double standardDeviation(double[] data) {
        return standardDeviation(data, mean(data));
    }

    /**
     * Standard deviation.
     *
     * @param data the data
     * @param meanVal the mean val
     * @return the double
     */
    public static double standardDeviation(double[] data, double meanVal) {
        return standardDeviation(data, meanVal, 0, data.length - 1);
    }

    /**
     * Standard deviation.
     *
     * @param data the data
     * @param meanVal the mean val
     * @param startIndex the start index
     * @param endIndex the end index
     * @return the double
     */
    public static double standardDeviation(double[] data, double meanVal,
            int startIndex, int endIndex) {
        return Math.sqrt(variance(data, meanVal, startIndex, endIndex));
    }

    /**
     * Find the maximum of all elements in the array, ignoring elements that are NaN.
     *
     * @param data the data
     * @return the double
     */
    public static double max(double[] data) {
        double max = Double.NaN;
        for (int i = 0; i < data.length; i++) {
            if (Double.isNaN(data[i]))
                continue;
            if (Double.isNaN(max) || data[i] > max)
                max = data[i];
        }
        return max;
    }

    /**
     * Max.
     *
     * @param data the data
     * @return the int
     */
    public static int max(int[] data) {
        int max = data[0];
        for (int i = 1; i < data.length; i++) {
            if (data[i] > max)
                max = data[i];
        }
        return max;
    }

    /**
     * Find the minimum of all elements in the array, ignoring elements that are NaN.
     *
     * @param data the data
     * @return the double
     */
    public static double min(double[] data) {
        double min = Double.NaN;
        for (int i = 0; i < data.length; i++) {
            if (Double.isNaN(data[i]))
                continue;
            if (Double.isNaN(min) || data[i] < min)
                min = data[i];
        }
        return min;
    }

    /**
     * Min.
     *
     * @param data the data
     * @return the int
     */
    public static int min(int[] data) {
        int min = data[0];
        for (int i = 1; i < data.length; i++) {
            if (data[i] < min)
                min = data[i];
        }
        return min;
    }

    /**
     * Variance.
     *
     * @param data the data
     * @return the double
     */
    public static double variance(double[] data) {
        return variance(data, mean(data));
    }

    /**
     * Variance.
     *
     * @param data the data
     * @param meanVal the mean val
     * @return the double
     */
    public static double variance(double[] data, double meanVal) {
        return variance(data, meanVal, 0, data.length - 1);
    }

    /**
     * Variance.
     *
     * @param data the data
     * @param meanVal the mean val
     * @param startIndex the start index
     * @param endIndex the end index
     * @return the double
     */
    public static double variance(double[] data, double meanVal,
            int startIndex, int endIndex) {
        double var = 0.0;

        if (startIndex < 0)
            startIndex = 0;
        if (startIndex > data.length - 1)
            startIndex = data.length - 1;
        if (endIndex < startIndex)
            endIndex = startIndex;
        if (endIndex > data.length - 1)
            endIndex = data.length - 1;

        for (int i = startIndex; i <= endIndex; i++)
            var += (data[i] - meanVal) * (data[i] - meanVal);

        if (endIndex - startIndex > 1)
            var /= (endIndex - startIndex);

        return var;
    }

    /**
     * Variance.
     *
     * @param x the x
     * @param meanVector the mean vector
     * @return the double[]
     */
    public static double[] variance(double[][] x, double[] meanVector) {
        return variance(x, meanVector, true);
    }

    /**
     * Returns the variance of rows or columns of matrix x.
     *
     * @param x the matrix consisting of row vectors
     * @param meanVector the mean vector
     * @param isAlongRows the is along rows
     * @return the double[]
     */
    public static double[] variance(double[][] x, double[] meanVector,
            boolean isAlongRows) {
        double[] var = null;

        if (x != null && x[0] != null && x[0].length > 0
                && meanVector != null) {
            if (isAlongRows) {
                var = new double[x[0].length];
                int j, i;
                for (j = 0; j < x[0].length; j++) {
                    for (i = 0; i < x.length; i++)
                        var[j] += (x[i][j] - meanVector[j])
                                * (x[i][j] - meanVector[j]);

                    var[j] /= (x.length - 1);
                }
            } else {
                var = new double[x.length];
                for (int i = 0; i < x.length; i++) {
                    var[i] = variance(x[i], meanVector[i]);
                }
            }
        }

        return var;
    }
}

Related Tutorials