首页 > 编程语言 >HMM算法python实现

HMM算法python实现

时间:2022-11-13 01:11:07浏览次数:54  
标签:tmp target python 0.5 id HMM 算法 enumerate prob

基础介绍,后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

标签:tmp,target,python,0.5,id,HMM,算法,enumerate,prob
From: https://www.cnblogs.com/lhx9527/p/16885127.html

相关文章

  • python监听串口双方收发消息内容
    使用说明使用VSPD建立一组虚拟串口查看MCU的端口号与波特率并修改python程序配置,运行即可看到双方收发的效果通过串口助手连接到虚拟串口并向其发送消息即Python显示......
  • 实验三:朴素贝叶斯算法实验
    实验三:朴素贝叶斯算法实验|博客班级|https://edu.cnblogs.com/campus/czu/classof2020BigDataClass3-MachineLearning||----|----|----||作业要求|https://edu.cnblogs.......
  • python的垃圾回收机制
    python对内存回收引用几个概念计数器:当python程序运行时,会根据数据类型的不同找到相对应的结构体,根据结构体中的字段来进行创建相关的数据。然后将对象添加到refchain双向......
  • python学习笔记(一)
    一、前言要开始准备明年的数学建模比赛了,第一次弄这个比赛先从python学习开始吧,正好学了c语言,感觉大部分都差不多。 二、基础语法有三个非常基础的语法,据我所知c中并......
  • python的深浅拷贝
    在python中,对象的赋值就是简单的引用,a=[1,2,3],b=a,在上述情况下,a和b是一样的,他们指向同一片内存,b不过是a的别名,是引用,我们可以使用bisa去判断,返回Trueb......
  • Python_解决脚本执行过程中,文件被多次读取的问题
    今天在封装pandas过程中,发现封装脚本的执行耗时明显高于未封装的脚本复盘问题importtimeclassDemo:defmock_read_excel(self):print("读取文件")......
  • C++ 面经:项目常见问题 ----- nagle算法,keepalive,Linger 选项
    nagle算法应用场景:1.对于实时性要求很高的交互上,我们不能使用nagle算法,比如FPS射击类PVP对抗类游戏,或者MMO类的对实时要求很高的游戏开发来说是显而易见需要禁掉的,因为假......
  • Python程序流程控制
    Python程序流程控制1.*程序流程概述在现实生活中,我们看到的流程是多种多样的,如汽车在道路上行驶,要顺序地沿道路前进,碰到交叉路口时,驾驶员就需要判断是转弯还是直行,在环......
  • 实验三:朴素贝叶斯算法实验
    姓名:冯莹学号:201613305【实验目的】理解朴素贝叶斯算法原理,掌握朴素贝叶斯算法框架。【实验内容】针对下表中的数据,编写python程序实现朴素贝叶斯算法(不使用sklearn包......
  • 排序函数的算法(day12)
    今天尝试了三种数字的排序法。目的为1)熟悉数组的操作2)熟悉循环笔者是做嵌入式的,不想再算法上做过多探究,自身水平和专业也不允许深入太多。现在直接给出三种排序函数。1.插值......