hmm隱馬爾可夫真的那麼難嗎?

hmm隱馬爾可夫真的那麼難嗎?

首先上代碼

這裏是github上的關於hmm的:

  • 概率計算問題:前向-後向算法
  • 學習問題:Baum-Welch算法(狀態未知)
  • 預測問題:Viterbi算法

https://github.com/TimVerion/HMM_code

需要的理論基礎(可以跳過)

信息熵

首先了解一下過去化學學習的熵,熱力學中表徵物質狀態的參量之一,用符號S表示,其物理意義是體系混亂程度的度量。克勞修斯於 1865 年的論文中定義了“熵” ,其中有兩句名言:“宇宙的能量是恆定的。”,“宇宙的熵趨於最大值。”

信息量:指的是一個樣本/事件所蘊含的信息,如果一個事件的概率越大,那麼就
可以認爲該事件所蘊含的信息越少。極端情況下,比如:“太陽從東方升起”,
因爲是確定事件,所以不攜帶任何信息量。

信息熵:1948年,香農引入信息熵;一個系統越是有序,信息熵就越低,一個系統越是混亂,信息熵就越高,所以信息熵被認爲是一個系統有序程度的度量。信息熵就是用來描述系統信息量的不確定度。

信息熵(Entropy)公式:
i=1npilog2(pi) -\sum_{i=1}^np_ilog_2(p_i)
在這裏插入圖片描述

High Entropy(高信息熵):表示隨機變量X是均勻分佈的,各種取值情況是等概
率出現的。Low Entropy(低信息熵):表示隨機變量X各種取值不是等概率出現。可能出現
有的事件概率很大,有的事件概率很小。

例子:

最大熵模型

機器學習中經常提到的最大熵的思想,就是當你要猜一個概率分佈時,如果你對這個分佈一無所知,那就猜熵最大的均勻分佈,如果你對這個分佈知道一些情況,那麼,就猜滿足這些情況的熵最大的分佈,就像我們使用最大似然去預測一樣。

例子:軟銀的孫正義他強調商戰要達到“不戰而屈人之兵”,避免“不打敗仗”,就得從事優勢職業。

孫正義投資雅虎,阿里,網約車火了便投資中國的滴滴和美國的Uber,也就是不把所有雞蛋放進一個籃子裏,這正是最大熵原理。

與最大熵思想區分開來後,我們要知道最大熵模型就是讓信息熵最大,而所謂的條件最大熵模型,就是在一定約束下條件熵最大的模型。再直白一點就是我們要保留全部的不確定性,將風險降到最小。

也就是當從模型總體隨機抽取n組樣本觀測值後,最合理的參數估計量應該使得從模型中抽取該n組樣
本觀測值的概率最大,這樣我們便構造了一個最大熵模型,沒錯這正是最大似然估計的定義。

最大熵模型,可以說是集簡與繁於一體,形式簡單,實現複雜。值得一提的是,在Google的很多產品中,比如機器翻譯,都直接或間接地用到了最大熵模型。

貝葉斯算法

三門問題:出自美國的電視遊戲節目。參賽者會看見三扇關閉了的門,其中一扇的後面有一輛汽車,選中後面有車的那扇門可贏得該汽車,另外兩扇門後面則各藏有一隻山羊。當參賽者選定了一扇門,但未去開啓它的時候,節目主持人開啓剩下兩扇門的其中一扇,露出其中一隻山羊。主持人其後會問參賽者要不要換另一扇仍然關上的門。問題是:換另一扇門會否增加參賽者贏得汽車的機率?如果嚴格按照上述的條件,即主持人清楚地知道,自己打開的那扇門後是羊,那麼答案是會。不換門的話,贏得汽車的機率是1/3。換門的話,贏得汽車的機率是2/3。

先驗概率P(A):在不考慮任何情況下,A事件發生的概率
條件概率P(B|A):A事件發生的情況下,B事件發生的概率
後驗概率P(A|B):在B事件發生之後,對A事件發生的概率的重新評估
PAB=P(AB)/P(B) P(A|B) = P(AB)/P(B)
全概率:如果A和A’構成樣本空間的一個劃分,那麼事件B的概率爲:A和A’的概
率分別乘以B對這兩個事件的概率之和。
P(B)=i=1nP(Ai)P(BAi) P(B) =\sum_{i=1}^nP(A_i)*P(B|A_i)
有上面的知識推出貝葉斯公式(後驗概率):
P(AB)=P(A)P(BA)P(B)=P(A)P(BA)i=1nP(BAiP(Ai)) P(A|B)=\frac{P(A)*P(B|A)}{P(B)} = \frac{P(A)*P(B|A)}{\sum_{i=1}^nP(B|A_i*P(A_i))}

貝葉斯網絡

把某個研究系統中涉及到的隨機變量,根據是否條件獨立繪製在一個有向圖中,
就形成了貝葉斯網絡。
貝葉斯網絡(Bayesian Network),又稱有向無環圖模型(directed acyclic
graphical model, DAG),是一種概率圖模型,根據概率圖的拓撲結構,考察一
組隨機變量{X1,X2,…,Xn}及其N組條件概率分佈(Conditional Probabililty
Distributions, CPD)的性質

