基础介绍,后5项为基础5元素

Q = ['q0', 'q1', 'q2', 'q3']              # 状态集合 States,共 N 种状态
V = ['v0', 'v1'] # 观测集合 Observations,共 M 种观测值
I = [ 'i{}'.format(i) for i in range(5) ] # 某个长度为 T 的状态序列,i_t 属于Q
O = [ 'o{}'.format(i) for i in range(5) ] # 状态序列对应的观测值序列,o_t 属于 V
A = [ a_ij ] # 转移概率 Transition Problity, a_ij = P( i_t+1 = q_j | i_t = q_i ) N*N
B = [ bj(o_t) ] # 发射概率 Emission Problity,b_ij = P( o_t = v_k | i_t = q_j ) N*M
Pi = [ P_i ] # 初识状态概率 P_i = P( i_1 = q_i )

基础5元素对应初始化

# Q = ['盒1', '盒2', '盒3']
Q = ['盒1', '盒2'] V = [ '红' , '黑' ]
# A = [ [ 0.2 , 0.3 , 0.5 ] ,
# [ 0 , 0.5 , 0.5 ] ,
# [ 0.4 , 0.2 , 0.2 ]]
A = [ [ 0.5 , 0.5 ] ,
[ 0.5 , 0.5 ]]
B = [ [ 0.3 , 0.7 ] ,
[ 0.5 , 0.5 ] ]
Pi = [ 0.5 , 0.5 ] def label_2_id(target):
dt = { v:k for k,v in enumerate(V)}
return [ dt[item] for item in target ]
# target = label_2_id( ['红','红','黑','红'] )
target = label_2_id( ['红','红'] )

BruteForce暴力算法,计算复杂度:

# 路径展示角度
def brute_force_algorithm( target = [] ,path = '' ,prob ='' , pre = -1):
ret = []
path_tmp = ''
prob_tmp = ''
for k,v in enumerate(Q):
path_tmp = '{}/{}'.format(path , v)
if prob == '':
prob_tmp = '{}/{},{}'.format(prob , Pi[k] , B[k][target[0]] )
else:
prob_tmp = '{}/{},{}'.format( prob , A[pre][k] , B[k][target[0]] )
if len(target) > 1:
tmp = brute_force_algorithm(target[1:] , path_tmp ,prob_tmp , pre = k )
ret.extend( tmp )
elif len(target) == 1:
ret.append([path_tmp , prob_tmp])
return ret
# 总概率展示角度
def brute_force_algorithm( target = [] ,path = '' ,prob = 0 , pre = -1):
ret = 0
for k,v in enumerate(Q):
prob_tmp = prob
path_tmp = '{}/{}'.format(path , v)
if pre == -1 :
prob_tmp += Pi[k] * B[k][target[0]] # joint 联合概率局部
else:
prob_tmp *= A[pre][k] * B[k][target[0]]
if len(target) > 1:
ret += brute_force_algorithm(target[1:] , path_tmp ,prob_tmp , pre = k )
elif len(target) == 1:
ret += prob_tmp
return ret

Forward 前向算法,时间复杂度:

def forward_algorithm( target = [] ):
prob = [ [ 0 for i in Q] for j in target ]
for t ,o in enumerate(target):
if t == 0 :
for i in range( len(Q) ):
prob[0][i] = Pi[i] * B[i][o]
else:
for id , q in enumerate(Q):
for k,v in enumerate(prob[t-1]):
print( v , A[k][id] , prob , prob[t][id] )
prob[t][id] += (v * A[k][id] * B[id][o] )
print(prob)
return prob

Backend后向算法,计算复杂度:

def backend_algorithm( target = [] ):
prob = [ [ 0.0 for i in Q] for j in target ]
length = len(target)
for t in range( length-1 , -1 , -1):
if t == length-1 :
for i in range( len(Q) ): # 后向计算有点问题
prob[t][i] = 1
else:
o = target[t+1]
for id , q in enumerate(Q):
if t == 0:
for k,v in enumerate(prob[t+1]):
prob[t][id] *= 1000
prob[t][id] += ( v * A[id][k] * B[k][o] ) * 1000
prob[t][id] /= 1000
else:
for k,v in enumerate(prob[t+1]):
prob[t][id] += v * A[id][k] * B[k][o]
for k,v in enumerate(prob[0]):
prob[0][k] = v * Pi[k] * B[k][target[0]]
return prob

