public HiddenMarkovModel CloneStructure() { HiddenMarkovModel hmm; if (IsDiscrete) { hmm = new HiddenMarkovModel(StateCount, _items); } else { hmm = new HiddenMarkovModel(StateCount); } return hmm; }
object ICloneable.Clone() { var result = new HiddenMarkovModel(StateCount); EngineArray.ArrayCopy(Pi, result.Pi); EngineArray.ArrayCopy(TransitionProbability, result.TransitionProbability); for (int i = 0; i < StateCount;i++) { result.StateDistributions[i] = StateDistributions[i].Clone(); } return result; }
static HiddenMarkovModel BuildDiscHMM() { HiddenMarkovModel hmm = new HiddenMarkovModel(2, 2); hmm.Pi[0] = 0.95; hmm.Pi[1] = 0.05; hmm.StateDistributions[0] = new DiscreteDistribution(new double[][] { new[] { 0.95, 0.05 } }); hmm.StateDistributions[1] = new DiscreteDistribution(new double[][] { new[] { 0.20, 0.80 } }); hmm.TransitionProbability[0][1] = 0.05; hmm.TransitionProbability[0][0] = 0.95; hmm.TransitionProbability[1][0] = 0.10; hmm.TransitionProbability[1][1] = 0.90; return hmm; }
public void Validate(HiddenMarkovModel result, HiddenMarkovModel source) { KullbackLeiblerDistanceCalculator klc = new KullbackLeiblerDistanceCalculator(); double e = klc.Distance(result, source); Assert.IsTrue(e < 0.01); }
static HiddenMarkovModel BuildContHMM() { double [] mean1 = {0.25, -0.25}; double [][] covariance1 = { new[] {1.0, 2.0}, new[] {1.0, 4.0} }; double [] mean2 = {0.5, 0.25}; double [][] covariance2 = { new[] {4.0, 2.0}, new[] {3.0, 4.0} }; HiddenMarkovModel hmm = new HiddenMarkovModel(2); hmm.Pi[0] = 0.8; hmm.Pi[1] = 0.2; hmm.StateDistributions[0] = new ContinousDistribution(mean1,covariance1); hmm.StateDistributions[1] = new ContinousDistribution(mean2,covariance2); hmm.TransitionProbability[0][1] = 0.05; hmm.TransitionProbability[0][0] = 0.95; hmm.TransitionProbability[1][0] = 0.10; hmm.TransitionProbability[1][1] = 0.90; return hmm; }
/* Initial guess for the Baum-Welch algorithm */ private static HiddenMarkovModel BuildDiscInitHMM() { var hmm = new HiddenMarkovModel(2, 2); hmm.Pi[0] = 0.50; hmm.Pi[1] = 0.50; hmm.StateDistributions[0] = new DiscreteDistribution(new[] {new[] {0.8, 0.2}}); hmm.StateDistributions[1] = new DiscreteDistribution(new[] {new[] {0.1, 0.9}}); hmm.TransitionProbability[0][1] = 0.2; hmm.TransitionProbability[0][0] = 0.8; hmm.TransitionProbability[1][0] = 0.2; hmm.TransitionProbability[1][1] = 0.8; return hmm; }
private static HiddenMarkovModel BuildContInitHMM() { double[] mean1 = {0.20, -0.20}; double[][] covariance1 = {new[] {1.3, 2.2}, new[] {1.3, 4.3}}; double[] mean2 = {0.5, 0.25}; double[][] covariance2 = {new[] {4.1, 2.1}, new[] {3.2, 4.4}}; var hmm = new HiddenMarkovModel(2); hmm.Pi[0] = 0.9; hmm.Pi[1] = 0.1; hmm.StateDistributions[0] = new ContinousDistribution(mean1, covariance1); hmm.StateDistributions[1] = new ContinousDistribution(mean2, covariance2); hmm.TransitionProbability[0][1] = 0.10; hmm.TransitionProbability[0][0] = 0.90; hmm.TransitionProbability[1][0] = 0.15; hmm.TransitionProbability[1][1] = 0.85; return hmm; }
/// <inheritdoc/> public Object Read(Stream istream) { int states = 0; int[] items; double[] pi = null; Matrix transitionProbability = null; IDictionary<String, String> properties = null; IList<IStateDistribution> distributions = new List<IStateDistribution>(); EncogReadHelper reader = new EncogReadHelper(istream); EncogFileSection section; while ((section = reader.ReadNextSection()) != null) { if (section.SectionName.Equals("HMM") && section.SubSectionName.Equals("PARAMS")) { properties = section.ParseParams(); } if (section.SectionName.Equals("HMM") && section.SubSectionName.Equals("CONFIG")) { IDictionary<String, String> p = section.ParseParams(); states = EncogFileSection.ParseInt(p, HiddenMarkovModel.TAG_STATES); if (p.ContainsKey(HiddenMarkovModel.TAG_ITEMS)) { items = EncogFileSection.ParseIntArray(p, HiddenMarkovModel.TAG_ITEMS); } pi = section.ParseDoubleArray(p, HiddenMarkovModel.TAG_PI); transitionProbability = EncogFileSection.ParseMatrix(p, HiddenMarkovModel.TAG_TRANSITION); } else if (section.SectionName.Equals("HMM") && section.SubSectionName.StartsWith("DISTRIBUTION-")) { IDictionary<String, String> p = section.ParseParams(); String t = p[HiddenMarkovModel.TAG_DIST_TYPE]; if ("ContinousDistribution".Equals(t)) { double[] mean = section.ParseDoubleArray(p, HiddenMarkovModel.TAG_MEAN); Matrix cova = EncogFileSection.ParseMatrix(p, HiddenMarkovModel.TAG_COVARIANCE); ContinousDistribution dist = new ContinousDistribution(mean, cova.Data); distributions.Add(dist); } else if ("DiscreteDistribution".Equals(t)) { Matrix prob = EncogFileSection.ParseMatrix(p, HiddenMarkovModel.TAG_PROBABILITIES); DiscreteDistribution dist = new DiscreteDistribution(prob.Data); distributions.Add(dist); } } } HiddenMarkovModel result = new HiddenMarkovModel(states); EngineArray.PutAll(properties, result.Properties); result.TransitionProbability = transitionProbability.Data; result.Pi = pi; int index = 0; foreach (IStateDistribution dist in distributions) { result.StateDistributions[index++] = dist; } return result; }
/// <inheritdoc/> public Object Read(Stream istream) { int states = 0; int[] items; double[] pi = null; Matrix transitionProbability = null; IDictionary <String, String> properties = null; IList <IStateDistribution> distributions = new List <IStateDistribution>(); EncogReadHelper reader = new EncogReadHelper(istream); EncogFileSection section; while ((section = reader.ReadNextSection()) != null) { if (section.SectionName.Equals("HMM") && section.SubSectionName.Equals("PARAMS")) { properties = section.ParseParams(); } if (section.SectionName.Equals("HMM") && section.SubSectionName.Equals("CONFIG")) { IDictionary <String, String> p = section.ParseParams(); states = EncogFileSection.ParseInt(p, HiddenMarkovModel.TAG_STATES); if (p.ContainsKey(HiddenMarkovModel.TAG_ITEMS)) { items = EncogFileSection.ParseIntArray(p, HiddenMarkovModel.TAG_ITEMS); } pi = section.ParseDoubleArray(p, HiddenMarkovModel.TAG_PI); transitionProbability = EncogFileSection.ParseMatrix(p, HiddenMarkovModel.TAG_TRANSITION); } else if (section.SectionName.Equals("HMM") && section.SubSectionName.StartsWith("DISTRIBUTION-")) { IDictionary <String, String> p = section.ParseParams(); String t = p[HiddenMarkovModel.TAG_DIST_TYPE]; if ("ContinousDistribution".Equals(t)) { double[] mean = section.ParseDoubleArray(p, HiddenMarkovModel.TAG_MEAN); Matrix cova = EncogFileSection.ParseMatrix(p, HiddenMarkovModel.TAG_COVARIANCE); ContinousDistribution dist = new ContinousDistribution(mean, cova.Data); distributions.Add(dist); } else if ("DiscreteDistribution".Equals(t)) { Matrix prob = EncogFileSection.ParseMatrix(p, HiddenMarkovModel.TAG_PROBABILITIES); DiscreteDistribution dist = new DiscreteDistribution(prob.Data); distributions.Add(dist); } } } HiddenMarkovModel result = new HiddenMarkovModel(states); EngineArray.PutAll(properties, result.Properties); result.TransitionProbability = transitionProbability.Data; result.Pi = pi; int index = 0; foreach (IStateDistribution dist in distributions) { result.StateDistributions[index++] = dist; } return(result); }