當多個特徵屬性之間存在着某種相關關係的時候,使用樸素貝葉斯算法就沒法解
決這類問題,那麼貝葉斯網絡就是解決這類應用場景的一個非常好的算法。
一般而言,貝葉斯網絡的有向無環圖中的節點表示隨機變量,可以是可觀察到的
變量,或隱變量,未知參數等等。連接兩個節點之間的箭頭代表兩個隨機變量之
間的因果關係(也就是這兩個隨機變量之間非條件獨立),如果兩個節點間以一個
單箭頭連接在一起,表示其中一個節點是“因”,另外一個是“果”,從而兩節
點之間就會產生一個條件概率值。注意:每個節點在給定其直接前驅的時候,條件獨立於其後繼。

貝葉斯網絡的關鍵方法是圖模型,構建一個圖模型我們需要把具有因果聯繫的各
個變量用箭頭連在一起。貝葉斯網絡的有向無環圖中的節點表示隨機變量。連接
兩個節點的箭頭代表此兩個隨機變量是具有因果關係的。
貝葉斯網絡是模擬人的認知思維推理模式的,用一組條件概率以及有向無環圖對
不確定性因果推理關係建模

P(a,b, c) = P(c | a,b)*P(b | a)*P(a)

在這裏插入圖片描述
下面這幾個圖形形成的網絡都能達到,每一個只與上一個有關
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

EM算法

上面的知識點講到了MLE(最大似然估計),這裏先說一下MAP(最大後驗概率),MAP和MLE一樣,都是通過樣本估計參數θ的值;在MLE中,是使似然函數P(x|θ)最大的時候參數θ的值,MLE中假設先驗概率是一個等值的;而在MAP中,則是求θ使P(x|θ)P(θ)的值最大,這也就是要求θ值不僅僅是讓似然函數最大,同時要求θ本身出現的先驗概率也得比較大。

可以認爲MAP是貝葉斯算法的一種應用:
P(θX)=P(θ)P(Xθ)P(X)argmaxθP(θX)argmaxθP(θ)P(Xθ) P(θ|X)=\frac{P(θ)*P(X|θ)}{P(X)}\to arg \max_{θ}P(θ|X) \to arg\max_{θ}P(θ)P(X|θ)
EM算法(Expectation Maximization Algorithm, 最大期望算法)是一種迭代類型

的算法,是一種在概率模型中尋找參數最大似然估計或者最大後驗估計的算法,

其中概率模型依賴於無法觀測的隱藏變量。

EM算法流程:

  1. 初始化分佈參數

  2. 重複下列兩個操作直到收斂:

    E步驟:估計隱藏變量的概率分佈期望函數;

    M步驟:根據期望函數重新估計分佈參數

EM實現的過程中還會有一個Jensen不等式知識點,它使得我們可以假設隱含數據並形成極大化模型,然後對聯合概率求最大值直到收斂。

"""
實現GMM高斯混合聚類
根據EM算法流程實現這個流程
"""
import numpy as np
from scipy.stats import multivariate_normal
def train(x, max_iter=100):
    """
    進行GMM模型訓練,並返回對應的μ和σ的值(假定x數據中的簇類別數目爲2)
    :param x: 輸入的特徵矩陣x
    :param max_iter:  最大的迭代次數
    :return:  返回一個五元組(pi, μ1, μ2,σ1,σ2)
    """
    # 1. 獲取樣本的數量m以及特徵維度n
    m, n = np.shape(x)
    # 2. 初始化相關變量
    # 以每一列中的最小值作爲mu1,mu1中的元素數目就是列的數目(n)個
    mu1 = x.min(axis=0)
    mu2 = x.max(axis=0)
    sigma1 = np.identity(n)
    sigma2 = np.identity(n)
    pi = 0.5
    # 3. 實現EM算法
    for i in range(max_iter):
        # a. 初始化多元高斯分佈(初始化兩個多元高斯混合概率密度函數)
        norm1 = multivariate_normal(mu1, sigma1)
        norm2 = multivariate_normal(mu2, sigma2)

        # E step
        # 計算所有樣本數據在norm1和norm2中的概率
        tau1 = pi * norm1.pdf(x)
        tau2 = (1 - pi) * norm2.pdf(x)
        # 概率做一個歸一化操作
        w = tau1 / (tau1 + tau2)

        # M step
        mu1 = np.dot(w, x) / np.sum(w)
        mu2 = np.dot(1 - w, x) / np.sum(1 - w)
        sigma1 = np.dot(w * (x - mu1).T, (x - mu1)) / np.sum(w)
        sigma2 = np.dot((1 - w) * (x - mu2).T, (x - mu2)) / np.sum(1 - w)
        pi = np.sum(w) / m

    # 返回最終解
    return (pi, mu1, mu2, sigma1, sigma2)


if __name__ == '__main__':
    np.random.seed(28)

    # 產生一個服從多元高斯分佈的數據(標準正態分佈的多元高斯數據)
    mean1 = (0, 0, 0)  # x1\x2\x3的數據分佈都是服從正態分佈的,同時均值均爲0
    cov1 = np.diag((1, 1, 1))
    data1 = np.random.multivariate_normal(mean=mean1, cov=cov1, size=500)

    # 產生一個數據分佈不均衡
    mean2 = (2, 2, 3)
    cov2 = np.array([[1, 1, 3], [1, 2, 1], [0, 0, 1]])
    data2 = np.random.multivariate_normal(mean=mean2, cov=cov2, size=200)

    # 合併兩個數據
    data = np.vstack((data1, data2))

    pi, mu1, mu2, sigma1, sigma2 = train(data, 100)
    print("第一個類別的相關參數:")
    print(mu1)
    print(sigma1)
    print("第二個類別的相關參數:")
    print(mu2)
    print(sigma2)

    print("預測樣本屬於那個類別(概率越大就是那個類別):")
    norm1 = multivariate_normal(mu1, sigma1)
    norm2 = multivariate_normal(mu2, sigma2)
    x = np.array([0, 1, 0])
    print(pi * norm1.pdf(x)) # 屬於類別1的概率爲:0.0275  => 0.989
    print((1 - pi) * norm2.pdf(x))# 屬於類別1的概率爲:0.0003 => 0.011

