目录
注:参考链接 https://www.cnblogs.com/pinard/p/6945257.html
1. Hidden Markov Model
隐马尔科夫模型(Hidden Markov Model,以下简称HMM)是比较经典的机器学习模型了,它在语言识别,自然语言处理,模式识别等领域得到广泛的应用,
深度学习的崛起,尤其是RNN,LSTM等神经网络序列模型的火热,HMM的地位有所下降,
使用HMM模型时我们的问题一般有这两个特征:
1)序列问题,比如时间序列,或者状态序列。例如:医学上的心电图,血压血氧图,睡眠数据,等。
2)我们的问题中有两类数据,一类序列数据是可以观测到的,即观测序列;而另一类数据是不能观察到的,即隐藏状态序列,简称状态序列。
事务的本质,真理往往是很难把握,但是可以透过现象看本质,
例如, 有的时候,一句话只说了前半句,是不是有的时候不用说后半句,其实你就已经露馅了
2. HMM模型定义
Q是所有可能的隐藏状态的集合,V 是所有可能的观测状态的集合。
N 是可能的隐藏状态数,M是所有的可能的观察状态数。
对于一个长度为T的序列,I对应的状态序列, O是对应的观察序列,即:
其中,任意一个隐藏状态it∈Q,任意一个观察状态ot∈V
状态转移矩阵,某一个隐藏状态不仅仅只依赖于前一个隐藏状态
观察状态只仅仅依赖于当前时刻的隐藏状态
初始时刻的隐藏状态概率分布Π
HMM模型可以由一个三元组λ表示如下:
用一个简单的实例来描述上面抽象出的HMM模型。这是一个盒子与球的模型,例子来源于李航的《统计学习方法》。
import random
box0 = ["red", "red", "red", "red", "red", "black", "black", "black", "black", "black"] # 5 red 5 black
box1 = ["red", "red", "red", "red", "black", "black", "black", "black", "black", "black"] # 4 red black
box2 = ["red", "red", "red", "red", "red", "red", "red", "black", "black", "black"] # 7 red 3 black
boxes = [box0, box1, box2]
pai = [0.2, 0.4, 0.4] # 初始
A = [[0.5, 0.2, 0.3],
[0.3, 0.5, 0.2],
[0.2, 0.3, 0.5]]
def decide_next_box(distribute):
r = random.random()
if r < distribute[0]:
return 0
elif distribute[0] < r < distribute[0] + distribute[1]:
return 1
return 2
def box_trans(prev):
next_distribute = A[prev]
return decide_next_box(next_distribute)
def get_bal(box_id):
box = boxes[box_id]
return random.choice(box)
if __name__ == '__main__':
observes = []
# 以pai分布 确定第一个盒子
box_id = decide_next_box(pai)
print("初始的box: %s" % box_id)
for i in range(10):
observ = get_bal(box_id)
print("")
print(f"{i}----观测值:{observ}")
observes.append(observ)
print("前一个 box_id: %s 转移到" % box_id, end="")
box_id = box_trans(box_id)
print("后一个 box_id: %s " % box_id, end="")
print("")
print(observes)
总结一下 HMM 序列的生成过程:
输入的是HMM的模型:,观测序列的长度T
输出:
根据初始状态概率分布生成隐藏状态i1,
for t from 1 to T:
1, 按照隐藏状态it的观测状态分布B生成观察状态ot
2. 按照隐藏状态it的状态转移概率分布A产生隐藏状态it+1
输出观测序列:
标签:box,状态,33,模型,马尔科夫,black,序列,id,red From: https://www.cnblogs.com/cavalier-chen/p/17962124