package dist.hmm; import dist.*; import shared.*; /** * A look up table distribution for transitions * @author Andrew Guillory gtg008g@mail.gatech.edu * @version 1.0 */ public class SimpleStateDistributionTable extends DiscreteDistributionTable implements StateDistribution, Copyable { /** * Create a new look up table transition distribution * @param probabilities the array of probabilities */ public SimpleStateDistributionTable(double[][] probabilities) { super(probabilities); } /** * Make a new look up table of transition probabilities * @param distributions */ public SimpleStateDistributionTable(DiscreteDistribution[] distributions) { super(distributions); } /** * @see hmm.distribution.TransitionDistribution#probabilityOfState(int, hmm.observation.Observation) */ public double p(int nextState, Instance o) { Instance instance = new Instance(o.getData(), new Instance(nextState)); return p(instance); } /** * @see hmm.distribution.TransitionDistribution#generateState(hmm.observation.Observation) */ public int generateRandomState(Instance o) { return sample(o).getDiscrete(); } /** * @see hmm.distribution.TransitionDistribution#match(double[][], hmm.observation.Observation[]) */ public void estimate(double[][] expectations, DataSet observations) { double[][] matrix = getProbabilityMatrix(); double[] sums = new double[getInputRange()]; for (int i = 0; i < matrix.length; i++) { for (int j = 0; j < matrix[i].length; j++) { matrix[i][j] = 0; } } // sum up expectations for (int t = 0; t < expectations.length; t++) { int input = observations.get(t).getDiscrete(); for (int j = 0; j < expectations[t].length; j++) { matrix[input][j] += expectations[t][j]; sums[input] += expectations[t][j]; } } // probability = expected / sum of expected for (int i = 0; i < matrix.length; i++) { double[] prior = getDistributions()[i].getPrior(); double m = getDistributions()[i].getM(); for (int j = 0; j < matrix[i].length; j++) { matrix[i][j] = (matrix[i][j] + m * prior[j]) / (sums[i] + m); } } } /** * @see hmm.distribution.StateDistribution#generateMostLikely(hmm.observation.Observation) */ public int mostLikelyState(Instance o) { return mode(o).getDiscrete(); } public Copyable copy() { DiscreteDistributionTable copy = (DiscreteDistributionTable) super.copy(); DiscreteDistributionTable sscopy = new SimpleStateDistributionTable(copy.getDistributions()); return sscopy; } }