HMM詳解

隱馬爾可夫模型(Hidden Markov Model,HMM)作爲一種統計分析模型,創立於20世紀70年代。80

年代得到了傳播和發展,成爲信號處理的一個重要方向,現已成功地用於語音識別,行爲識別,文字識別以及故障診斷等領域。

img

HMM介紹

HMM是統計模型,它用來描述一個含有隱含未知參數的馬爾可夫過程。其難點是從可觀察的參數中確定該過程的隱含參數。然後利用這些參數來作進一步的分析,例如模式識別

馬爾可夫性質

數學定理:設{X(t), t ∈ T}是一個隨機過程,E爲其狀態空間,若對於任意的t1<t2<…<tn<t,任意的x1,x2,…,xn,x∈E,隨機變量X(t)在已知變量X(t1)=x1,…,X(tn)=xn之下的條件分佈函數只與X(tn)=xn有關,而與X(t1)=x1,…,X(tn-1)=xn-1無關,即條件分佈函數滿足下列等式,此性質稱爲馬爾可夫性;如果隨機過程滿足馬爾可夫性,則該過程稱爲馬爾可夫過程。

大致意思就是我們當前狀態只受上一狀態的影響,而跟上一狀態之前的狀態無關,就叫做馬爾可夫性。

馬爾可夫鏈

馬爾可夫鏈是指具有馬爾可夫性質的隨機過程。在過程中,在給定當前信息的情
況下,過去的信息狀態對於預測將來狀態是無關的。
在馬爾可夫鏈的每一步,系統根據概率分佈,可以從一個狀態變成另外一個狀態,也可以保持當前狀態不變。狀態的改變叫做轉移,狀態改變的相關概率叫做轉移概率。
馬爾可夫鏈中的三元素是:狀態空間S、轉移概率矩陣P、初始概率分佈π。

舉個例子來講:

設將天氣狀態分爲晴、陰、雨三種狀態,假定某天的天氣狀態只和上一天的天氣狀態有關,狀態使用1(晴)、2(陰)、3(雨)表示,轉移概率矩陣P如下:

在這裏插入圖片描述

我們再看一下它們的各自轉移方式:

在這裏插入圖片描述

假設某天的天氣概率只與前一天的概率有關,也就是如下公式:

πn+1=πnP π^{n+1}=π^{n}*P
下面我們開始迭代,首先假設第一天的初始概率Π=[0.5,0.3,0.2],由上式和P矩陣迭代:

在這裏插入圖片描述
這裏重新假設第一天的初始概率π=[0.1,0.6,0.3],由上式和P矩陣迭代:

在這裏插入圖片描述
由此得出規律,只要迭代次數夠多,我們初始概率π並不會影響最終概率的出現。

隱馬爾科夫模型

HMM是一種統計模型,在語音識別、行爲識別、NLP、故障診斷等領域具有高效的性能。


HMM是關於時序的概率模型,描述一個含有未知參數的馬爾可夫鏈所生成的不可觀測的狀態隨機序列,再由各個狀態生成觀測隨機序列的過程。

HMM是一個雙重隨機過程—具有一定狀態的隱馬爾可夫鏈和隨機的觀測序列。HMM隨機生成的狀態隨機序列被稱爲狀態序列;每個狀態成一個觀測,由此產生的觀測隨機序列,被稱爲觀測序列。

HMM由隱含狀態S、可觀測狀態O、初始狀態概率矩陣π、隱含狀態轉移概率矩陣A、可觀測值轉移矩陣B(又稱爲混淆矩陣,Confusion Matrix);

在這裏插入圖片描述

這裏Π和A決定了狀態序列S,B決定了可觀測序列O,所以它們三個式整個隱馬的關鍵:
λ=(π,A,B) λ=(π,A,B)

A=[aij]nn A=[a_{ij}]_{n*n}

B=[bij]nm B = [b_{ij}]_{n*m}

π=(πi)1n=(π1,π2,π3,...,πn) π = (π_i)_1*n= (π_1,π_2,π_3,...,π_n)

S={s1,s2,s3,...,sn} S = \{{s_1,s_2,s_3,...,s_n}\}

O={o1,o2,o3,...,om} O = \{{o_1,o_2,o_3,...,o_m}\}

這裏S和O是相對於整個集合而言的,我們一般只會度量前T個狀態序列I和觀測序列Q:
I={i1,i2,...,iT} I= \{i_1,i_2,...,i_T\}

Q={q1,q2,...,qT} Q= \{q_1,q_2,...,q_T\}

這裏每個q發生的概率只受i的影響,而每一個i只受前一個i的影響。

HMM案例

假設有三個盒子,編號爲1,2,3;每個盒子都裝有黑白兩種顏色的小球,球的比例如下:

編號 白球 黑球
1 4 6
2 8 2
3 5 5

按照下列規則的方式進行有放回的抽取小球,得到球顏色的觀測序列:

  1. 按照π的概率選擇一個盒子,從盒子中隨機抽取出一個小球(B),記錄顏色後,放回盒子中;
  2. 按照某種條件概率(A)選擇新的盒子,重複該操作;
  3. 最終得到觀測序列:“白黑白白黑“

