public ViterbiCalculator(IMLDataSet oseq, HiddenMarkovModel hmm) { if (oseq.Count < 1) { throw new EncogError("Must not have empty sequence"); } this.delta = EngineArray.AllocateDouble2D((int)oseq.Count, hmm.StateCount); this.psy = EngineArray.AllocateInt2D((int)oseq.Count, hmm.StateCount); this._stateSequence = new int[oseq.Count]; for (int i = 0; i < hmm.StateCount; i++) { this.delta[0][i] = -Math.Log(hmm.GetPi(i)) - Math.Log(hmm.StateDistributions[i].Probability( oseq[0])); this.psy[0][i] = 0; } int t = 1; for (int index = 1; index < oseq.Count; index++) { IMLDataPair observation = oseq[index]; for (int i = 0; i < hmm.StateCount; i++) { ComputeStep(hmm, observation, t, i); } t++; } this.lnProbability = Double.PositiveInfinity; for (int i = 0; i < hmm.StateCount; i++) { double thisProbability = this.delta[oseq.Count - 1][i]; if (this.lnProbability > thisProbability) { this.lnProbability = thisProbability; _stateSequence[oseq.Count - 1] = i; } } this.lnProbability = -this.lnProbability; for (int t2 = (int)(oseq.Count - 2); t2 >= 0; t2--) { _stateSequence[t2] = this.psy[t2 + 1][_stateSequence[t2 + 1]]; } }
public void NewSequence() { double rand = ThreadSafeRandom.NextDouble(); double current = 0.0; for (int i = 0; i < (_hmm.StateCount - 1); i++) { current += _hmm.GetPi(i); if (current > rand) { _currentState = i; return; } } _currentState = _hmm.StateCount - 1; }
/// <summary> /// Compute the probability. /// </summary> /// <param name="oseq">The sequence.</param> /// <param name="hmm">THe hidden markov model.</param> /// <param name="doAlpha">Perform alpha step?</param> /// <param name="doBeta">Perform beta step?</param> private void ComputeProbability(IMLDataSet oseq, HiddenMarkovModel hmm, bool doAlpha, bool doBeta) { probability = 0.0; if (doAlpha) { for (int i = 0; i < hmm.StateCount; i++) { probability += Alpha[oseq.Count - 1][i]; } } else { for (int i = 0; i < hmm.StateCount; i++) { probability += hmm.GetPi(i) * hmm.StateDistributions[i].Probability(oseq[0]) * Beta[0][i]; } } }
/// <summary> /// Compute the alpha init. /// </summary> /// <param name="hmm">THe hidden markov model.</param> /// <param name="o">The element.</param> /// <param name="i">The state.</param> protected void ComputeAlphaInit(HiddenMarkovModel hmm, IMLDataPair o, int i) { Alpha[0][i] = hmm.GetPi(i) * hmm.StateDistributions[i].Probability(o); }
/// <summary> /// Compute the probability. /// </summary> /// <param name="oseq">The sequence.</param> /// <param name="hmm">THe hidden markov model.</param> /// <param name="doAlpha">Perform alpha step?</param> /// <param name="doBeta">Perform beta step?</param> private void ComputeProbability(IMLDataSet oseq, HiddenMarkovModel hmm, bool doAlpha, bool doBeta) { probability = 0.0; if (doAlpha) { for (int i = 0; i < hmm.StateCount; i++) { probability += Alpha[oseq.Count - 1][i]; } } else { for (int i = 0; i < hmm.StateCount; i++) { probability += hmm.GetPi(i) *hmm.StateDistributions[i].Probability(oseq[0]) *Beta[0][i]; } } }
/// <summary> /// Compute the alpha init. /// </summary> /// <param name="hmm">THe hidden markov model.</param> /// <param name="o">The element.</param> /// <param name="i">The state.</param> protected void ComputeAlphaInit(HiddenMarkovModel hmm, IMLDataPair o, int i) { Alpha[0][i] = hmm.GetPi(i) *hmm.StateDistributions[i].Probability(o); }