隐马尔可夫过程
隱馬爾可夫過(guò)程
基本概念
隱馬爾可夫過(guò)程有明暗兩條線,明線是可觀測(cè)的變量,暗線是隱藏狀態(tài)。例如在三個(gè)不同的裝有黑白球的盒子中取球,明線是觀測(cè)序列,就是每次取出來(lái)的球的顏色構(gòu)成的序列,暗線是狀態(tài)序列,也就是每次取的球?qū)儆诘暮凶拥男蛄小N覀冎荒苡^測(cè)到觀測(cè)序列,而不能觀測(cè)到盒子序列。
推動(dòng)隱馬爾可夫模型隨著時(shí)間不斷運(yùn)行的是它的內(nèi)核三要素:狀態(tài)轉(zhuǎn)移矩陣AAA、觀測(cè)概率矩陣BBB、以及初始隱狀態(tài)概率向量π\(zhòng)piπ。
寫(xiě)成三元組形式:λ=(A,B,π)\lambda=(A, B, \pi)λ=(A,B,π)。
求觀測(cè)序列
已知隱馬爾可夫模型三要素λ=(A,B,π)\lambda=(A, B, \pi)λ=(A,B,π),以及隱藏狀態(tài)序列I=(i1,i2,?,iT)I=(i_1, i_2, \cdots,i_T)I=(i1?,i2?,?,iT?)的基礎(chǔ)上,求有可能對(duì)應(yīng)的觀測(cè)矩陣O=(o1,o2,?,oT)O=(o_1,o_2, \cdots,o_T)O=(o1?,o2?,?,oT?)
使用前向概率算法:
1、令αt(i)=P(o1,o2,?,ot,ii=qt∣λ)\alpha_t(i)=P(o_1,o_2,\cdots,o_t,i_i=q_t|\lambda)αt?(i)=P(o1?,o2?,?,ot?,ii?=qt?∣λ);
2、初始值:α1(i)=πibio1\alpha_1(i)=\pi_ib_{io_1}α1?(i)=πi?bio1??;
3、遞推關(guān)系:αt+1(i)=[∑j=1Nαt(j)aji]biot+1\alpha_{t+1}(i)=[\sum_{j=1}^N\alpha_t(j)a_{ji}]b_{io_{t+1}}αt+1?(i)=[∑j=1N?αt?(j)aji?]biot+1??,一直推到αT(i)\alpha_{T}(i)αT?(i);
4、相加得到結(jié)果:P(O∣λ)=∑i=1NαT(i)P(O|\lambda)=\sum_{i=1}^N\alpha_T(i)P(O∣λ)=∑i=1N?αT?(i)
代碼實(shí)現(xiàn):
# -*- coding: utf-8 -*- # @Use : # @Time : 2022/8/29 22:03 # @FileName: hidden_Markov.py # @Software: PyCharmimport numpy as np from hmmlearn import hmm# 隱狀態(tài) states = ['box1', 'box2', 'box3']# 觀測(cè)集合 observations = ['black', 'white']# 初始概率 start_probability = np.array([0.3, 0.5, 0.2])# 狀態(tài)轉(zhuǎn)移矩陣 transition_probability = np.array([[0.4, 0.4, 0.2],[0.3, 0.2, 0.5],[0.2, 0.6, 0.2] ])# 觀測(cè)概率矩陣 emission_probability = np.array([[0.2, 0.8],[0.6, 0.4],[0.4, 0.6] ])# 使用MultinomialHMM建模 model = hmm.MultinomialHMM(n_components=len(states)) model.startprob_ = start_probability model.transmat_ = transition_probability model.emissionprob_ = emission_probability# 觀測(cè)序列 observation_list = np.array([0, 1, 0])# 計(jì)算觀測(cè)序列概率,是概率的自然對(duì)數(shù)值 print(np.exp(model.score(observation_list.reshape(-1, 1))))求隱藏狀態(tài)序列
已知隱馬爾可夫模型三要素λ=(A,B,π)\lambda=(A, B, \pi)λ=(A,B,π),以及觀測(cè)矩陣O=(o1,o2,?,oT)O=(o_1,o_2, \cdots,o_T)O=(o1?,o2?,?,oT?)的基礎(chǔ)上,求有可能對(duì)應(yīng)的隱藏狀態(tài)序列I=(i1,i2,?,iT)I=(i_1, i_2, \cdots,i_T)I=(i1?,i2?,?,iT?)
使用維特比算法進(jìn)行解碼:
# 隱狀態(tài) states = ['box1', 'box2', 'box3']# 觀測(cè)集合 observations = ['black', 'white']# 初始概率 start_probability = np.array([0.3, 0.5, 0.2])# 狀態(tài)轉(zhuǎn)移矩陣 transition_probability = np.array([[0.4, 0.4, 0.2],[0.3, 0.2, 0.5],[0.2, 0.6, 0.2] ])# 觀測(cè)概率矩陣 emission_probability = np.array([[0.2, 0.8],[0.6, 0.4],[0.4, 0.6] ])# 使用MultinomialHMM建模 model = hmm.MultinomialHMM(n_components=len(states)) model.startprob_ = start_probability model.transmat_ = transition_probability model.emissionprob_ = emission_probability# 觀測(cè)序列,黑白黑 observation_list = np.array([0, 1, 0])# 調(diào)用維特比算法對(duì)觀測(cè)序列進(jìn)行隱狀態(tài)解碼 logprob, box_list = model.decode(observation_list.reshape(-1, 1), algorithm='viterbi')# 輸出隱狀態(tài)序列 print(box_list) for i in range(len(observation_list)):print(states[box_list[i]])參考
《機(jī)器學(xué)習(xí)中的概率統(tǒng)計(jì) python語(yǔ)言描述》 張雨萌
總結(jié)
- 上一篇: 判断一个年份是否是闰年
- 下一篇: PSP联机插件pro online