隐马尔可夫模型(三)——隐马尔可夫模型的评估问题(前向算法)

简介:

隐马模型的评估问题即,在已知一个观察序列O=O1O2...OT,和模型μ=(A,B,π}的条件下,观察序列O的概率,即P(O|μ}

                   

      如果穷尽所有的状态组合,即S1S1...S1, S1S1...S2, S1S1...S3, ..., S3S3...S3。这样的话t1时刻有N个状态,t2时刻有N个状态...tT时刻有N个状态,这样的话一共有N*N*...*N= NT种组合,时间复杂度为O(NT),计算时,就会出现“指数爆炸”,当T很大时,简直无法计算这个值。为解决这一问题,Baum提出了前向算法。

      归纳过程

      首先引入前向变量αt(i):在时间t时刻,HMM输出序列为O1O2...OT,在第t时刻位于状态si的概率。

      当T=1时,输出序列为O1,此时计算概率为P(O1|μ):假设有三个状态(如下图)1、2、3,输出序列为O1,有三种可能一是状态1发出,二是从状态2发出,三是从状态3发出。另外从状态1发出观察值O1得概率为b1(O1),从状态2发出观察值O1得概率为b2(O1),从状态3发出观察值O1得概率为b3(O1)。因此可以算出

     P(O1|μ)= π1*b1(O1)+π2*b2(O1) +  π3*b3(O1)= α1(1) + α1(2) + α1(3)

                                     

      当T=2时,输出序列为O1O2,此时计算概率为P(O1O2|μ):假设有三个状态(如下图)1、2、3,输出序列为O1,有三种可能一是状态1发出,二是从状态2发出,三是从状态3发出。另外从状态1发出观察值O2得概率为b1(O2),从状态2发出观察值O2得概率为b2(O2),从状态3发出观察值O2得概率为b3(O2)。

      要是从状态1发出观察值O2,可能从第一时刻的1、2或3状态装换过来,要是从状态1转换过来,概率为α1(1)*a11*b1(O2),要是从状态2转换过来,概率为α1(2)*a21*b1(O2),要是从状态3转换过来,概率为α1(3)*a31*b1(O2),因此

     P(O1O2,q2=s1|μ)= α1(1)*a11*b1(O2)  + α1(2)*a21*b1(O2) + α1(3)*a31*b1(O2)=α2(1)

                                     

      同理:P(O1O2,q2=s1|μ)= α1(1)*a12*b2(O2)  + α1(2)*a22*b2(O2) + α1(3)*a32*b2(O2)=α2(2)

               P(O1O2,q2=s1|μ)= α1(1)*a13*b1(O2)  + α1(2)*a23*b3(O2) + α1(3)*a33*b3(O2)=α2(3)

     所以:P(O1O2|μ)=P(O1O2,q2=s1|μ)+ P(O1O2,q2=s1|μ)+ P(O1O2,q2=s1|μ)

                             =α2(1) + α2(2) + α2(3)

      以此类推。。。

      前向算法

       step1 初始化:α1(i) = πi*bi(O1), 1≤i≤N

       step2 归纳计算:

                           

       step3 终结:

                      P(O|μ)=

      时间复杂度

      计算某时刻的某个状态的前向变量需要看前一时刻的N个状态,此时时间复杂度为O(N),每个时刻有N个状态,此时时间复杂度为N*O(N)=O(N2),又有T个时刻,所以时间复杂度为T*O(N2)=O(N2T)。

      程序例证

       

        前向算法计算P(O|M):

        step1:α1(1) =π1*b1(red)=0.2*0.5=0.1          α1(2)=π2*b2(red)==0.4*0.4= 0.16          α1(3)=π3*b3(red)==0.4*0.7=0.21

        step2:α2(1)=α1(1)*a11*b1(white) + α1(2)*a21*b1(white) + α1(3)*a31*b1(white)

                     ...

        step3:P(O|M) = α3(1)+α3(2)+α3(3)

        程序代码

复制代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
        float a[3][3] = {{0.5,0.2,0.3},{0.3,0.5,0.2},{0.2,0.3,0.5}};
        float b[3][2] = {{0.5,0.5},{0.4,0.6},{0.7,0.3}};
        float alpha[4][3];
        int i,j,k, count = 1;
        //output list
        int list[4] = {0,1,0,1};
        //step1:Initialization
        alpha[0][0] = 0.2 * 0.5;
        alpha[0][1] = 0.4 * 0.4;
        alpha[0][2] = 0.4 * 0.7;
        //step2:iteration
        for (i=1; i<=3; i++)
        {
            for(j=0; j<=2; j++)
            {
                alpha[i][j] = 0;
                for(k=0; k<=2; k++)
                {
                   alpha[i][j] += alpha[i-1][k] * a[k][j] * b[j][list[count]];
                }
            }
            count += 1;
        }
       for (i=0; i<=3; i++)
        {
            for(j=0; j<=2; j++)
            {
                printf("a[%d][%d]=%f\n",i+1,j+1,alpha[i][j]);
            }
        }
       //step3:end
       printf("Forward:%f\n", alpha[3][0]+alpha[3][1]+alpha[3][2]);
       return 0;
}
复制代码

     运行结果

                 

 





