算法:HMM模型+维特比算法详解

一、HMM模型+维特比算法实例

1、问题描述

假设连续观察3天的海藻湿度为(Dry,Damp,Soggy),求这三天最可能的天气情况。

2、已知信息

①天气只有三类(Sunny,Cloudy,Rainy),海藻湿度有四类{Dry,Dryish, Damp,Soggy },而且海藻湿度和天气有一定的关系。

②隐藏的状态:Sunny, Cloudy, Rainy;

③观察状态序列:{Dry, Damp, Soggy}

④初始状态序列:


Sunny


Cloudy


Rainy


0.63


0.17


0.20

⑤状态转移矩阵:


Sunny


Cloudy


Rainy


Sunny


0.5


0.375


0.125


Cloudy


0.25


0.125


0.625


Rainy


0.25


0.375


0.375

⑥发射矩阵:


Dry


Dryish


Damp


Soggy


Sunny


0.6


0.2


0.15


0.05


Cloudy


0.25


0.25


0.25


0.25


Rainy


0.05


0.10


0.35


0.5

3、分析

  由一阶HMM可知,Day2的天气仅取决于Day1;Day3的天气又只取决于Day2的天气。

4、计算过程

(1)Day1由于是初始状态,我们分别求

P(Day1-Sunny)=0.63*0.6;

P(Day1-Cloudy)=0.17*0.25;

P(Day1-Rain)=0.20*0.05;

Choose max{ P(Day1-Sunny) , P(Day1-Cloudy),P(Day1-Rainy)}, 得到P(Day1-Sunny)最大,得出第1天Sunny的概率最大。

(2)Day2的天气又取决于Day1的天气状况,同时也受Day2观察的海藻情况影响。

P(Day2-Sunny)= max{ P(Day1-Sunny)*0.5, P(Day1-Cloudy)*0.25,  P(Day1-Rainy)*0.25} *0.15;

P(Day2-Cloudy)= max{ P(Day1-Sunny)*0.375,  P(Day1-Cloudy)*0.125, P(Day1-Rainy)*0.625} *0.25;

P(Day2-Rainy)= max{ P(Day1-Sunny)*0.125,  P(Day1-Cloudy)*0.625 , P(Day1-Rainy)*0.375} *0.35;

Choosemax{ P(Day2-Sunny) , P(Day2-Cloudy), P(Day2-Rainy)},得到P(Day2-Cloudy)最大,得出第2天Cloudy的概率最大。

故{Sunny,Cloudy}是前两天最大可能的天气序列。

(3)Day3的天气又取决于Day2的天气状况,同时也受Day3观察的海藻情况影响。

  P(Day3-Sunny)= max{ P(Day2-Sunny)*0.5, P(Day2-Cloudy)*0.25,  P(Day2-Rainy)*0.25} *0.05;

  P(Day3-Cloudy)= max{ P(Day2-Sunny)*0.375,  P(Day2-Cloudy)*0.125, P(Day2-Rainy)*0.625} *0.25;

  P(Day3-Rainy)= max{ P(Day2-Sunny)*0.125,  P(Day2-Cloudy)*0.625, P(Day2-Rainy)*0.375} *0. 05;

  Choosemax{ P(Day3-Sunny) , P(Day3-Cloudy), P(Day3-Rainy)},得到P(Day3-Rainy)最大,得出第3天Rainy的概率最大。故{Sunny,Cloudy,Rainy}是这三天最可能的天气序列。

5.Python代码

 1 #-*- coding:utf-8 -*-
 2 __author__ = ‘Administrator‘
 3
 4 init_vec={"sunny":0.63,"cloudy":0.17,"rainy":0.20}
 5 trans_mat={"sunny":{"sunny":0.5,"cloudy":0.375,"rainy":0.125},
 6            "cloudy":{"sunny":0.25,"cloudy":0.125,"rainy":0.625},
 7            "rainy":{"sunny":0.25,"cloudy":0.375,"rainy":0.375}}
 8 emit_mat={"sunny":{"dry":0.6,"dryish":0.2,"damp":0.15,"soggy":0.05},
 9           "cloudy":{"dry":0.25,"dryish":0.25,"damp":0.25,"soggy":0.25},
10           "rainy":{"dry":0.05,"dryish":0.10,"damp":0.35,"soggy":0.50}}
11 observes=["dry","damp","soggy"]
12 states=["sunny","cloudy","rainy"]
13
14 #列表中包含字典,就相当于二阶列表使用
15 tab=[{}] #只有一行
16 path=[{}]
17 for t in range(len(observes)):
18     #print(t)
19     if t==0:
20         temp=[]
21         for state in states:
22             prob=init_vec[state]*emit_mat[state].get(observes[t])
23             tab[0][state]=prob
24             temp.append((prob,state))
25         best_prob,best_state=max(temp,key=lambda x:x[0])
26         path[0][best_state]=best_prob
27     else:
28         tab.append({})
29         path.append({})
30         temp=[]
31         for state1 in states:
32             item=[]
33             for state2 in states:
34                 prob=tab[t-1][state2]*trans_mat[state2].get(state1)*emit_mat[state1].get(observes[t])
35                 item.append((prob,state2))
36             best_prob,best_state=max(item,key=lambda x:x[0])
37             tab[t][state1]=best_prob
38             temp.append((best_prob,state1))
39         best_prob,best_state=max(temp,key=lambda x:x[0])
40         path[t][best_state]=best_prob
41 print(tab)
42 print(path)