狀態集合:S={盒子1,盒子2,盒子3}
觀測集合:O={白,黑}
設狀態序列和觀測序列的長度T=5,並假設如下A,B,π

狀態轉移概率矩陣A:
A=(0.50.40.10.20.20.60.20.50.3) A=\begin{pmatrix} 0.5&amp;0.4&amp;0.1\\ 0.2&amp;0.2&amp;0.6\\ 0.2&amp;0.5&amp;0.3\\ \end{pmatrix}
觀測概率矩陣B:
B=(0.40.60.80.20.50.5) B=\begin{pmatrix} 0.4&amp;0.6\\ 0.8&amp;0.2\\ 0.5&amp;0.5\\ \end{pmatrix}
初始概率分佈π:
π=(0.20.50.3) π=\begin{pmatrix} 0.2\\ 0.5\\ 0.3\\ \end{pmatrix}

這時候我們面對自己假設的A,B,π,那它們得到觀測序列“白黑白白黑“的概率是多少?

現在假設條件下,唯一未知得就是狀態序列,所以這裏就要嘗試使用不同的狀態序列,並找到在一個在估計模型下的擁有最大概率的狀態序列。

有了狀態序列我們就可以預測再次抽取時發生事件的概率,在這個例子裏就是我們每次到底抽的時那個盒子,但是估計模型是假設的所以在去求狀態序列的前面,應該先去求得最優得A,B,π使得在這個模型下觀測序列發生得概率最大。

這裏便出現了兩個問題:

1,如何求得一個估計模型,讓觀測序列在該模型下發生概率最大。

2,如何求得隱藏得狀態序列,讓它在最優估計模型下發生得概率最大。

這裏爲什麼要求概率最大,便涉及到了最大熵模型。

應用到實際便成了三個問題,就是多一個我們如何該觀測序列在估計模型上出現得概率。

三個問題

概率計算問題:前向-後向算法

給定模型λ=(A,B,π)和觀測序列Q={q1,q2,…,qT},計算模型λ下觀測到序列Q出現的概率P(Q|λ)

學習問題:Baum-Welch算法(狀態未知)

已知觀測序列Q={q1,q2,…,qT},估計模型λ=(A,B,π)的參數,使得在該模型下觀測序列P(Q|λ)最大。

預測問題:Viterbi算法

給定模型λ=(A,B,π)和觀測序列Q={q1,q2,…,qT},求給定觀測序列條件概率P(I|Q,λ)
最大的狀態序列I

概率計算問題(前後向)

前向概率-後向概率指的其實是在一個觀測序列中,時刻t對應的狀態爲si的概率值轉換過來的信息。

所以這兩種都可以解決概率計算問題,也就是看懂一個就可以繼續下一個問題。
在這裏插入圖片描述

首先寫出在狀態序列爲s_i的情況下,觀測序列出現的概率。
P(q1,q2...qT,it=si)=P(q1,q2...qt=si)P(qt+1,qt+2...qTq1,q2,...,qt,it=si)=P(q1,q2...qt=si)P(qt+1,qt+2...qT,it=si) P(q_1,q_2...q_T,i_t = s_i) = P(q_1,q_2...q_t = s_i) P(q_{t+1},q_{t+2}...q_T|q_1,q_2,...,q_t,i_t = s_i) \\=P(q_1,q_2...q_t = s_i) P(q_{t+1},q_{t+2}...q_T,i_t = s_i)
β=P(qt+1,qt+2...qT,it=si)α=P(q1,q2...qt=si) 這裏我們把這一部分稱爲β = P(q_{t+1},q_{t+2}...q_T,i_t = s_i)\\ 這裏我們把這一部分稱爲α = P(q_1,q_2...q_t = s_i)

