這一篇文章延續了上一篇IA9a的內容,但側重在 python 的實作,所以所有的節數、圖案以及公式編號都會依照IA9a的編號接序下來,所以重複的內容就直接引用,不在這裡重新贅述。 四、實作EM 4.1 高斯混合分佈 讓我們從1.1節的協方差矩陣開始,生成的圖形就如圖4 (腳本內加了seed random方便我們每次追蹤),另外也看到了執行5次K-means算法後 (再多次也不會變了) 得到的分群結果如圖5,這顯然與我們的預期有極大的落差! 但我們將按照3.3結給出EM算法的偽代碼,假設資料群是高斯混合分佈的形式,重新執行一遍分群,我們將看到EM算法能很好的分出我們預期的兩群的結果。我們預計會有兩群,所以\(k=1,2\),且第一步需要初始化參數組\(\boldsymbol{\theta}=\{\mu_k,\Sigma_k,\pi_k\}\)。初始化的過程是給定一個起始點,原則上隨機選擇的方式是合理的,不過為了計算上方便,可以讓初始的協方差矩陣都為單位矩陣,\(\pi_k\)則為每個群均分 (這裡就是每個都是0.5),如下代碼 # Initializing parameters sigma1,sigma2 = np.eye(2),np.eye(2) pi1 = 0.5 pi2 = 1-pi1 N = len(cluster) 完成初始的參數選擇後,我們用偽代碼的第二步,也就是E-step計算置信度\(\gamma (z_{nk})\)。這裡我將Eq. (10)列出來方便解說 \[ \gamma (z_{nk})=\frac{\pi_k \mathcal{N}(\mathbf{x}|\mu_k,\Sigma_k)}{\sum_{k=1}^2 \pi_k \mathcal{N}(\mathbf{x}|\mu_k,\Sigma_k)}\tag{10}. \] 因為我們是假設兩群都是高斯分佈,所以對第一個群而言的分子就是 # Starting E-step: Calculating responsibilities # Numerator for k=1 k1 = pi1*multivariate_normal.pdf(cluster,p1,sigma1) 直接透過 python 腳本我們很容易理解了分子的意義便是計算每個資料點分別對應到\(\{