• 隐马尔可夫模型模型评估及最优路径的matlab实现


    自己根据算法编写了两个简单的matlab代码,应用于例子中的数据取得了正确的解,这里并没有考虑速度优化的问题,请大家不吝指教:

    1.模型评估

    HMM模型如下,试根据前向算法计算产生观察符号序列O={ABAB}的概率。 
    状态转移概率矩阵
    a = [0.4 0.6 0 ;
            0   0.8 0.2;
            0   0    1 ];
    观测矩阵:
    o= [0.7 0.3 0.7 0.3;
          0.4 0.6 0.4 0.6;
          0.8 0.2 0.8 0.2];
    初始概率矩阵:
    pi = [1 0 0];
    例题中的计算步骤:
    1.当t = 1时
    2.当t = 2时
    3.当t = 3时
    4.当t = 4时
    最终有:
    P(O| λ)= a4(1)+ a4(2)+ a4(3)=0.0717696
    matlab代码实现:
    %a矩阵是状态转移矩阵
    a = [0.4 0.6 0  ;
         0   0.8 0.2;
         0   0   1  ];
    %o矩阵是观察矩阵,观测序列是ABAB
    %该o矩阵根据观测序列做了相应的扩展。
    o = [0.7 0.3 0.7 0.3;
         0.4 0.6 0.4 0.6;
         0.8 0.2 0.8 0.2];
    %pi是初始状态概率矩阵
    pi = [1 0 0];
    
    [n,n] = size(a);
    [n,T] = size(o);
    n = length(pi);
    
    alpha = zeros(n,T);
    %初始化t=1时刻的alpha矩阵
    for i = 1:n
        alpha(i,1) = pi(i)*o(i,1);
    end
    
    for t = 1:T-1
        for i = 1:n
            sum = 0;
            for j = 1:n
                sum = sum + alpha(j,t)*a(j,i);
            end
            alpha(i,t+1) = sum * o(i,t+1);
        end
    end
    
    P = 0;
    for i = 1:n
        P = P + alpha(i,T);
    end
    P

    计算得到的P值为0.0718,与例题中得到的结果十分接近。

    2.最优路径选择问题

    例子中的计算步骤:

    1.初始化:

    2.当t = 2时

    3.当t = 3时

    4.当t = 4时

    递推结果:

    最优状态序列:

    S1,S2,S2,S2.

    matlab代码实现:

    %a矩阵是状态转移矩阵
    a = [0.4 0.6 0  ;
         0   0.8 0.2;
         0   0   1  ];
    %o矩阵是观察矩阵,观测序列是ABAB
    %该o矩阵根据观测序列做了相应的扩展。
    o = [0.7 0.3 0.7 0.3;
         0.4 0.6 0.4 0.6;
         0.8 0.2 0.8 0.2];
    %pi是初始状态概率矩阵
    pi = [1 0 0];
    
    [n,n] = size(a);
    [n,T] = size(o);
    n = length(pi);
    
    derta = zeros(n,T);
    pha = zeros(n,T);
    maxer = zeros(n,n);
    %初始化t=1时刻的alpha矩阵
    for i = 1:n
        derta(i,1) = pi(i)*o(i,1);
    end
    
    for t = 1:T-1
        for i = 1:n
            nu = 0;
            for j = 1:n
                maxer(j,i) = derta(j,t)*a(j,i);
            end
            if max(maxer(:,i))==0
                pha(i,t+1) = 0;
            else
                [nu,pha(i,t+1)] = max(maxer(:,i));
            end
            derta(i,t+1) = nu * o(i,t+1);
        end
    end
    derta
    pha
    P = 0;
    q = zeros(1,T);
    [P q(T)]= max(derta(:,T));
    for i = T-1:-1:1
        q(i) = pha(q(i+1),i+1);
    end
    q

    运行的结果是:

    q =

    1 2 2 2

    可以看出是与例题中计算出的结果是一样的。

  • 相关阅读:
    uip源码剖析【三】——【网络层】ICMP解读
    uip源码剖析【五】——【传输层】TCP解读
    WebGame方案汇总
    终于,我生命中第一次编译并运行了手机程序
    使用R7版NDK搭建Android开发环境[不使用Cgywin]
    拷问Unity:开发U3D游戏要思考的问题
    浏览器缓存导致FLASH资源更新问题的解决方案
    山寨版的《KingdomRush(皇城突袭)》
    在Unity3D的网络游戏中实现资源动态加载
    Unity3d之无缝地形场景切换–解决方法和代码
  • 原文地址:https://www.cnblogs.com/bigpo/p/4141419.html
Copyright © 2020-2023  润新知