HMM算法python实现的更多相关文章

  1. pageRank算法 python实现

    一.什么是pagerank PageRank的Page可是认为是网页,表示网页排名,也可以认为是Larry Page(google 产品经理),因为他是这个算法的发明者之一,还是google CEO( ...

  2. 常见排序算法-Python实现

    常见排序算法-Python实现 python 排序 算法 1.二分法     python    32行 right = length-  :  ]   ):  test_list = [,,,,,, ...

  3. kmp算法python实现

    kmp算法python实现 kmp算法 kmp算法用于字符串的模式匹配,也就是找到模式字符串在目标字符串的第一次出现的位置比如abababc那么bab在其位置1处,bc在其位置5处我们首先想到的最简单 ...

  4. KMP算法-Python版

                               KMP算法-Python版 传统法: 从左到右一个个匹配,如果这个过程中有某个字符不匹配,就跳回去,将模式串向右移动一位.这有什么难的? 我们可以 ...

  5. 压缩感知重构算法之IRLS算法python实现

    压缩感知重构算法之OMP算法python实现 压缩感知重构算法之CoSaMP算法python实现 压缩感知重构算法之SP算法python实现 压缩感知重构算法之IHT算法python实现 压缩感知重构 ...

  6. 压缩感知重构算法之OLS算法python实现

    压缩感知重构算法之OMP算法python实现 压缩感知重构算法之CoSaMP算法python实现 压缩感知重构算法之SP算法python实现 压缩感知重构算法之IHT算法python实现 压缩感知重构 ...

  7. 压缩感知重构算法之CoSaMP算法python实现

    压缩感知重构算法之OMP算法python实现 压缩感知重构算法之CoSaMP算法python实现 压缩感知重构算法之SP算法python实现 压缩感知重构算法之IHT算法python实现 压缩感知重构 ...

  8. 压缩感知重构算法之IHT算法python实现

    压缩感知重构算法之OMP算法python实现 压缩感知重构算法之CoSaMP算法python实现 压缩感知重构算法之SP算法python实现 压缩感知重构算法之IHT算法python实现 压缩感知重构 ...

  9. 压缩感知重构算法之SP算法python实现

    压缩感知重构算法之OMP算法python实现 压缩感知重构算法之CoSaMP算法python实现 压缩感知重构算法之SP算法python实现 压缩感知重构算法之IHT算法python实现 压缩感知重构 ...

随机推荐

  1. 【JDBC】学习路径10-c3p0数据源的使用(JDBC完结)

    第一章:下载 c3p0官网:https://www.mchange.com/projects/c3p0/ 这个是SourceForge提供的下载地址:https://sourceforge.net/p ...

  2. javaweb-thymeleaf,加载jar包---视图基础

    1.加载完thymeleaf的jar包 将thymeleaf的jar包复制到项目下lib文件夹中 右击lib文件夹,点击Add as librarb... 打开Project Structure,找到 ...

  3. XXL-JOB最佳实践与升级指南

    前言: xxl-job是国内一款使用者比较多的分布式任务调度平台,我们内部从19年开始使用该款开源软件,使用的是2.0.1版本,并在此基础上做了二次开发,添加了一些定制化的功能.随着使用该定时器的业务 ...

  4. Html飞机大战(七):发射第一颗子弹

    好家伙,终于到子弹了 我们先来理一理思路: 子弹由飞机射出,所以我们把发射子弹的方法写在英雄类中 当然了,子弹也必须有自己独立的类 后期会有很多子弹射出,所以一个个将子弹类实例化肯定是不对的 我们也需 ...

  5. Homework5

    问:什么是分而治之? 答:分而治之就是通过一系列的方法,将复杂的问题逐渐划分成若干份相对简单的问题的方法,对每个相对简单问题进行一一解决,若干个简单问题的解的集合就是一个复杂问题的解.分而治之的应用体 ...

  6. 在OpenCloudOS 上安装.NET 6

    开源操作系统社区 OpenCloudOS 由腾讯与合作伙伴共同倡议发起,是完全中立.全面开放.安全稳定.高性能的操作系统及生态.OpenCloudOS 沉淀了多家厂商在软件和开源生态的优势,继承了腾讯 ...

  7. KingbaseES timestamp 和 timestamptz 差异比较

    KingbaseES 提供两种存储时间戳的数据类型: 不带时区的 TIMESTAMP 和带时区的 TIMESTAMPTZ. TIMESTAMP 数据类型可以同时存储日期和时间,但它不存储时区.这意味着 ...

  8. 命令行配置Windows高级防火墙

    今天正好看到个帖子,询问如何通过命令行配置防火墙策略中远程IP的地址,特别是添加新的地址. 就是图中Scope里Remote IP address的地址. 第一反应就是用netsh firewall来 ...

  9. Linux查看文件内容和压缩文件命令

    查看文件内容 一些重要的目录: /usr/share/    帮助文档.说明文档/var/log/       日志/var/run/       运行中程序/var/tmp       临时文件 根 ...

  10. Springboot之 Mybatis 多数据源实现

    简介 上篇讲解了 JPA 多数据源实现:这篇讲解一下 Mybatis 多数据源实现 .主要采用将不同数据库的 Mapper 接口分别存放到不同的 package,Spring 去扫描不同的包,注入不同 ...