隐马尔可夫模型(HMM)

作者: Thinkando | 来源:发表于2018-09-28 10:10 被阅读70次

马尔可夫链

image.png
image.png

隐马尔可夫

  • 一个直观的例子


    image.png
    image.png
  • 找概率高的那条线
  • 同过观察值(Kiss,Beat,do nothing)推断出女友三天的心情是(happy,happy,unhappy)


    image.png
    image.png
    image.png
    image.png
    image.png
    image.png

用隐马尔可夫模型建模

  • 给一条序列预测其中的编码区


    image.png
    image.png
    image.png
    image.png
    image.png
  • 这里用log,把 n*c 变成了a+c


  • 找回溯


    image.png
  • 得到最终结果


    image.png

python 简单实现

import numpy as np

seq="CGAAAAAATCG"
# nocoding ,coding
states = ('N', 'C')
observations = ('A', 'C', 'G','T')
# 状态转移矩阵A
transition_probability = {
    'N': {'N': 0.8, 'C': 0.2},
    'C': {'N': 0.4, 'C': 0.6},
}
# 观测概率矩阵B
emission_probability = {
    'N': {'A': 0.2, 'C': 0.3, 'G': 0.3,'T':0.2},
    'C': {'A': 0.4, 'C': 0.2, 'G': 0.2,'T':0.2},
}

array =np.zeros((len(states),len(seq)+1))

array[0,0]=0.8
array[1,0]=0.2
for i in range(1,array.shape[1]):
    if array[0,i-1]>array[1,i-1]:
        array[0,i]=array[0,i-1]*emission_probability['N'][seq[i-1]]
        array[1,i]=array[0,i-1]*emission_probability['C'][seq[i-1]]
    else:
        array[0, i] = array[1,i-1] * emission_probability['N'][seq[i - 1]]
        array[1, i] = array[1,i-1] * emission_probability['C'][seq[i - 1]]
    print(array)
list=[]
for i in range(1,array.shape[1]):
    if array[0,i]>array[1,i]:
        list.append('N')
    else:
        list.append('C')

print(seq)
print("".join(list))
[[8.000000e-01 2.400000e-01 7.200000e-02 1.440000e-02 5.760000e-03
  2.304000e-03 9.216000e-04 3.686400e-04 1.474560e-04 5.898240e-05
  1.769472e-05 5.308416e-06]
 [2.000000e-01 1.600000e-01 4.800000e-02 2.880000e-02 1.152000e-02
  4.608000e-03 1.843200e-03 7.372800e-04 2.949120e-04 5.898240e-05
  1.179648e-05 3.538944e-06]]
CGAAAAAATCG
NNCCCCCCCNN

相关文章

网友评论

    本文标题:隐马尔可夫模型(HMM)

    本文链接:https://www.haomeiwen.com/subject/mtjuoftx.html