基础介绍,后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. 3-14 Python处理XML文件

    xml文件处理 什么是xml文件? xml即可扩展标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言. 从结构上,很像HTML超文本标记语言.但他们被设计的目的 ...

  2. 【读书笔记】15《The Bridge of Madison County》

    廊桥遗梦(梅丽尔·斯特里普主演) 罗伯特·詹姆斯·沃勒 99个笔记 The Beginning   美[|diˈklainz]v 辞谢,谢绝(邀请等)( decline的第三人称单数 );(道路.物体 ...

  3. 试用 ModVB(一):安装教程+使用 JSON 常量和 JSON 模式匹配

    前排提醒:阅读此文章并充分尝试 ModVB 的新语法需要较长的时间.对于程序员而言,如果你工作时不用 VB,则最好避免在上班时间看,以免被领导认为你在长时间摸鱼. 什么是 ModVB ModVB 是一 ...

  4. E - Road Reduction

    E - Road Reduction (atcoder.jp) 题意:一棵树n个点,m条路, di表示1-i的距离,问怎么选择边可以使得d2+...dn最短. 题解: 很明显,就是直接套最短路板子,判 ...

  5. Java基础——02

    今日学习 Java API Scanner package cn.lsl.day03.demo01; //导包 import java.util.Scanner; public class demo0 ...

  6. django_day10_项目相关

    django_day10_项目相关 展示数据的方法 数据对象obj 普通字段 obj.字段名 ====> 数据库该字段的值 带choices参数的 obj.字段名 ====> 数据库该字段 ...

  7. K8S_三种Port区别总结

    nodePort: 外部流量访问K8S集群中Service入口的一种方式 比如外部用户要访问k8s集群中的一个Web应用,那么我们可以配置对应service的type=NodePort,nodePor ...

  8. 【读书笔记】C#高级编程 第二十二章 安全性

    (一)身份验证和授权 安全性的两个基本支柱是身份验证和授权.身份验证是标识用户的过程,授权在验证了所标识用户是否可以访问特性资源之后进行的. 1.标识和Principal 使用标识可以验证运行应用程序 ...

  9. jenkins流水线部署springboot应用到k8s集群(k3s+jenkins+gitee+maven+docker)(2)

    前言:上篇已介绍了jenkins在k3s环境部署,本篇继续上篇讲述流水线构建部署流程 1.从gitlab上拉取代码步骤 在jenkins中,新建一个凭证:Manage Jenkins -> Ma ...

  10. uniapp|微信小程序获取当前城市名称--逆地址解析

    六年代码两茫茫,不思量,自难忘 6年资深前端主管一枚,只分享技术干货,项目实战经验 关注博主不迷路~ 问题 uniapp开发的小程序需要获取当前城市名称 解决步骤 看文档 当然是看uniapp文档,我 ...