package arkref.ext.fig.basic; import java.util.*; /** * For keeping track of statistics. * Keeps all the data around (can be memory expensive). */ public class FullStatFig extends BigStatFig { public FullStatFig() { } public FullStatFig(Iterable<Double> c) { for(double x : c) add(x); } public void add(double x) { super.add(x); data.add(x); } public double entropy() { double e = 0; for(double x : data) { x /= sum; if(x > 0) e += -x * Math.log(x); } return e; } public double variance() { double v = 0; double m = mean(); for(double x : data) v += (x-m)*(x-m); return v/n; } public double stddev() { return Math.sqrt(variance()); } public List<Double> getData() { return data; } // Return for each lag, the correlation public double[] computeAutocorrelation(int maxLag) { double mean = mean(); double stddev = stddev(); double[] normData = new double[n]; for(int i = 0; i < n; i++) normData[i] = (data.get(i) - mean) / stddev; double[] autocorrelations = new double[maxLag+1]; for(int lag = 0; lag <= maxLag; lag++) { double sum = 0; int count = 0; for(int i = 0; i+lag < n; i++) { sum += normData[i] * normData[i+lag]; count++; } autocorrelations[lag] = sum / count; } return autocorrelations; } public String toString() { return Fmt.D(min) + "/ << " + Fmt.D(mean()) + "~" + Fmt.D(stddev()) + " >> /" + Fmt.D(max) + " (" + n + ")"; } private ArrayList<Double> data = new ArrayList<Double>(); }