package dist.hmm; import dist.*; import shared.*; /** * A simple state functin doesn't look at the input * observations at all when updating it's probabilities * @author Andrew Guillory gtg008g@mail.gatech.edu * @version 1.0 */ public class SimpleStateDistribution extends DiscreteDistribution implements StateDistribution, Copyable { /** * Make a new simple state distribution * @param probabilities the probabilities */ public SimpleStateDistribution(double[] probabilities) { super(probabilities); } /** * @see hmm.distribution.StateDistribution#probabilityOfState(int, hmm.observation.Observation) */ public double p(int nextState, Instance observation) { return p(new Instance(nextState)); } /** * @see hmm.distribution.StateDistribution#match(double[][], hmm.observation.Observation[]) */ public void estimate(double[][] expectations, DataSet observations) { double sum = 0; double[] probabilities = getProbabilities(); for (int i = 0; i < probabilities.length; i++) { probabilities[i] = 0; } // sum up expectations for (int t = 0; t < expectations.length; t++) { for (int j = 0; j < expectations[t].length; j++) { probabilities[j] += expectations[t][j]; sum += expectations[t][j]; } } // probability = expected / sum of expected for (int j = 0; j < probabilities.length; j++) { probabilities[j] = (probabilities[j] + getM() * getPrior()[j]) / (sum + getM()); } } /** * @see hmm.distribution.TransitionDistribution#generateState(hmm.observation.Observation) */ public int generateRandomState(Instance o) { return sample(o).getDiscrete(); } /** * @see hmm.distribution.StateDistribution#generateMostLikely(hmm.observation.Observation) */ public int mostLikelyState(Instance o) { return mode(o).getDiscrete(); } public Copyable copy() { DiscreteDistribution copy = (DiscreteDistribution) super.copy(); SimpleStateDistribution sscopy = new SimpleStateDistribution(copy.getProbabilities()); sscopy.setM(getM()); sscopy.setPrior(getPrior()); return sscopy; } }