主要内容

隐马尔可夫模型(HMM)

隐马尔科夫模型(HMM)简介

一个隐马尔可夫模型(HMM)是一种您观察到一系列排放,但不知道模型产生排放所经历的状态序列的情况。隐马尔可夫模型的分析试图从观测数据中恢复状态序列。

例如,考虑一个具有两种状态和六种可能排放的马尔可夫模型。该模型使用:

  • 一个红色的骰子,有六面,标记为1到6。

  • 一个绿色的骰子,有12面,其中5面标记为2到6,而其余7面标记为1。

  • 一枚加权的红色硬币,正面出现的概率是。9反面出现的概率是。1。

  • 一种加权的绿色硬币,正面出现的概率是。95,反面出现的概率是。05。

该模型从集合{1,2,3,4,5,6}中创建一个数字序列,规则如下:

  • 从滚动红色骰子开始,写下出现的数字,也就是发射。

  • 投掷红色硬币并做以下其中一件事:

    • 如果结果是正面,掷红色骰子并写下结果。

    • 如果结果是反面,掷绿色骰子并写下结果。

  • 在接下来的每一步中,你抛的硬币的颜色与你在前一步中掷出的骰子相同。如果硬币正面朝上,就像上一步一样掷骰子。如果硬币背面朝上,换到另一个骰子。

该模型的状态图有两种状态,红色和绿色,如下图所示。

通过滚动与状态颜色相同的骰子来确定状态的发射。你可以通过投掷与状态颜色相同的硬币来决定转换到下一个状态。

转换矩阵为:

T 0.9 0.05 0.1 0.95

排放矩阵为:

E 1 6 1 6 1 6 1 6 1 6 1 6 7 12 1 12 1 12 1 12 1 12 1 12

模型并不隐藏,因为您从硬币和骰子的颜色中知道状态的顺序。然而,假设另一个人在不给你看骰子或硬币的情况下产生了排放。你所看到的只是发射的序列。如果你开始看到比其他数字更多的1,你可能会怀疑模型处于绿色状态,但你不能确定,因为你看不到骰子的颜色。

隐马尔可夫模型提出了以下问题:

  • 给定一系列的发射,最可能的状态路径是什么?

  • 给定一个发射序列,如何估计模型的转换和发射概率?

  • 什么是转发概率模型生成一个给定的序列?

  • 什么是后验概率模型在序列中的任何一点上都处于特定的状态?

隐马尔可夫模型分析

与隐马尔可夫模型相关的统计和机器学习工具箱™函数有:

  • hmmgenerate-从马尔可夫模型生成一系列状态和排放

  • hmmestimate-从排放序列和已知状态序列中计算转移和排放概率的最大似然估计

  • hmmtrain-从一系列排放中计算转换和排放概率的最大可能性估计

  • hmmviterbi-计算隐马尔可夫模型的最可能状态路径

  • hmmdecode-计算一系列发射的后验状态概率

本节将展示如何使用这些函数来分析隐马尔可夫模型。

生成测试序列

中所描述的模型的转换和发射矩阵是由下面的命令创建的隐马尔科夫模型(HMM)简介

Trans =[。]9。1;. 05 .95];Emis =[1/6, 1/6, 1/6, 1/6, 1/6, 1/6;…7/12, 1/ 12,1 / 12,1 / 12,1 / 12,1 / 12,1 /12];

要从模型中生成状态和排放的随机序列,请使用hmmgenerate

[seq,states] = hmmgenerate(1000,TRANS,EMIS);

输出seq是发射和输出的顺序吗是状态序列。

hmmgenerate从状态1的步骤0开始,转换到状态1在第1步,并返回1作为第一个入口.若要更改初始状态,请参见改变初始状态分布

状态序列估计

已知跃迁矩阵和发射矩阵反式而且工作,函数hmmviterbi使用维特比算法来计算模型在生成给定序列时最可能经历的状态序列seq的排放:

likeelystates = hmmviterbi(seq, TRANS, EMIS);

likelystates序列的长度和seq

测试…的准确性hmmviterbi,计算实际序列的百分比这与顺序一致likelystates

Sum (states== likeelystates)/1000 ans = 0.8200

在这种情况下,最可能的状态序列在82%的时间内与随机序列一致。

估计跃迁和发射矩阵

的函数hmmestimate而且hmmtrain估计跃迁和发射矩阵反式而且工作给定一个序列seq的排放。

使用hmmestimate这个函数hmmestimate要求你知道状态的顺序这个模型说通过生成seq

下面取发射和状态序列,并返回跃迁和发射矩阵的估计值:

