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

習題9.1

如例9.1的三硬幣模型.假設觀測數據不變,試選擇不同的初值,例如π0=0.46,p0=0.55,q0=0.67\pi^0=0.46, p^0=0.55,q^0=0.67求模型參數θ=(π,p,q)\theta=(\pi,p,q)的極大似然估計。
例9.1(三硬幣模型)假設有3枚硬幣,分別記作A,B,C.這些硬幣正面出現的概率分別是π,p和q.進行如下擲硬幣試驗:先擲硬幣A,根據其結果選出硬幣B或硬幣C,正面選硬幣B,反面選硬幣C;然後擲選出的硬幣,擲硬幣的結果,出現正面記作1,出現反面記作0;獨立地重複n次試驗(這裏,n=10),觀測結果如下:
1,1,0,1,0,0,1,0,1,1假設只能觀測到擲硬幣的結果,不能觀測擲硬幣的過程.問如何估計三硬幣正面出現的概率,即三硬幣模型的參數.
解答
在這裏插入圖片描述
由公式9.5得到
μj1={0.537yj=00.412yj=1\mu^1_j=\left\{\begin{matrix} 0.537\qquad y_j=0\\0.412\qquad y_j=1 \end{matrix}\right.
利用迭代公式9.6~9.8迭代
π1=0.462,p1=0.535,q1=0.656\pi^1=0.462,\quad p^1=0.535,\quad q^1=0.656
同理
μj2={0.537yj=00.412yj=1\mu^2_j=\left\{\begin{matrix} 0.537\qquad y_j=0\\0.412\qquad y_j=1 \end{matrix}\right.
π2=0.462,p2=0.535,q2=0.656\pi^2=0.462,\quad p^2=0.535,\quad q^2=0.656
得到模型參數θ\theta的極大似然估計
π^=0.462,p^=0.535,q^=0.656\hat{\pi}=0.462,\quad \hat p=0.535,\quad \hat q=0.656
代碼驗證一下

import numpy as np
theta = np.array([0.46, 0.55, 0.67])
Y = np.array([1,1,0,1,0,0,1,0,1,1])
mu = np.zeros(Y.shape[0])
print("初值爲pi=%f,p=%f,q=%f"%(theta[0], theta[1], theta[2]))
for j in range(2):
    print("第%d次迭代"%(j+1))
    # E step
    for i in range(Y.shape[0]):
        temp = theta[0]*theta[1]**Y[i]*(1-theta[1])**(1-Y[i])
        temp1 = (1 - theta[0])*theta[2]**Y[i]*(1-theta[2])**(1-Y[i])
        mu[i] = temp / (temp + temp1)
    print("mu=",mu)
    # M step
    theta[0] = 1.0 / Y.shape[0] * sum(mu)
    theta[1] = sum(mu * Y) / sum(mu)
    theta[2] = sum((1 - mu)*Y) / sum(1-mu)
    print("pi=%f,p=%f,q=%f" % (theta[0], theta[1], theta[2]))

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

習題9.2

證明引理9.2.
P~θ(Z)=P(ZY,θ)\tilde P_\theta(Z) = P(Z|Y,\theta),則F(P~,θ)=logP(Yθ)F(\tilde P,\theta)=logP(Y|\theta)
解答
F(P~,θ)=Ep[logP(Y,Zθ)]+H(P~)=Ep[logP(Y,Zθ)]EP~logP~(Z)=zP~θ(Z)logP(Y,Zθ)ZP~(Z)logP~(Z)=zP(ZY,θ)logP(Y,Zθ)ZP(ZY,θ)logP(ZY,θ)=zP(ZY,θ)logP(Y,Zθ)P(ZY,θ)=zP(ZY,θ)logP(Yθ)=logP(Yθ)F(\tilde P,\theta)\\=E_p[logP(Y,Z|\theta)]+H(\tilde P)\\=E_p[logP(Y,Z|\theta)]-E_{\tilde P}log\tilde P(Z)\\=\sum_z\tilde P_\theta(Z)logP(Y,Z|\theta)-\sum_Z\tilde P(Z)log\tilde P(Z)\\=\sum_zP(Z|Y,\theta)logP(Y,Z|\theta)-\sum_ZP(Z|Y,\theta)logP(Z|Y,\theta)\\=\sum_zP(Z|Y,\theta)log\frac{P(Y,Z|\theta)}{P(Z|Y,\theta)}\\=\sum_zP(Z|Y,\theta)logP(Y|\theta)\\=logP(Y|\theta)

習題9.3

已知觀測數據
-67,-48,6,8,14,16,23,24,28,29,41,49,56,60,75
試估計兩個分量的高斯混合模型的5個參數.
在這裏插入圖片描述
其中
在這裏插入圖片描述

解答
先簡單理一下題目的意思,這個模型由兩個高斯模型混合而成,5個參數指的是兩個高斯模型的參數μ0,σ0,μ1,σ1\mu_0,\sigma_0,\mu_1,\sigma_1,另外還有其對應的係數α0,α1(α0+α1=1)\alpha_0, \alpha_1(\alpha_0+\alpha_1=1),相當於只需要求一個係數。
初值設置爲σ=1.0,μ=0.5,α=0.5\sigma=1.0,\mu=0.5,\alpha=0.5

import numpy as np
from scipy.stats import norm

y = np.array([-67, -48, 6, 8, 14, 16, 23, 24, 28, 29, 41, 49, 56, 60, 75])
K = 2  # 兩個高斯
N = 15  # y有15個數據

# 參數初始化
mu = np.array([0.5, 0.5])
sigma = np.array([1.0, 1.0]) * 10
alpha = np.array([0.5, 0.5])

for i in range(10):
    gm = np.zeros((N, K))

    # E 步
    for j in range(N):
        for k in range(K):
            gm[j, k] = alpha[k] * norm(mu[k], sigma[k]).pdf(y[j]) #使用scipy實現高斯分佈
        gm[j, :] /= sum(gm[j, :])  # gm[j,:] = gm[j,:] /sum(gm[j,:])

    # M 步
    mu2 = y.dot(gm) / sum(gm)
    alpha2 = sum(gm) / N
    sigma2 = np.zeros((2,))
    sigma2[0] = sum(gm[:, 0] * (y - mu[0]) ** 2) / sum(gm[:, 0])
    sigma2[1] = sum(gm[:, 1] * (y - mu[1]) ** 2) / sum(gm[:, 1])
    #判斷是否收斂
    if sum((mu - mu2) ** 2 + (sigma - sigma2) ** 2 + (alpha - alpha2) ** 2) < 0.01:
        break

    mu = mu2
    sigma = sigma2
    alpha = alpha2
    print("第%d次迭代\nalpha_0=%f,mu_0=%f,sigma_0=%f\nalpha_1=%f,mu_1=%f,sigma_1=%f\n"
          %(i+1, alpha[0], mu[0], sigma[0], alpha[1], mu[1], sigma[1]))

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

習題9.4

EM算法可以用到樸素貝葉斯法的非監督學習.試寫出其算法.
參考Blog

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