統計學習方法 第十章習題答案

10.1

題目:

給定盒子和球組成的隱馬爾可夫模型λ=(A,B,π)\lambda = (A,B,\pi),其中,A=[0.50.20.30.30.50.20.20.30.5],B=[0.50.50.40.60.70.3],π=(0.2,0.4,0.4)TA =\begin{bmatrix} 0.5 & 0.2 & 0.3\\ 0.3 & 0.5 & 0.2\\ 0.2 & 0.3 & 0.5 \end{bmatrix}, B=\begin{bmatrix} 0.5 & 0.5\\ 0.4 & 0.6\\ 0.7 & 0.3 \end{bmatrix}, \pi=(0.2, 0.4, 0.4)^T
T=4,O=()T = 4, O = (紅,白, 紅, 白),試用後向算法計算P(Oλ)P(O|\lambda)

解答

按照算法10.3
(1)計算初值
β4(i)=1i=1,2,3\beta_4(i) = 1 \quad i=1,2,3
(2)遞推計算
β3(1)=j=13a1jbj(O4)β4(j)=0.25+0.12+0.09=0.46\beta_3(1)=\sum^3_{j=1}a_{1j}b_j(O_4)\beta_4(j)=0.25+0.12+0.09=0.46
β3(2)=j=13a2jbj(O4)β4(j)=0.15+0.3+0.06=0.51\beta_3(2)=\sum^3_{j=1}a_{2j}b_j(O_4)\beta_4(j)=0.15+0.3+0.06=0.51
β3(3)=j=13a3jbj(O4)β4(j)=0.1+0.18+0.15=0.43\beta_3(3)=\sum^3_{j=1}a_{3j}b_j(O_4)\beta_4(j)=0.1+0.18+0.15=0.43

β2(1)=j=13a1jbj(O3)β3(j)=0.250.46+0.080.51+0.210.43=0.2461\beta_2(1)=\sum^3_{j=1}a_{1j}b_j(O_3)\beta_3(j)=0.25*0.46+0.08*0.51+0.21*0.43=0.2461
β2(2)=j=13a2jbj(O3)β3(j)=0.150.46+0.20.51+0.140.43=0.2312\beta_2(2)=\sum^3_{j=1}a_{2j}b_j(O_3)\beta_3(j)=0.15*0.46+0.2*0.51+0.14*0.43=0.2312
β2(3)=j=13a3jbj(O3)β3(j)=0.10.46+0.120.51+0.350.43=0.2577\beta_2(3)=\sum^3_{j=1}a_{3j}b_j(O_3)\beta_3(j)=0.1*0.46+0.12*0.51+0.35*0.43=0.2577

β1(1)=j=13a1jbj(O2)β2(j)=0.250.2461+0.120.2312+0.090.2577=0.112462\beta_1(1)=\sum^3_{j=1}a_{1j}b_j(O_2)\beta_2(j)=0.25*0.2461+0.12*0.2312+0.09*0.2577 = 0.112462
β1(2)=j=13a2jbj(O2)β2(j)=0.150.2461+0.30.2312+0.060.2577=0.121737\beta_1(2)=\sum^3_{j=1}a_{2j}b_j(O_2)\beta_2(j)=0.15*0.2461+0.3*0.2312+0.06*0.2577 = 0.121737
β1(3)=j=13a3jbj(O2)β2(j)=0.10.2461+0.180.2312+0.150.2577=0.104881\beta_1(3)=\sum^3_{j=1}a_{3j}b_j(O_2)\beta_2(j)=0.1*0.2461+0.18*0.2312+0.15*0.2577 = 0.104881
(3)終止
P(Oλ)=i=13πibi(O1)β1(i)=0.20.50.112462+0.40.40.121737+0.40.70.104881=0.0600908P(O|\lambda) = \sum^3_{i=1}\pi_{i}b_i(O_1)\beta_1(i) = 0.2*0.5*0.112462+0.4*0.4*0.121737+0.4*0.7*0.104881=0.0600908

10.2

題目