前向算法定義:給定λ(A,B,π),定義到時刻t部分觀測序列爲q1,q2,…,qt且狀態爲si的概率爲前向概率。此時我們加設β爲1,所以表達方程記做:
αt(i)=P(q1,q2...qt,it=siλ) \alpha_t(i)=P(q_1,q_2...q_t ,i_t= s_i;\lambda)

  1. 初值

    先計算第一個α:

    α1(i)=P(q1,i1=siλ)=πibiq1 \alpha_1(i)=P(q_1,i_1= s_i;\lambda)=π_ib_{iq_1}

  2. 遞推

    求出第一個後,遞推使t = 1,2,…,T-1
    αt+1(i)=(j=1nαt(j)αji)biqt+1 \alpha_{t+1}(i)=(\sum_{j=1}^n\alpha_t(j)\alpha_{ji})b_{iq_{t+1}}
    在這裏插入圖片描述
    αt(i)=P(q1,q2...qt,it=si)=P(q1,q2...qt1,it=si)P(qt,it=si)=[j=1nP(q1,q2...qt1,it1=sj,it=si)]P(qtit=si)=[j=1nP(q1,q2...qt1,it1=sj)P(it=siit1=sj)]P(qtit=si)=(j=1nαt1aji)biqt \alpha_t(i)=P(q_1,q_2...q_t ,i_t= s_i)\\ =P(q_1,q_2...q_{t-1},i_t= s_i)*P(q_t ,i_t= s_i)\\ =[\sum_{j=1}^nP(q_1,q_2...q_{t-1} ,i_{t-1}= s_j,i_t = s_i)]*P(q_t|i_t = s_i)\\ =[\sum_{j=1}^nP(q_1,q_2...q_{t-1} ,i_{t-1}= s_j)P(i_t = s_i|i_{t-1}= s_j)]*P(q_t|i_t = s_i)\\ =(\sum_{j=1}^n\alpha_{t-1}a_{ji})b_{iq_t}

  3. 結果

    這樣狀態序列爲s_i的情況下,觀測序列出現的概率就變成了:
    P(Q;λ)=i=1nαT(i) P(Q;\lambda) = \sum_{i=1}^n\alpha_T(i)
    [前向傳播代碼]: https://github.com/TimVerion/HMM_code/blob/master/hmm/forward_probability.py “前向傳播代碼”

    # 僞代碼,不可運行
    # 更新初值(t=1)
    for i in n_range:
    	alpha[0][i] = pi[i] * B[i][fetch_index_by_obs_seq_f(Q, 0)]
    # 迭代更新其它時刻
    T = len(Q)
    tmp = [0 for i in n_range]
    for t in range(1, T):
        for i in n_range:
            # 1. 計算上一個時刻t-1累積過來的概率值
            for j in n_range:
                tmp[j] = alpha[t - 1][j] * A[j][i]
            # 2. 更新alpha的值
            alpha[t][i] = np.sum(tmp) * B[i][fetch_index_by_obs_seq_f(Q, t)]
    

    後向傳播定義:給定λ,定義到時刻t狀態爲si的前提下,從t+1到T部分觀測序列爲qt+1,qt+2,…,qT的概率爲後向概率。記做:
    βt(i)=P(qt+1,qt+2...qTit=siλ) β_t(i)=P(q_{t+1},q_{t+2}...q_T | i_t= s_i;\lambda)
    ​1. 初值

    先計算第一個β,在我們進行前向算法的時候我們假設β爲1:

    βTi=1 β_T{i} = 1

  4. 遞推

    求出第一個後,遞推使t = T-1,T-2…,1
    βt(i)=(j=1nαijbjq(t+1)βt+1(j)) β_t(i)=(\sum_{j=1}^n\alpha_{ij}b_{jq_(t+1)}β_{t+1}(j))
    在這裏插入圖片描述
    βt(i)=P(qt+1,qt+2...qT,it=si)=j=1nP(it+1=sj,qt+1,qt+2...qTit=si)=j=1nP(qt+1,qt+2...qTit+1=sj)P(it+1=sjit=si)=j=1nP(qt+2...qTit+1=sj)P(qt+1it+1=sj)P(it+1=sjit=si)=j=1n(βt+1(j)bjqt+1aij) β_t(i)=P(q_{t+1},q_{t+2}...q_T ,i_t= s_i)\\ =\sum_{j=1}^nP(i_{t+1} = s_j,q_{t+1},q_{t+2}...q_T|i_t = s_i)\\ =\sum_{j=1}^nP(q_{t+1},q_{t+2}...q_T|i_{t+1} = s_j)P(i_{t+1} = s_j|i_t = s_i)\\ =\sum_{j=1}^nP(q_{t+2}...q_T|i_{t+1} = s_j)P(q_{t+1}|i_{t+1} =s_j)P(i_{t+1} = s_j|i_t = s_i)\\ =\sum_{j=1}^n(β_{t+1}(j)b_{jq_{t+1}}a_{ij})

  5. 結果

    這樣狀態序列爲s_i的情況下,觀測序列出現的概率就變成了:
    P(Q;λ)=i=1nπibiq1β1(i) P(Q;\lambda) = \sum_{i=1}^nπ_ib_{iq_1}β_1(i)

    # 更新初值(t=T)
    for i in n_range:
        beta[T - 1][i] = 1
    # 迭代更新其它時刻
    tmp = [0 for i in n_range]
    for t in range(T - 2, -1, -1):
        for i in n_range:
            # 1. 計算到下一個時刻t+1的概率值
            for j in n_range:
                tmp[j] = A[i][j] * beta[t + 1][j] * B[j][fetch_index_by_obs_seq_f(Q, t +1)]
            # 2. 更新beta的值
            beta[t][i] = np.sum(tmp)
    

學習問題(鮑姆韋爾奇)

根據概率計算問題我們可以求的兩個可以幫助我們解決學習問題的概率:

1,單個狀態的概率

將給定模型λ和觀測序列Q的情況下,在時刻t處於狀態si的概率,記做:
γt(i)=p(it=siQ;λ) γ_t(i) = p(i_t = s_i|Q;\lambda)
單個狀態概率的意義主要是用於判斷在每個時刻最可能存在的狀態,從而可以得
到一個狀態序列作爲最終的預測結果。

推導過程:
p(it=si,Q,;λ)=αt(i)βt(i)γt(i)=p(it=siQ;λ)=p(it=siQ;λ)p(Q;λ)=αt(i)βt(i)j=1nαt(j)βt(j) p(i_t = s_i,Q,;\lambda) = \alpha_t(i)\beta_t(i)\\ γ_t(i) = p(i_t = s_i|Q;\lambda)\\ =\frac{ p(i_t = s_i|Q;\lambda)}{p(Q;\lambda)}\\ = \frac{\alpha_t(i)\beta_t(i)}{\sum_{j=1}^n\alpha_t(j)\beta_t(j)}

2,兩個狀態的聯合概率

