zoukankan      html  css  js  c++  java
  • 隐马尔科夫模型(HMM)及事实上现

    马尔科夫模型

    马尔科夫模型是单重随机过程,是一个2元组:(S,A)。

    当中S是状态集合,A是状态转移矩阵。

    仅仅用状态转移来描写叙述随机过程。

     

    马尔科夫模型的2个如果

    有限历史性如果:t+l时刻系统状态的概率分布仅仅与t时刻的状态有关,与t时刻曾经的状态无关;

    齐次性如果:从t时刻到t+l时刻的状态转移与t的值无关。

     

    以天气模型为例

    天气变化有3中状态S:{1(阴),2(云),3(晴)}


    图片来自网络


    则状态转移矩阵A:


    这样,仅仅要知道的初始状态概率向量,就能预測接下来每天的天气了。

     

    隐马尔科夫模型

    隐马尔科夫模型是双重随机过程,是一个5元组


    V是输出集合。

    表示在状态j时输出k的概率。

    是初始状态概率。

    用状态转移和输出概率一起来描写叙述随机过程。

     

    以扔硬币模型为例

    有个小孩手上拿着3个各不同样,也正反不均匀的硬币。他每次随机抽取1个硬币扔,扔了非常多次(比方10次),他并不告诉你他每次抽中的是哪个硬币。可是他会告诉你每次的正反结果:正正反正反正正正……

    在这个问题中,我们知道观察序列(硬币的正反),可是小孩手上硬币类型的变换序列被隐藏起来了,我们不知道小孩每次拿的哪个硬币扔,因此是双重随机过程。这就隐马尔科夫过程。

     

    这里如果模型參数已知:

    A=[0.90.05 0.05;0.45 0.1 0.45;0.45 0.45 0.1];
    B=[0.50.75 0.25;0.5 0.25 0.75];
    Pi=[1/31/3 1/3]';

    隐马尔科夫模型的3个问题

    1.【概率问题】给定上述模型,观察到[正正反]的概率是多少?

    O=[11 2];

    2.【预測问题】给定上述模型,假设观察到上述结果,最可能的硬币转换序列(状态转换序列)是什么?

    3.【学习问题】不告诉你模型參数,怎样依据观察序列得到它们?

     

    【概率问题】

    1.向前算法

    向前变量:给定模型,在时刻t,状态为i,且之前的观察序列例如以下的概率。

    显然有

    Alpha=zeros(3,N);
    Beta=zeros(3,N);
    Lambda=zeros(3,N);
     
    Alpha(:,1)=B(O(1),:)'.*Pi;
    Delta=Alpha;
    fori=2:N
        Alpha(:,i)=A'*Alpha(:,i-1).*B(O(i),:)';
    end
    Q1_1=sum(Alpha(:,N));

    输出

    Alpha=
    0.166666666666667      0.150000000000000      0.0867187500000000
    0.250000000000000      0.0531250000000000    0.00683593750000000
    0.0833333333333333    0.0322916666666667    0.0259765625000000
     
    Q1_1=0.119531250000000

    2.向后算法

    向后变量:给定模型,在时刻t,状态为i,且之后的观察序列例如以下的概率。

    显然有


    Beta(:,N)=ones(N,1);
    fori=N:-1:2
       Beta(:,i-1)=bsxfun(@times,A,B(O(i),:))*Beta(:,i);
    end
    Q1_2=sum(Pi.*B(1,:)'.*Beta(:,1));

    输出

    Beta=
    0.252187500000000      0.500000000000000      1
    0.202968750000000      0.587500000000000      1
    0.321093750000000      0.412500000000000      1
     
    Q1_2=0.119531250000000

     

    【预測问题】

    Viterbi算法

    Viterbi变量:给定模型,在时刻t,状态为i,观察到的最佳转换序列为的概率。


    显然有


    这里须要把最佳路径记录下来


    Q2=zeros(1,N);
    fori=2:N
        Delta(:,i)=max(bsxfun(@times,A,Delta(:,i-1)))'.*B(O(i),:)';
       [~,Lambda(:,i)]=max(bsxfun(@times,A,Delta(:,i-1)));
    end
    [~,Q2(N)]=max(Delta(:,N));
    fori=N:-1:2
        Q2(i-1)=Lambda(Q2(i),i);
    end


    输出

    Delta=
    0.166666666666667      0.0750000000000000    0.0337500000000000
    0.250000000000000      0.0281250000000000    0.00316406250000000
    0.0833333333333333    0.0281250000000000    0.00949218750000000

     

    最优序列

    1     1     1


    【学习问题】

    1.有监督模式

    在有大量标签数据下,直接用频率近似概率參数就可以。

    2.无监督模式

    Baum-Welch算法

    定义变量:在给定模型和观察序列O,在t时刻状态为i,在t+1时刻状态为j的概率



    则关于模型參数的一种预计方法为



    欢迎參与讨论并关注本博客微博以及知乎个人主页兴许内容继续更新哦~

    转载请您尊重作者的劳动,完整保留上述文字以及文章链接,谢谢您的支持!

  • 相关阅读:
    vue简单分屏(1,4,9,16),全屏,还需要调整
    vue 中的Vuex实践
    常用工具类
    java Log日志规范
    spring中对象的注入方式
    不恰当的update语句使用主键和索引导致mysql死锁
    JPA规范及其它持久层框架
    webservice基本功能介绍
    Activiti工作流(二)之常用操作
    Activiti工作流(一)之基本操作介绍
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4388173.html
Copyright © 2011-2022 走看看