输出结果:

[{‘rainy‘: 0.010000000000000002, ‘cloudy‘: 0.0425, ‘sunny‘: 0.378}, {‘rainy‘: 0.0165375, ‘cloudy‘: 0.0354375, ‘sunny‘: 0.02835}, {‘rainy‘: 0.01107421875, ‘cloudy‘: 0.0026578125, ‘sunny‘: 0.0007087500000000001}]

[{‘sunny‘: 0.378}, {‘cloudy‘: 0.0354375}, {‘rainy‘: 0.01107421875}]

时间: 2024-10-05 23:24:19

算法:HMM模型+维特比算法详解的相关文章

搜索引擎算法研究专题五:TF-IDF详解

搜索引擎算法研究专题五:TF-IDF详解 2017年12月19日 ? 搜索技术 ? 共 1396字 ? 字号 小 中 大 ? 评论关闭 TF-IDF(term frequency–inverse document frequency)是一种用于资讯检索与资讯探勘的常用加权技术.TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度.字词的重要性随著它在文件中出现的次数成正比增加,但同时会随著它在语料库中出现的频率成反比下降.TF-IDF加权的各种形式常被搜

HMM的维特比算法简单示例

今天读了一位大牛的关于HMM的技术博客,读完之后,写了一个关于维特比算法的简单示例,用scala和java语言混合编写的.现在上传之. package com.txq.hmm import java.utilimport scala.collection._ /** * HMM维特比算法,根据显示状态链条估计隐式链条 * @param states 隐式states * @param observations 显式states * @param start_probability 初始概率向量

经典回溯算法(八皇后问题)详解

八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题.该问题是十九世纪著名的数学家高斯1850年提出: 在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上 (斜率为1),问有多少种摆法.高斯认为有76种方案. 1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果. 计算机发明后,有多种方法可以解决此问题. 算法思路:    首先我们分析一下问题的解,我们每取出一个皇后,放入一行,共有八种不同的放法

Canny边缘检测算法原理及C语言实现详解(原创码字)

Canny算子是John Canny在1986年提出的,那年老大爷才28岁,该文章发表在PAMI顶级期刊上的(1986. A computational approach to edge detection. IEEE Transactions on Pattern Analysis and Machine Intelligence, vol. 8, 1986, pp. 679-698).老大爷目前在加州伯克利做machine learning,80-90年代视觉都是图像处理,现在做视觉都是机器

flink 实现ConnectedComponents 连通分量,增量迭代算法(Delta Iteration)实现详解

1.连通分量是什么? 首先需要了解什么是连通图.无向连通图.极大连通子图等概念,这些概念都来自数据结构-图,这里简单介绍一下. 下图是连通图和非连通图,都是无向的,这里不扩展有向图: 连通分量(connected component):无向图中的极大连通子图(maximal connected subgraph)称为原图的连通分量. 极大连通子图: 1.连通图只有一个极大连通子图,就是它本身.(是唯一的) 2.非连通图有多个极大连通子图.(非连通图的极大连通子图叫做连通分量,每个分量都是一个连通

LSTM模型预测sin函数详解

注解: fun_data()函数生成训练数据和标签,同时生成测试数据和测试标签HIDDEN_SIZE = 128,使用128维的精度来定义LSTM的状态和输出精度,就是LSTM中的h,c lstm_model()函数定义了一个可重入的模型,分别由评估函数和训练函数调用,在训练前使用空模型预测并输出未训练数据并可视化通过with tf.variable_scope("lstm_model",reuse=tf.AUTO_REUSE) as scope:定义了在多次实例化模型的时候共享训练结

Django模型之Meta选项详解

Django模型类的Meta是一个内部类,它用于定义一些Django模型类的行为特性.而可用的选项大致包含以下几类 abstract 这个属性是定义当前的模型是不是一个抽象类.所谓抽象类是不会对应数据库表的.一般我们用它来归纳一些公共属性字段,然后继承它的子类可以继承这些字段. Options.abstract如果abstract = True 这个model就是一个抽象类 app_label 这个选型只在一种情况下使用,就是你的模型不在默认的应用程序包下的models.py文件中,这时候需要指

Django模型层Meta内部类详解

Django 模型类的Meta是一个内部类,它用于定义一些Django模型类的行为特性.以下对此作一总结: abstract 这个属性是定义当前的模型类是不是一个抽象类.所谓抽象类是不会对应数据库表的.一般我们用它来归纳一些公共属性字段,然后继承它的子类可以继承这些字段.比如下面的代码中Human是一个抽象类,Employee是一个继承了Human的子类,那么在运行syncdb命令时,不会生成Human表,但是会生成一个Employee表,它包含了Human中继承来的字段,以后如果再添加一个Cu

IO模型之BIO代码详解及其优化演进

一.BIO简介 BIO是java1.4之前唯一的IO逻辑,在客户端通过socket向服务端传输数据,服务端监听端口.由于传统IO读数据的时候如果数据没有传达,IO会一直等待输入传入,所以当有请求过来的时候,新起一条线程对数据进行等待.处理,导致每一个链接都对应着服务器的一个线程. BIO是同步阻塞的,如图所示: 二.原理简述 BIO对应linux io模型的阻塞IO,服务端提供IP和监听端口,客户端通过连接操作想服务端监听的地址发起连接请求,通过三次握手连接,如果连接成功建立,双方就可以通过套接