將給定模型λ和觀測序列Q的情況下,在時刻t處於狀態si並且在t+1時刻處於狀態sj的概
率,記做:
ξt(i,j)=p(it=si,it+1=sjQ;λ)=p(it=si,it+1=sj,Q;λ)P(Q;λ)=p(it=si,it+1=sj,Q;λ)i=1nj=1np(it=si,it+1=sj,Q;λ) \xi_t(i,j) = p(i_t = s_i,i_{t+1} = s_j|Q;\lambda)\\ =\frac{p(i_t = s_i,i_{t+1}=s_j,Q;\lambda)}{P(Q;\lambda)}\\ =\frac{p(i_t = s_i,i_{t+1}=s_j,Q;\lambda)}{\sum_{i=1}^n\sum_{j=1}^np(i_t = s_i,i_{t+1}=s_j,Q;\lambda)}\\

也就是:

P(it=si,it+1=sj,Q;λ)=αt(i)aijbjqt+1βt+1(j) P(i_t = s_i,i_{t+1} = s_j,Q;\lambda) = \alpha_t(i)a_{ij}b_{jq_{t+1}}β_{t+1}(j)

3,解決學習問題

若訓練數據包含觀測序列和狀態序列,則HMM的學習問題非常簡單,是監督學
習算法。我們甚至在知道觀測序列和狀態序列的時候我們可以利用大數定理求出最優模型。

π^i=sii=1nsij)a^ij=siji=1nsij)b^ij=qiji=1nqij) \hat \pi_i=\frac{|s_i|}{\sum_{i=1}^n|s_{ij}|)}\\ \hat a_{ij}=\frac{|s_{ij}|}{\sum_{i=1}^n|s_{ij}|)}\\ \hat b_{ij}=\frac{|q_{ij}|}{\sum_{i=1}^n|q_{ij}|)}\\

但是我們的訓練數據只包含觀測序列,則HMM的學習問題需要使用EM算法求解,是非
監督學習算法,這裏使用的EM算法也叫做鮑姆韋爾奇。

那麼我們想一下,這裏假設所有的觀測數據爲Q={q1,q2,…,qT},所有的隱狀態爲I={i1,i2,…,iT},則完整的數據爲(O,I),完整數據的對數似然函數爲ln(p(Q,I;λ)); 然後直接使用EM算法的方式就可以來進行參數估計了。(EM算法不懂見上)

  1. 初始化分佈參數

  2. 重複下列兩個操作直到收斂:

    E步驟:估計隱藏變量的概率分佈期望函數:
    P(O,I;λ)=πi1bi1q1ai1i2bi2q2...aiT1iTbiTqT P(O,I;\lambda) = \pi_{i_1}b_{i_1q_1}a_{i_1i_2}b_{i_2q_2}...a_{i_{T-1}i_T}b_{i_Tq_T}

    L(λ,λ)=Iln(P(Q,I;λ))P(IQ;λ)=Iln(P(Q,I,λ))p(I,Q,λ)p(Q,λ)Iln(p(Q,I;λ))p(I,Q;λ) L(\lambda,\overline \lambda) = \sum_Iln(P(Q,I;\lambda))P(I|Q;\overline \lambda)\\ =\sum_Iln(P(Q,I,\lambda))\frac{p(I,Q,\overline \lambda)}{p(Q,\overline \lambda)}\\ \to\sum_I ln(p(Q,I;\lambda))p(I,Q;\overline \lambda)\\

    L(λ,λ)=Iln(πi)p(I,Q;λ)+I(t=1T1lnaitit+1p(I,Q;λ))+I(t=1Tlnbitqt)p(I,Q;λ) L(\lambda,\overline \lambda) = \sum_Iln(\pi_i)p(I,Q;\overline \lambda) + \sum_I(\sum_{t=1}^{T-1}ln a_{i_ti_{t+1}}p(I,Q;\overline \lambda))+\sum_I(\sum_{t=1}^Tlnb_{i_tq_t})p(I,Q;\overline \lambda)

    M步驟:根據期望函數重新估計分佈參數

π的求解

當我們瞭解L函數,也就是我們需要極大化的函數,可以直接對π求導,然後讓偏導等於零。
Iln(πIi)P(I,Q;λ)=i=1nln(πi)p(Q,i1=i;λ) \sum_Iln(\pi_{I_i})P(I,Q;\overline \lambda) = \sum_{i=1}^nln(\pi_i)p(Q,i_1 = i;\overline \lambda)\\

使滿i=1nπi=1 這裏使用拉格朗日乘子法,我們除了要最小化目標函數外,我們還要滿足:\sum_{i=1}^n\pi_i =1

i=1nln(πi)p(Q,i1=i;λ)+β(i=1nπi1) 這時候有了等值約束:\sum_{i=1}^nln(\pi_i)p(Q,i_1 = i;\overline \lambda)+β(\sum_{i=1}^n\pi_i -1)

