基础介绍,后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. 「题解报告」CF1067A Array Without Local Maximums

    大佬们的题解都太深奥了,直接把转移方程放出来让其他大佬们感性理解,蒟蒻们很难理解,所以我就写了一篇让像我一样的蒟蒻能看懂的题解 原题传送门 动态规划三部曲:确定状态,转移方程,初始状态和答案. --神 ...

  2. 自定义View3-水波纹扩散(仿支付宝咻一咻)实现代码、思想

    PS:自定义view篇-水波纹实现 效果:水波纹扩散 场景:雷达.按钮点击效果.搜索等 实现:先上效果图,之前记得支付宝有一个咻一咻,当时就是水波纹效果,实现起来一共两步,第一画内圆,第二画多个外圆, ...

  3. 被一位读者赶超,手摸手 Docker 部署 ELK Stack

    被一位读者赶超,容器化部署 ELK Stack 你好,我是悟空. 被奇幻"催更" 最近有个读者,他叫"老王",外号"茴香豆泡酒",找我崔更 ...

  4. helm安装csi-driver-nfs-v4.1.0

    Application version v4.1.0 Chart version v4.1.0 获取chart包 helm repo add csi-driver-nfs https://raw.gi ...

  5. FastJson远程命令执行漏洞学习笔记

    FastJson远程命令执行漏洞学习笔记 Fastjson简介 fastjson用于将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean.fastjson.ja ...

  6. 超详细 VS Code 配置C/C++教程

    写在前面 如果您使用的电脑内存 \(\leq 4 \texttt{GB}\),建议您使用Dev-C++,否则会到时内存占用爆满,体验感不佳. 网上的很多教程都不够详细,这里我把每一步.每一个操作都详细 ...

  7. KingbaseES 的行列转换

    目录 背景 行转列 数据准备 分组聚合函数+CASE 根据压缩数据的格式,横向展开数据列选取不同方式 crosstab函数 PIVOT 操作符 PIVOT 操作符的限制 工具 ksql 的元命令 \c ...

  8. selenium爬取图片

    一.https/http开头的图片 1.我们以百度为例,下载百度图片到本地. 2.定位到该元素的img标签 from selenium import webdriver from selenium.w ...

  9. 关于“No loop matching the specified signature and casting was found for ufunc lstsq_n”问题的解决

    下面这段代码是使用MatPlotLib绘制数据随时间变化的趋势. import datetime as dt import numpy as np import pandas as pd import ...

  10. Django 运行报异常:AttributeError: 'str' object has no attribute 'get'

    Technorati Tags: Python,Django,Web 在使用django.contrib.auth用户机制进行用户的验证.登录.注销操作时,遇到这个异常. 首先是写了一个登录的视图,要 ...