[TRANS_EST, EMIS_EST] = hmmestimate(seq, states) TRANS_EST = 0.8989 0.1011 0.0585 0.9415 EMIS_EST = 0.1721 0.1721 0.1749 0.1612 0.1803 0.1393 0.5836 0.0741 0.0804 0.0789 0.0726 0.1104

你可以将输出与原始的跃迁和发射矩阵进行比较,反式而且工作

Trans Trans = 0.9000 0.1000 0.0500 0.9500 emis emis = 0.1667 0.1667 0.1667 0.1667 0.1667 0.1667 0.5833 0.0833 0.0833 0.0833 0.0833 0.0833

使用hmmtrain如果你不知道状态的顺序,但你有初步的猜测反式而且工作,你仍然可以估计反式而且工作使用hmmtrain

假设您有以下初步猜测反式而且工作

Trans_guess =[。85 .15点;。1。9);Emis_guess = [.]17.16.17.16.17.17;.6 .08 .08 .08 .08 08];

你估计反式而且工作如下:

[TRANS_EST2, EMIS_EST2] = hmmtrain(seq, TRANS_GUESS, EMIS_GUESS) TRANS_EST2 = 0.2286 0.7714 0.0032 0.9968 EMIS_EST2 = 0.1436 0.2348 0.1837 0.1963 0.2350 0.0066 0.4355 0.1089 0.1144 0.1082 0.1109 0.1220

hmmtrain使用迭代算法改变矩阵TRANS_GUESS而且EMIS_GUESS这样在每一步调整后的矩阵更有可能生成观察到的序列,seq.当连续两次迭代的矩阵之间的误差在一个很小的范围内时,算法停止。

如果算法在最大迭代次数内未能达到此公差,其默认值为One hundred.时,算法停止。在这种情况下,hmmtrain的最后一个值TRANS_EST而且EMIS_EST并发出未达到容差的警告。

如果算法不能达到期望的公差,使用命令增加最大迭代次数的默认值:

hmmtrain (seq TRANS_GUESS、EMIS_GUESS maxiterations,麦克斯特)

在哪里麦克斯特是算法执行的最大步数。

使用以下命令更改容差的默认值:

hmmtrain(seq, TRANS_GUESS, EMIS_GUESS, 'tolerance', tol)

在哪里托尔是期望的公差值。增加价值托尔让算法更快停止,但结果不太准确。

有两个因素降低了输出矩阵的可靠性hmmtrain

  • 该算法收敛到一个局部最大值,不代表真正的跃迁和发射矩阵。如果你怀疑这一点,对矩阵使用不同的初始猜测TRANS_EST而且EMIS_EST

  • 序列seq可能太短,无法正确地训练矩阵。如果您怀疑这一点,请使用较长的序列seq

估计后验状态概率

发射序列的后验状态概率seq模型在生成符号时处于特定状态的条件概率是什么seq,考虑到seq就会发出。计算后验状态概率hmmdecode

pstate = hmmdecode(seq,TRANS,EMIS)

输出PSTATES是一个——- - - - - -l矩阵,状态数和l的长度seqPSTATES (i, j)是模型处于状态的条件概率吗当它生成j的符号seq,考虑到seq就会发出。

hmmdecode在第一次发射之前,从第0步处于状态1的模型开始。PSTATES(我,1)是模型在接下来的第一步处于状态I的概率。若要更改初始状态,请参见改变初始状态分布

返回序列概率的对数seq的第二个输出参数hmmdecode

[pstate,logpseq] = hmmdecode(seq,TRANS,EMIS)

随着序列长度的增加,序列的概率趋于0,足够长的序列的概率小于计算机可以表示的最小正数。hmmdecode返回概率的对数来避免这个问题。

改变初始状态分布

默认情况下,统计和机器学习工具箱隐藏马尔可夫模型函数从状态1开始。换句话说,初始状态的分布所有的概率质量集中在状态1。为了分配不同的概率分布,p= (p1p2、……p],到初始状态,执行以下操作:

  1. 创建一个+ 1 -+1增广转移矩阵, T 以下形式:

    T 0 p 0 T

    在哪里T是真正的转换矩阵。的第一列 T 包含+ 1 0。p和必须为1。

  2. 创建一个+ 1 -N增广发射矩阵, E ,其形式如下:

    E 0 E

如果跃迁矩阵和发射矩阵是反式而且工作,分别使用以下命令创建增广矩阵:

TRANS_HAT = [0 p;0(大小(反式,1),1)反式);= [0 (1,size(EMIS,2));工作);

另请参阅

||||

相关的话题