Java examples for java.lang:Math Statistics
Adjust variance.
/**//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; } }