考慮盒子和球組成的隱馬爾可夫模型λ=(A,B,π)\lambda = (A,B,\pi),其中,A=[0.50.10.40.30.50.20.20.20.6],B=[0.50.50.40.60.70.3],π=(0.2,0.3,0.5)TA =\begin{bmatrix} 0.5 & 0.1 & 0.4\\ 0.3 & 0.5 & 0.2\\ 0.2 & 0.2 & 0.6 \end{bmatrix}, B=\begin{bmatrix} 0.5 & 0.5\\ 0.4 & 0.6\\ 0.7 & 0.3 \end{bmatrix}, \pi=(0.2, 0.3, 0.5)^T
T=8,O=()T = 8, O = (紅,白,紅,紅,白,紅,白,白),試用前向後向算法計算P(i4=q3O,λ)P(i_4=q_3|O,\lambda)

解答

這題就偷個小懶,讓python幫忙解決叭(╹▽╹)
代碼:

import numpy as np

def fore_algorithm(A, B, p_i, o, T, N):
    # 設初值,alpha_1(i) = pt_(i)b_i(o(i))
    alpha = np.zeros((T, N))
    for i in range(N):
        h = o[0]
        alpha[0][i] = p_i[i] * B[i][h]
    #遞推
    for t in range(T-1):
        h = o[t+1]
        for i in range(N):
            a = 0
            for j in range(N):
                a += (alpha[t][j] * A[j][i])
            alpha[t+1][i] = a * B[i][h]
    #終止
    P = 0
    for i in range(N):
        P += alpha[T-1][i]
    return P, alpha

def back_algorithm(A, B, p_i, o, T, N):
    #設置初值,beta_t(i)=1
    beta = np.ones((T, N))
    #遞推
    for t in range(T-1):
        t = T - t - 2
        h = o[t + 1]
        h = int(h)

        for i in range(N):
            beta[t][i] = 0
            for j in range(N):
                beta[t][i] += A[i][j] * B[j][h] * beta[t+1][j]
    #終止
    P = 0
    for i in range(N):
        h = o[0]
        h = int(h)
        P += p_i[i] * B[i][h] * beta[0][i]
    return P, beta

if __name__ == "__main__":
    T = 8
    N = 3
    A = [[0.5, 0.1, 0.4], [0.3, 0.5, 0.2], [0.2, 0.2, 0.6]]
    B = [[0.5, 0.5], [0.4, 0.6], [0.7, 0.3]]
    pi = [0.2, 0.3, 0.5]
    O = ['紅', '白', '紅', '紅', '白', '紅', '白', '白']
    o = np.zeros(T, np.int)
    for i in range(T):
        if O[i] == '白':
            o[i] = 1
        else:
            o[i] = 0
    PF, alpha = fore_algorithm(A, B, pi, o, T, N)
    PB, beta = back_algorithm(A, B, pi, o, T, N)
    print("PF:", PF, "PB:", PB)
    #P(i_4=q_3|O,\lambda) = alpah_4(3)* beta_4(3)
    P = alpha[4-1][3-1] * beta[4-1][3-1]
    print("前向後向概率計算可得 P(i4=q3|O,lambda)=", P / PF)

運行結果:
PF爲前向算法得到的P(Oλ)P(O|\lambda)
PB爲後向算法得到的P(Oλ)P(O|\lambda)
(改一下main函數中的輸出值,可以驗算一下第一題的結果)
在這裏插入圖片描述

10.3

題目

在習題10.1中,試用維特比算法求最優路徑

解答

(1)初始化
δ1(1)=π1b1(o1)=0.20.5=0.1\delta_1(1) = \pi_1*b_1(o_1)=0.2*0.5=0.1
δ1(2)=π2b2(o1)=0.40.4=0.16\delta_1(2) = \pi_2*b_2(o_1)=0.4*0.4=0.16
δ1(3)=π3b3(o1)=0.40.7=0.28\delta_1(3) = \pi_3*b_3(o_1)=0.4*0.7=0.28

(2)遞推
δt(i)=max1jN[δt1(j)aji]bi(ot)\delta_t(i) = max_{1\leq j\leq N}[\delta_{t-1}(j)a_{ji}]b_i(o_t)