本文转自jihite博客园博客,原文链接:http://www.cnblogs.com/kaituorensheng/archive/2012/12/01/2797230.html,如需转载请自行联系原作者


相关文章
|
7月前
|
机器学习/深度学习 数据采集 人工智能
机器学习基础知识——基本原理、常用算法与评估指标
机器学习基础知识——基本原理、常用算法与评估指标
150 0
|
1天前
|
机器学习/深度学习 算法 数据挖掘
【数据挖掘】关联模式评估方法及Apriori算法超市购物应用实战(超详细 附源码)
【数据挖掘】关联模式评估方法及Apriori算法超市购物应用实战(超详细 附源码)
60 0
|
8月前
|
机器学习/深度学习 算法
评估系统或算法质量的重要指标
准确性(Accuracy):衡量系统或算法输出结果与真实结果之间的接近程度。通常使用分类准确率、回归误差等指标来评估。 精确率(Precision)和召回率(Recall):主要用于评估分类模型的性能。精确率衡量预测为正例的样本中实际为正例的比例,召回率衡量实际为正例的样本中被正确预测为正例的比例。
167 4
|
10月前
|
机器学习/深度学习 算法
【数字预失真(DPD)】静态DPD设计扩展为自适应设计及评估两种自适应DPD设计:基于(最小均方)LMS算法、使用递归预测误差方法(RPEM)算法研究(Matlab&Simulink实现)
【数字预失真(DPD)】静态DPD设计扩展为自适应设计及评估两种自适应DPD设计:基于(最小均方)LMS算法、使用递归预测误差方法(RPEM)算法研究(Matlab&Simulink实现)
100 0
|
10月前
|
机器学习/深度学习 算法
【MATLAB第42期】基于MATLAB的贝叶斯优化决策树分类算法与网格搜索、随机搜索对比,含对机器学习模型的评估度量介绍
【MATLAB第42期】基于MATLAB的贝叶斯优化决策树分类算法与网格搜索、随机搜索对比,含对机器学习模型的评估度量介绍
|
人工智能 算法 数据挖掘
算法的评估指标
分类:精度(accuracy)、召回率、精确率、F值、ROC-AUC 、混淆矩阵、PRC 回归:RMSE(平方根误差)、MSE(平均平方误差)、MAE(平均绝对误差)、SSE(和方差, 误差平方和)、R-square(确定系数) 聚类:兰德指数、互信息、轮廓系数
165 0
算法的评估指标
|
机器学习/深度学习 算法
十二、评估机器学习算法
十二、评估机器学习算法
十二、评估机器学习算法
|
机器学习/深度学习 算法 数据挖掘
十分钟掌握聚类算法的评估指标
前言 聚类算法属于非监督学习,它并不像分类算法那样可以使用训练集或测试集中的数据来计算准确率、召回率等。 那么如何评估聚类算法得好坏呢? 好的聚类算法,一般要求类簇具有: 簇内 (intra-cluster) 相似度高 簇间 (inter-cluster) 相似度底 一般来说,评估聚类质量有两个标准,内部评估评价指标和外部评估指标。
十分钟掌握回归算法的评估指标
什么是回归算法? 回归算法就是对历史数据进行拟合,形成拟合方程。接下来使用该方程对新数据进行预测。如果是一元数据的拟合方程,则拟合一条线,如果数据是二元数据,那么它的拟合方程就是一个拟合平面,对于更高维的数据,它的拟合方程将更加复杂。
|
算法 Python
十分钟掌握分类算法的评估指标(下)
什么是评估指标? 评估指标是针对模型性能优劣的一个定量指标。一种评价指标只能反映模型一部分性能,如果选择的评价指标不合理,那么可能会得出错误的结论,故而应该针对具体的数据、模型选取不同的的评价指标。 针对不同类型的学习任务,我们有不同的评估指标,这里我们来介绍最常见的分类算法的一些评估指标。常用的分类任务评价指标有准确率(Accuracy)、精确率(Precision)、召回率(Recall)、F1 Score、P-R曲线(Precision-Recall Curve)、ROC、AUC等。

热门文章

最新文章

http://www.vxiaotou.com