p(Q,i1=i;λ)+βπi=0β=P(Q,λπi=p(Q,i1=i;λ)p(Q;λ)=p(Q,i1=i;λ)i=1np(Q,i1=i;λ)=γ1(i) p(Q,i_1 = i;\overline \lambda) +β\pi_i = 0\\ β = -P(Q,\overline \lambda)\\ \pi_i = \frac{p(Q,i_1 = i;\overline \lambda)}{p(Q;\overline \lambda)}\\ = \frac{p(Q,i_1 = i;\overline \lambda)}{\sum_{i=1}^np(Q,i_1 = i;\overline \lambda)}=\gamma_1(i)\\

這裏寫到γ是不是很熟悉,沒錯就是我們是上面求的單個狀態的概率。

A的求解

和上一個變量求解一樣,我們需要極大化L
I(t=1T1lnaitat+1)P(I,Q;λ)=i=1nj=1nt=1T1ln(aijp(Q,it=i,it+1=j;λ)) \sum_I(\sum_{t=1}^{T-1}ln a_{i_t}a_{t+1})P(I,Q;\overline \lambda)\\ = \sum_{i=1}^n \sum_{j=1}^n \sum_{t=1}^{T-1}ln(a_{ij}p(Q,i_t = i,i_{t+1}=j;\overline \lambda))

滿i=1nj=1naij=n 這裏我們除了需要滿足:\sum_{i=1}^n\sum_{j=1}^na_{ij}=n

:i=1nj=1nt=1T1ln(aijp(Q,it=i,it+1=j;λ))+β(i=1nj=1naij=n) 等值約束公式:\\\sum_{i=1}^n \sum_{j=1}^n \sum_{t=1}^{T-1}ln(a_{ij}p(Q,i_t = i,i_{t+1}=j;\overline \lambda))+\beta(\sum_{i=1}^n\sum_{j=1}^na_{ij}=n)

t=1T1p(Q,it=i,it+1=j;λ))+βaij=0β=t=1T1p(Q,it=i;λ)aij=t=1T1p(Q,it=i,it+1=j;λ)t=1T1p(Q,it=i;λ)=t=1T1ξt(i,j)t=1T1γt(i) 經過對數似然: \sum_{t=1}^{T-1}p(Q,i_t = i,i_{t+1}=j;\overline \lambda))+\beta a_{ij}=0\\ 這時候可以求出\beta = -\sum_{t=1}^{T-1}p(Q,i_t = i;\overline \lambda)\\ a_{ij}=\frac{\sum_{t=1}^{T-1}p(Q,i_t = i,i_{t+1}=j;\overline \lambda)}{\sum_{t=1}^{T-1}p(Q,i_t = i;\overline \lambda)}\\ =\frac{\sum_{t=1}^{T-1}\xi_t(i,j)}{\sum_{t=1}^{T-1}\gamma _t(i)}

在上面的式子裏,我們求aij也就是A的時候,我們必須使用單個狀態的概率和兩個狀態的聯合概率。

B的求解

同上我們對B求偏導,然後讓偏導等於零:
I(t=1T1lnbitqt)P(I,Q;λ)=i=1nj=1nt=1TlnbijP(Q,it=i,it+1=j;λ) \sum_I(\sum_{t=1}^{T-1}ln b_{i_tq_t})P(I,Q;\overline \lambda)\\ = \sum_{i=1}^n \sum_{j=1}^n\sum_{t=1}^Tlnb_{ij}P(Q,i_t = i,i_{t+1}=j;\overline \lambda)

滿i=1nj=1nbij=n 這裏我們除了需要滿足:\sum_{i=1}^n\sum_{j=1}^nb_{ij}=n

:i=1nj=1nt=1TlnbijP(Q,it=i,it+1=j;λ)+β(i=1nj=1nbijn)t=1T1p(Q,it=i,it+1=j;λ))+βbij=0β=t=1T1p(Q,it=i;λ)bij=t=1Tp(Q,it=i,it+1=j;λ)t=1Tp(Q,it=i;λ)=t=1,qt=jTp(Q,it=i;λ)t=1Tp(Q,it=i;λ)=t=1,qt=jTγt(i)t=1Tγt(i) 等值約束公式:\\ \sum_{i=1}^n \sum_{j=1}^n\sum_{t=1}^Tlnb_{ij}P(Q,i_t = i,i_{t+1}=j;\overline \lambda)+\beta(\sum_{i=1}^n\sum_{j=1}^nb_{ij}-n)\\ 經過對數似然: \sum_{t=1}^{T-1}p(Q,i_t = i,i_{t+1}=j;\overline \lambda))+\beta b_{ij}=0\\ 這時候可以求出\beta = -\sum_{t=1}^{T-1}p(Q,i_t = i;\overline \lambda)\\ b_{ij}=\frac{\sum_{t=1}^{T}p(Q,i_t = i,i_{t+1}=j;\overline \lambda)}{\sum_{t=1}^{T}p(Q,i_t = i;\overline \lambda)}\\ =\frac{\sum_{t=1,q_t = j}^{T}p(Q,i_t = i;\overline \lambda)}{\sum_{t=1}^{T}p(Q,i_t = i;\overline \lambda)}\\ =\frac{\sum_{t=1,q_t=j}^{T}\gamma _t(i)}{\sum_{t=1}^{T}\gamma _t(i)}

經過極大化L函數我們可以求得π、a、b的值,這樣我們便得到了一個最優模型。

πi=γ1(i)       aij=t=1T1ξt(i,j)t=1T1γt(i)      bij=t=1,qt=jTγt(i)t=1Tγt(i) \pi_i = \gamma_1(i)\space\space\space\space\space\space\space a_{ij} = \frac{\sum_{t=1}^{T-1}\xi_t(i,j)}{\sum_{t=1}^{T-1}\gamma _t(i)}\space\space\space\space\space\space b_{ij} =\frac{\sum_{t=1,q_t=j}^{T}\gamma _t(i)}{\sum_{t=1}^{T}\gamma _t(i)}