t = 2
δ2(1)=max{0.10.5,0.160.3,0.280.2}0.5=0.028;ψ2(1)=3\delta_2(1) = max\{0.1*0.5, 0.16*0.3, 0.28*0.2\}*0.5 = 0.028; \quad\psi_2(1) = 3
δ2(2)=max{0.10.2,0.160.5,0.280.3}0.6=0.0504;ψ2(2)=3\delta_2(2) = max\{0.1*0.2, 0.16*0.5, 0.28*0.3\}*0.6 = 0.0504;\quad\psi_2(2) = 3
δ2(3)=max{0.10.3,0.160.2,0.280.5}0.3=0.042;ψ2(3)=3\delta_2(3) = max\{0.1*0.3, 0.16*0.2, 0.28*0.5\}*0.3 = 0.042;\quad\psi_2(3) = 3

t=3
δ3(1)=max{0.0280.5,0.05040.3,0.0420.2}0.5=0.00756;ψ3(1)=2\delta_3(1) = max\{0.028*0.5, 0.0504*0.3, 0.042*0.2\}*0.5 = 0.00756; \quad\psi_3(1) = 2
δ3(2)=max{0.0280.2,0.05040.5,0.0420.3}0.4=0.01008;ψ3(2)=2\delta_3(2) = max\{0.028*0.2, 0.0504*0.5, 0.042*0.3\}*0.4 = 0.01008; \quad\psi_3(2) = 2
δ3(3)=max{0.0280.3,0.05040.2,0.0420.5}0.7=0.0147;ψ3(3)=3\delta_3(3) = max\{0.028*0.3, 0.0504*0.2, 0.042*0.5\}*0.7 = 0.0147; \quad\psi_3(3) = 3

t=4
δ4(1)=max{0.007560.5,0.010080.3,0.01470.2}0.5=0.00189;ψ4(1)=1\delta_4(1) = max\{0.00756*0.5, 0.01008*0.3, 0.0147*0.2\}*0.5 = 0.00189; \quad\psi_4(1) = 1
δ4(2)=max{0.007560.2,0.010080.5,0.01470.3}0.6=0.003024;ψ4(2)=2\delta_4(2) = max\{0.00756*0.2, 0.01008*0.5, 0.0147*0.3\}*0.6 = 0.003024;\quad\psi_4(2) = 2
δ4(3)=max{0.007560.3,0.010080.2,0.01470.5}0.3=0.002205;ψ4(3)=3\delta_4(3) = max\{0.00756*0.3, 0.01008*0.2, 0.0147*0.5\}*0.3 = 0.002205;\quad\psi_4(3) = 3

(3)終止
P=max1i3δ4(i)=0.003024P^*=max_{1\leq i\leq 3}\delta_4(i) = 0.003024
i4=argmaxi[δ4(i)]=2i_4^*=argmax_i[\delta_4(i)] = 2

(4)最優路徑回溯
i3=ψ4(i4)=2i_3^*=\psi_4(i_4^*) = 2
i2=ψ3(i3)=2i_2^*=\psi_3(i_3^*) = 2
i1=ψ2(i2)=3i_1^*=\psi_2(i_2^*) = 3

I=(i1,i2,i3,i4)=(3,2,2,2)I^*=(i_1^*,i_2^*,i_3^*,i_4^*)=(3,2,2,2)
用代碼驗算一下~~

import numpy as np

def viterbi(A, B, pai, o, T, N):
    a = []
    i_star = np.zeros(T, np.int)
    # 初始化
    delta = np.zeros((T, N))
    psi = np.zeros((T, N), np.int)

    for i in range(N):
        delta[0][i] = pai[i] * B[i][o[0]]
        psi[0][i] = 0

    # 遞推
    for t in range(T-1):
        t = t + 1
        for i in range(N):
            for j in range(N):
                a.append(delta[t-1][j] * A[j][i])
            delta[t][i] = np.max(a) * B[i][o[t]]
            psi[t][i] = np.argmax(a, axis=0)
            a = []
    psi = psi + 1

    # 終止
    P_star = np.max(delta[T-1])
    i_star[T-1] = np.argmax(delta[T-1], axis=0) +1

    # 最優路徑回溯
    for t in range(T-1):
        t = T - t - 2
        a = t + 1
        b = i_star[t+1]-1
        i_star[t] = psi[a][b]

    return i_star, P_star

