package dist.test;
import java.util.Random;
import dist.Distribution;
import dist.DiscreteDistribution;
import shared.DataSet;
import shared.Instance;
import dist.hmm.HiddenMarkovModelReestimator;
import dist.hmm.ForwardBackwardProbabilityCalculator;
import dist.hmm.SimpleHiddenMarkovModel;
import dist.hmm.StateSequenceCalculator;
/**
* A simple coin flipping test
* @author Andrew Guillory gtg008g@mail.gatech.edu
* @version 1.0
*/
public class HMMRandomCoinTest {
/**
* The main method
* @param args ignored
*/
public static void main(String[] args) {
// simple coin flip test
SimpleHiddenMarkovModel model = new SimpleHiddenMarkovModel(2);
model.setInitialStateProbabilities(new double[] {
.5, .5
});
model.setOutputDistributions(new Distribution[] {
new DiscreteDistribution(new double[] { .9, .1}),
new DiscreteDistribution(new double[] { .9, .1})
});
model.setTransitionProbabilities(new double[][] {
{ .5, .5 },
{ .5, .5 }
});
Random random = new Random();
Instance[] sequence = new Instance[1000];
for (int i = 0; i < sequence.length; i++) {
sequence[i] = new Instance(random.nextInt(2));
}
DataSet[] sequences = new DataSet[] {
new DataSet(sequence)
};
System.out.println(model + "\n");
System.out.println("Observation Sequences: ");
for (int i = 0; i < sequences.length; i++) {
System.out.println(sequences[i]);
}
System.out.println();
ForwardBackwardProbabilityCalculator fbc = new ForwardBackwardProbabilityCalculator(model, sequences[0]);
System.out.println("Log Probability of first sequence: ");
System.out.println(fbc.calculateLogProbability());
System.out.println();
StateSequenceCalculator vc = new StateSequenceCalculator(model, sequences[0]);
int[] states = vc.calculateStateSequence();
System.out.println("Most likely state sequence of first sequence: ");
for (int i = 0; i < states.length; i++) {
System.out.print(states[i] + " ");
}
System.out.println();
System.out.println();
System.out.println("Reestimations of model based on sequences: ");
HiddenMarkovModelReestimator bwr = new HiddenMarkovModelReestimator(model, sequences);
bwr.train();
System.out.println(model + "\n");
bwr.train();
System.out.println(model + "\n");
for (int i = 0; i < 1000; i++) {
bwr.train();
}
System.out.println(model + "\n");
fbc = new ForwardBackwardProbabilityCalculator(model, sequences[0]);
System.out.println("Log Probability of first sequence: ");
System.out.println(fbc.calculateLogProbability());
}
}