HMM简介
HMM用于研究非确定性生成模式,HMM是一个与时间无关的模型(有待改进),并且n阶HMM模型是指下一个状态只与前n个有关,通常只研究一阶HMM模型(有待改进)。从可观察的参数中确定该过程的隐含参数,然后利用这些参数来作进一步的分析,例如模式识别。
下面可以使用一个案例来解释HMM模型。
假设有三种色子,分别是标有123456的立方体、标有1234的三菱锥、标有12345678的八面体。它们分别记为D6、D4、D8,假设我们从三个色子中任意挑一个色子的概率为1/3,然后我们可以随意掷色子,假设某一次掷色子结果为136527481。这个结果称为可见状态链,其中所掷色子的序列为隐含状态链,HMM一般指的是隐含状态链。隐含状态链之间存在着转移概率,在这个例子中,隐含状态链有可能是D4D6D6D8D4D8D6D8D4,也有可能是其他隐含状态链,可以枚举很多种。可见状态之间没有转移概率,但是隐含层与可见层之间有转移概率,例如D4中掷1/2/3/4的概率均为1/4。当然也可以对两个转移概率进行自定义。
应用HMM模型的时候,往往是缺失了一部分信息的,知道骰子有几种,每种骰子是什么,但是不知道掷出来的骰子序列;有时候只是看到了很多次掷骰子的结果,剩下的什么都不知道。和HMM模型相关的算法主要分为三类,分别解决三种问题:
知道骰子有几种(隐含状态数量),每种骰子是什么(转换概率),根据掷骰子掷出的结果(可见状态链),我想知道每次掷出来的都是哪种骰子(隐含状态链)。
知道骰子有几种(隐含状态数量),每种骰子是什么(转换概率),根据掷骰子掷出的结果(可见状态链),我想知道掷出这个结果的概率。
知道骰子有几种(隐含状态数量),不知道每种骰子是什么(转换概率),观测到很多次掷骰子的结果(可见状态链),我想反推出每种骰子是什么(转换概率)。
MATLAB示例程序
%% 隐马尔科夫模型 %% 2015-9-16,zzw %% 问题背景介绍 % 考虑两个色子和两个硬币,红色子和绿色子,红硬币和绿硬币。 % 其中红色子1~6出现的概率相同 % 绿色子有12个面,其中1出现在7个面上,其余五个面分别标2~6 % 红硬币出现正面向上的概率为0.9,反面的概率为0.1 % 绿硬币出现正面向上的概率为0.95,反面的概率为0.05 %% 游戏规则 % 掷红色色子,记下数字 % 抛红色硬币,若正面向上,则继续掷红色子;反之,则抛绿色子 % 继续上面的过程 %% 产生数据 % 状态转移概率矩阵,第一行代表红色硬币,第二行代表绿色硬币 T=[0.9 0.1;0.05 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]; % 随机产生一组色子序列和状态序列 [seq,states]=hmmgenerate(1000,T,E); %% 采用viterbi算法来推算状态序列 likelystates=hmmviterbi(seq,T,E); % 算出正确率 rate=sum(states==likelystates)/1000; %% 通过序列和状态来推测转移概率和色子概率 [T_EST,E_EST]=hmmestimate(seq,states); %% 如果不知道状态states,仅通过seq和一个初始的T_EST,E_EST来估计T和E也可以的 T_GUESS=[0.85 0.15;0.1 0.9]; E_GUESS=[0.17 0.16 0.17 0.16 0.17 0.17;0.6 0.08 0.08 0.08 0.08 0.08]; [T_EST2,E_EST2]=hmmtrain(seq,T_GUESS,E_GUESS); %% 估计先验条件分布,即产生这个结果的概率 PSTATES=hmmdecode(seq,T,E);