package dist; import shared.Copyable; import shared.DataSet; import shared.Instance; /** * A (single variable) gaussian distribution * @author Andrew Guillory gtg008g@mail.gatech.edu * @version 1.0 */ public class UnivariateGaussian extends AbstractDistribution implements Copyable { /** * The sqrt to two pi */ private static final double SQRTTWOPI = Math.sqrt(2*Math.PI); /** * The mean */ private double mean; /** * The std deviation */ private double sigma; /** * Make a new gaussian * @param mean the mean * @param sigma the sigma */ public UnivariateGaussian(double mean, double sigma) { this.mean = mean; this.sigma = sigma; } /** * Make a new standard normal guassian */ public UnivariateGaussian() { this(0, 1); } /** * @see dist.Distribution#p(shared.Instance) */ public double p(Instance i) { double dMinusMean = i.getContinuous() - mean; return 1/(SQRTTWOPI*sigma) * Math.exp( -.5*dMinusMean*dMinusMean/(sigma*sigma)); } /** * @see dist.Distribution#logp(shared.Instance) */ public double logp(Instance i) { double dMinusMean = i.getContinuous() - mean; return Math.log(1/(SQRTTWOPI*sigma)) -.5*dMinusMean*dMinusMean/(sigma*sigma); } /** * @see dist.Distribution#sample(shared.Instance) */ public Instance sample(Instance i) { return new Instance(random.nextGaussian() * sigma + mean); } /** * @see dist.Distribution#mode(shared.Instance) */ public Instance mode(Instance i) { return new Instance(mean); } /** * @see dist.Distribution#estimate(shared.DataSet) */ public void estimate(DataSet set) { mean = 0; for (int i = 0; i < set.size(); i++) { mean += set.get(i).getContinuous(); } mean /= set.size(); sigma = 0; for (int i = 0; i < set.size(); i++) { double dMinusMean = set.get(i).getContinuous() - mean; sigma += dMinusMean * dMinusMean; } sigma /= set.size() - 1; sigma = Math.sqrt(sigma); } /** * Get the mean * @return returns the mean. */ public double getMean() { return mean; } /** * Set the mean * @param mean the mean to set. */ public void setMean(double mean) { this.mean = mean; } /** * Set the sigma * @param sigma the sigma to set. */ public void setSigma(double sigma) { this.sigma = sigma; } /** * Get the sigma * @return returns the sigma. */ public double getSigma() { return sigma; } /** * @see shared.Copyable#copy() */ public Copyable copy() { return new UnivariateGaussian(mean, sigma); } }