/***********************************************************************
This file is part of KEEL-software, the Data Mining tool for regression,
classification, clustering, pattern mining and so on.
Copyright (C) 2004-2010
F. Herrera (herrera@decsai.ugr.es)
L. S�nchez (luciano@uniovi.es)
J. Alcal�-Fdez (jalcala@decsai.ugr.es)
S. Garc�a (sglopez@ujaen.es)
A. Fern�ndez (alberto.fernandez@ujaen.es)
J. Luengo (julianlm@decsai.ugr.es)
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see http://www.gnu.org/licenses/
**********************************************************************/
package keel.Algorithms.Genetic_Rule_Learning.M5Rules;
/**
* A class to store simple statistics
*/
public class SimpleStatistics {
/** The number of values seen */
public double count = 0;
/** The sum of values seen */
public double sum = 0;
/** The sum of values squared seen */
public double sumSq = 0;
/** The std deviation of values at the last calculateDerived() call */
public double stdDev = Double.NaN;
/** The mean of values at the last calculateDerived() call */
public double mean = Double.NaN;
/** The minimum value seen, or Double.NaN if no values seen */
public double min = Double.NaN;
/** The maximum value seen, or Double.NaN if no values seen */
public double max = Double.NaN;
/**
* Adds a value to the observed values
*
* @param value the observed value
*/
public void add(double value) {
add(value, 1);
}
/**
* Adds a value that has been seen n times to the observed values
*
* @param value the observed value
* @param n the number of times to add value
*/
public void add(double value, double n) {
sum += value * n;
sumSq += value * value * n;
count += n;
if (Double.isNaN(min)) {
min = max = value;
} else if (value < min) {
min = value;
} else if (value > max) {
max = value;
}
}
/**
* Removes a value to the observed values (no checking is done
* that the value being removed was actually added).
*
* @param value the observed value
*/
public void subtract(double value) {
subtract(value, 1);
}
/**
* Subtracts a value that has been seen n times from the observed values
*
* @param value the observed value
* @param n the number of times to subtract value
*/
public void subtract(double value, double n) {
sum -= value * n;
sumSq -= value * value * n;
count -= n;
}
/**
* Tells the object to calculate any statistics that don't have their
* values automatically updated during add. Currently updates the mean
* and standard deviation.
*/
public void calculateDerived() {
mean = Double.NaN;
stdDev = Double.NaN;
if (count > 0) {
mean = sum / count;
stdDev = Double.POSITIVE_INFINITY;
if (count > 1) {
stdDev = sumSq - (sum * sum) / count;
stdDev /= (count - 1);
if (stdDev < 0) {
// System.err.println("Warning: stdDev value = " + stdDev
// + " -- rounded to zero.");
stdDev = 0;
}
stdDev = Math.sqrt(stdDev);
}
}
}
/**
* Returns a string summarising the stats so far.
*
* @return the summary string
*/
public String toString() {
calculateDerived();
return
"Count " + M5StaticUtils.doubleToString(count, 8) + '\n'
+ "Min " + M5StaticUtils.doubleToString(min, 8) + '\n'
+ "Max " + M5StaticUtils.doubleToString(max, 8) + '\n'
+ "Sum " + M5StaticUtils.doubleToString(sum, 8) + '\n'
+ "SumSq " + M5StaticUtils.doubleToString(sumSq, 8) + '\n'
+ "Mean " + M5StaticUtils.doubleToString(mean, 8) + '\n'
+ "StdDev " + M5StaticUtils.doubleToString(stdDev, 8) + '\n';
}
/**
* Tests the paired stats object from the command line.
* reads line from stdin, expecting two values per line.
*
* @param args ignored.
*/
public static void main(String[] args) {
try {
SimpleStatistics ps = new SimpleStatistics();
java.io.LineNumberReader r = new java.io.LineNumberReader(
new java.io.InputStreamReader(System.in));
String line;
while ((line = r.readLine()) != null) {
line = line.trim();
if (line.equals("") || line.startsWith("@") ||
line.startsWith("%")) {
continue;
}
java.util.StringTokenizer s
= new java.util.StringTokenizer(line, " ,\t\n\r\f");
int count = 0;
double v1 = 0;
while (s.hasMoreTokens()) {
double val = (new Double(s.nextToken())).doubleValue();
if (count == 0) {
v1 = val;
} else {
System.err.println("MSG: Too many values in line \""
+ line + "\", skipped.");
break;
}
count++;
}
if (count == 1) {
ps.add(v1);
}
}
ps.calculateDerived();
System.err.println(ps);
} catch (Exception ex) {
ex.printStackTrace();
System.err.println(ex.getMessage());
}
}
}