Entries:
Comments:
Posts:

Loading User Information from Channel 9

Something went wrong getting user information from Channel 9

Latest Achievement:

Loading User Information from MSDN

Something went wrong getting user information from MSDN

Visual Studio Achievements

Latest Achievement:

Loading Visual Studio Achievements

Something went wrong getting the Visual Studio Achievements

SteffenZeidler

SteffenZeidler Steffen​Zeidler

Niner since 2012

  • Brian Beckman: Hidden Markov Models, Viterbi Algorithm, LINQ, Rx and Higgs Boson

    Hi Brian -- For a simple generic numerical solution could be used an additional function parameter mul.

    static IObservable<IDictionary<S, Tuple<P, S>>> ViterbiRx<O, S, P>
    (IObservable<Tuple<O, IEnumerable<S>>> obsStates, Func<S, P> startingProb, Func<S, S, P> transitionProb, Func<S, O, P> emissionProb, Func<P, P, P> mul)
    {
        return obsStates.Scan((IDictionary<S, Tuple<P, S>>)null, (v, o) => o.Item2.ToDictionary(target => target, target =>
            v == null ? Tuple.Create(mul(startingProb(target), emissionProb(target, o.Item1)), target)
            : v.Select(source => Tuple.Create(mul(mul(source.Value.Item1, transitionProb(source.Key, target)), emissionProb(target, o.Item1)), source.Key)).Max()));
    }
    

    Test:

    var obsResults = ViterbiRx<string,string,double>(mul: (x1, x2) => x1 * x2, ...);
    var res = obsResults.ToListObservable();
    Debug.Assert(Math.Round(res.Value[Rainy].Item1, 6) == 0.013440);
    Debug.Assert(Math.Round(res.Value[Sunny].Item1, 6) == 0.002592);
    Debug.Assert(res.Value.OrderBy(x => x.Value).Last().Key == Rainy);
    Debug.Assert(res[2][Rainy].Item2 == Rainy);
    Debug.Assert(res[1][Rainy].Item2 == Sunny);
    

  • Brian Beckman: Hidden Markov Models, Viterbi Algorithm, LINQ, Rx and Higgs Boson

    Even with C# and LINQ a compact functional implementation is possible:

    //using alias directive for P: using P = Double;
    static IObservable<IDictionary<S, Tuple<P, S>>> ViterbiRx<O, S>
    (IObservable<Tuple<O, IEnumerable<S>>> obsStates, Func<S, P> startingProb, Func<S, S, P> transitionProb, Func<S, O, P> emissionProb)
    {
        return obsStates.Scan((IDictionary<S, Tuple<P, S>>)null, (v, o) => o.Item2.ToDictionary(target => target, target =>
            v == null ? Tuple.Create(startingProb(target) * emissionProb(target, o.Item1), target)
            : v.Select(source => Tuple.Create(source.Value.Item1 * transitionProb(source.Key, target) * emissionProb(target, o.Item1), source.Key)).Max()));
    }