zoukankan      html  css  js  c++  java
  • 隐马尔可夫模型模型评估及最优路径的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

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

  • 相关阅读:
    node的function函数和路由代码的小例子
    关于node回调函数中同步和异步操作的理解
    node初学
    CTF知识点总结(二)
    知识图谱
    论文笔记 无监督与混合IDS
    CTF知识点总结(一)
    论文笔记 网络安全图谱以及溯源算法
    攻防世界 wtf.sh-150
    攻防世界 Web_php_wrong_nginx_config
  • 原文地址:https://www.cnblogs.com/bigpo/p/4141419.html
Copyright © 2011-2022 走看看