if __name__ == "__main__":
    T = 4
    N = 3
    O = ['紅', '白', '紅', '白']
    A = [[0.5, 0.2, 0.3],
         [0.3, 0.5, 0.2],
         [0.2, 0.3, 0.5]]
    B = [[0.5, 0.5],
         [0.4, 0.6],
         [0.7, 0.3]]
    p_i = [0.2, 0.4, 0.4]
    o = np.zeros(T, np.int)
    for i in range(T):
        if O[i] == '白':
            o[i] = 1
        else:
            o[i] = 0
    I, P = viterbi(A, B, p_i, o, T, N)
    print('最優路徑: ')
    print(I)
    print('最優路徑的概率:')
    print(P)

運行結果:
在這裏插入圖片描述

10.4

題目

試用前向概率和後向概率推導

P(Oλ)=i=1Nj=1Nαt(i)aijbj(ot+1)βt+1(j),t=1,2,...,T1P(O|\lambda) = \sum^N_{i=1}\sum^N_{j=1}\alpha_t(i)a_{ij}b_j(o_{t+1})\beta_{t+1}(j), t=1,2,...,T-1
這個式子是在書中的公式(10.21),書上是用前向概率和後向概率文字推導得出,αt(i)aijbj(ot+1)βt+1(j)\alpha_t(i)a_{ij}b_j(o_{t+1})\beta_{t+1}(j)等價於p(o1,o2,...,oT,it=qi,it+1=qjλ)p(o_1,o_2,...,o_T,i_t=q_i,i_{t+1}=q_j|\lambda),兩次求和則qi,qjq_i,q_j取到所有可能的情況。
詳細的數學證明可以參考:https://blog.csdn.net/weixin_35479108/article/details/87907429
這裏補充一個數學歸納法的證明
(1)t = 1
P(Oλ)=i=1Ni=1Nα1(i)aijbj(o2)β2(j)=i=1Nα1(i)i=1Naijbj(o2)β2(j)=i=1Nα1(i)β1(i)=i=1Nπibi(o1)β1(i)P(O|\lambda)\\ = \sum^N_{i=1}\sum^N_{i=1}\alpha_1(i)a_{ij}b_j(o_2)\beta_{2}(j)\\=\sum^N_{i=1}\alpha_1(i)\sum^N_{i=1}a_{ij}b_j(o_2)\beta_{2}(j)\\=\sum^N_{i=1}\alpha_1(i)\beta_1(i)\\=\sum^N_{i=1}\pi_ib_i(o_1)\beta_1(i)
這個即爲公式(10.21),後向算法的定義式,滿足條件
(2)假設t=k時等式成立(t = 1,2,…T-2)
P(Oλ)=i=1Nj=1Nαk(i)aijbj(ok+1)βk+1(j)P(O|\lambda) = \sum^N_{i=1}\sum^N_{j=1}\alpha_k(i)a_{ij}b_j(o_{k+1})\beta_{k+1}(j)
那麼對於t=k+1,有
i=1Nj=1Nαk+1(i)aijbj(ok+2)βk+2(j)=i=1Nαk+1(i)j=1Naijbj(ok+2)βk+2(j)=i=1Nαk+1(i)βk+1(i)=i=1Nβk+1(i)[j=1Nαk(j)aij]bi(ok+1)=i=1Nj=1Nαk(i)aijbj(ok+1)βk+1(j)=P(Oλ)\sum^N_{i=1}\sum^N_{j=1}\alpha_{k+1}(i)a_{ij}b_j(o_{k+2})\beta_{k+2}(j)\\=\sum^N_{i=1}\alpha_{k+1}(i)\sum^N_{j=1}a_{ij}b_j(o_{k+2})\beta_{k+2}(j)\\=\sum^N_{i=1}\alpha_{k+1}(i)\beta_{k+1}(i)\\=\sum^N_{i=1}\beta_{k+1}(i)[\sum_{j=1}^N\alpha_k(j)a_{ij}]b_i(o_{k+1})\\=\sum^N_{i=1}\sum^N_{j=1}\alpha_k(i)a_{ij}b_j(o_{k+1})\beta_{k+1}(j)\\=P(O|\lambda)

得證

解答

10.5

題目

比較維特比算法中變量δ\delta的計算和前向算法中變量α\alpha的計算的主要區別.

解答

計算變量α\alpha的時候直接對上個的結果進行數值計算,而計算變量δ\delta需要在上個結果計算的基礎上選擇最大值。

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