# 1. 迭代更新(EM算法思想類型)
for time in range(max_iter):
 # a. 在當前的pi,A,B的情況下對觀測序列Q分別計算alpha、beta、gamma和ksi
 forward.calc_alpha(pi, A, B, Q, alpha, fetch_index_by_obs_seq_f)
 backward.calc_beta(pi, A, B, Q, beta, fetch_index_by_obs_seq_f)
 single.calc_gamma(alpha, beta, gamma)
 continuous.calc_ksi(alpha, beta, A, B, Q, ksi, fetch_index_by_obs_seq
 # b. 更新pi、A、B的值
 # b.1. 更新pi值
 for i in n_range:
     pi[i] = gamma[0]
 # b.2. 更新狀態轉移矩陣A的值
 tmp1 = np.zeros(T - 1)
 tmp2 = np.zeros(T - 1)
 for i in n_range:
     for j in n_range:
         # 獲取所有時刻從狀態i轉移到狀態j的值
         for t in t_1_range:
             tmp1[t] = ksi[t][i][j]
             tmp2[t] = gamma[t]
         # 更新狀態i到狀態j的轉移概率
         A[i][j] = np.sum(tmp1) / np.sum(tm
 # b.3. 更新狀態和觀測值之間的轉移矩陣
 for i in n_range:
     for k in m_range:
         tmp1 = np.zeros(T)
         tmp2 = np.zeros(T)
         # 獲取所有時刻從狀態i轉移到觀測值k的概率和
         number = 0
         for t in t_range:
             if k == fetch_index_by_obs_seq_f(Q, t):
               如果序列Q中時刻t對應的觀測值就是k,那麼進行統計這個時刻t爲狀態i的概率值
                 tmp1[t] = gamma[t][i]
                 number +
             tmp2[t] = gamma[t]
         # 更新狀態i到觀測值k之間的轉移概率
         if number == 0:
             # 沒有轉移,所以爲0
             B[i][k] = 0
         else:
             # 有具體值,那麼進行更新操作
             B[i][k] = np.sum(tmp1) / np.sum(tem2)

預測問題(維特比)

Viterbi算法實際是用動態規劃的思路求解HMM預測問題,求出概率最大的“路徑”,每條“路徑”對應一個狀態序列。

動態規劃是運籌學的一個分支,是求解決策過程最優化的數學方法。
把多階段過程轉化爲一系列單階段問題,利用各階段之間的關係,逐個求解。

比如斐波那契數列和揹包問題都利用了這個思想。

σt(i)=maxi1,i2...it1p(it=i,i1,i2...it1,qt,qt1...q1;λ)σ1(i)=πibiq1σt+1(i)=max1in(σt(j)aji)biqt+1max1inσT(i)便 \sigma_t(i) = \max_{i_1,i_2...i_{t-1}}p(i_t = i,i_1,i_2...i_{t-1},q_t,q_{t-1}...q_1;\lambda)\\ \sigma_1(i) = \pi_ib_{iq_1}\\ \sigma_{t+1}(i) = \max_{1\le i\le n}(\sigma_t(j)a_{ji})b_{iq_{t+1}}\\ 當求出 \max_{1\le i \le n}\sigma_{T}(i)便求出了最大概率。

# 1. 計算t=1的時候delta的值
for i in n_range:
    delta[0][i] = pi[i] * B[i][fetch_index_by_obs_seq_f(Q, 0)]
# 2. 更新其它時刻的值
for t in range(1, T):
    for i in n_range:
        # 當前時刻t的狀態爲i
        # a. 獲取最大值
        max_delta = -1
        for j in n_range:
            # j表示的是上一個時刻的狀態值
            tmp = delta[t - 1][j] * A[j][i]
            if tmp > max_delta:
                max_delta = tmp
                pre_index[t][i] = j
        # b. 更新值
        delta[t][i] = max_delta * B[i][fetch_index_by_obs_seq_f(Q, t)]
# 3. 解碼操作,查找到最大的結果值
decode = [-1 for i in range(T)]

隱馬爾可夫模型(HMM)是由馬爾可夫過程衍生出的概率圖模型,常被用於語音模式識別、生物基因序列標記、金融時間序列預測等。

HMM在我們生活中無處不在,舉個簡單的例子:

身邊的朋友一般出行有騎共享單車出行的,說下雨就比晴天騎車的人數少,當我們聽朋友說今天外面共享單車被騎沒了,我們可以推斷出今天天氣不錯,這裏顯式狀態是出行,而隱狀態是天氣。

所以我們很早就已經會HMM算法的思想了,只是差這幾個算法和證明。

這裏說的HMM不是買零食的韓梅梅

馬爾可夫模型解決語音識別

時間點 t的隱藏條件和時間點 t-1的隱藏條件有關。

因爲人類語音擁有前後的關係,可以從語義與發音兩點來看:

單字的發音擁有前後關係:例如"They are"常常發音成"They’re",或是"Did you"會因爲"you"的發音受"did"的影響,常常發音成"did ju",而且語音識別中用句子的發音來進行分析,因此需要考慮到每個音節的前後關係,才能夠有較高的準確率。

句子中的單字有前後關係:從英文文法來看,主詞後面常常接助動詞或是動詞,動詞後面接的會是受詞或介係詞。而或是從單一單字的使用方法來看,對應的動詞會有固定使用的介係詞或對應名詞。因此分析語音頻息時需要爲了提升每個單字的準確率,也需要分析前後的單字。

馬爾可夫模型將輸入消息視爲一單位一單位,接着進行分析,與人類語音模型的特性相似。語音系統識別的單位爲一個單位時間內的聲音。利用梅爾倒頻譜等語音處理方法,轉換成一個發音單位,爲離散型的信息。而馬爾可夫模型使用的隱藏條件也是一個個被數據包的 x(t),因此使用馬爾可夫模型來處理聲音頻號比較合適。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章