机器学习-概率图模型系列-隐含马尔科夫模型-33

发布时间 2024-01-13 10:59:40作者: jack-chen666


注:参考链接 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

输出观测序列: