簡單易學的機器學習演算法——EM演算法
阿新 • • 發佈:2022-05-04
一、機器學習中的引數估計問題
二、EM演算法簡介
在上述存在隱變數的問題中,不能直接通過極大似然估計求出模型中的引數,EM演算法是一種解決存在隱含變數優化問題的有效方法。EM演算法是期望極大(Expectation Maximization)演算法的簡稱,EM演算法是一種迭代型的演算法,在每一次的迭代過程中,主要分為兩步:即求期望(Expectation)步驟和最大化(Maximization)步驟。
三、EM演算法推導的準備
注:若函式
是凹函式,上述的符號相反。
3、數學期望
四、EM演算法的求解過程
五、EM演算法的收斂性保證
六、利用EM演算法引數求解例項
Python程式碼
#coding:UTF-8 ''' Created on 2015年6月7日 @author: zhaozhiyong ''' from __future__ import division from numpy import * import math as mt #首先生成一些用於測試的樣本 #指定兩個高斯分佈的引數,這兩個高斯分佈的方差相同 sigma = 6 miu_1 = 40 miu_2 = 20 #隨機均勻選擇兩個高斯分佈,用於生成樣本值 N = 1000 X = zeros((1, N)) for i in xrange(N): if random.random() > 0.5:#使用的是numpy模組中的random X[0, i] = random.randn() * sigma + miu_1 else: X[0, i] = random.randn() * sigma + miu_2 #上述步驟已經生成樣本 #對生成的樣本,使用EM演算法計算其均值miu #取miu的初始值 k = 2 miu = random.random((1, k)) #miu = mat([40.0, 20.0]) Expectations = zeros((N, k)) for step in xrange(1000):#設定迭代次數 #步驟1,計算期望 for i in xrange(N): #計算分母 denominator = 0 for j in xrange(k): denominator = denominator + mt.exp(-1 / (2 * sigma ** 2) * (X[0, i] - miu[0, j]) ** 2) #計算分子 for j in xrange(k): numerator = mt.exp(-1 / (2 * sigma ** 2) * (X[0, i] - miu[0, j]) ** 2) Expectations[i, j] = numerator / denominator #步驟2,求期望的最大 #oldMiu = miu oldMiu = zeros((1, k)) for j in xrange(k): oldMiu[0, j] = miu[0, j] numerator = 0 denominator = 0 for i in xrange(N): numerator = numerator + Expectations[i, j] * X[0, i] denominator = denominator + Expectations[i, j] miu[0, j] = numerator / denominator #判斷是否滿足要求 epsilon = 0.0001 if sum(abs(miu - oldMiu)) < epsilon: break print step print miu print miu
最終結果
[[ 40.49487592 19.96497512]]
參考文章:
1、(EM演算法)The EM Algorithm (http://www.cnblogs.com/jerrylead/archive/2011/04/06/2006936.html)
2、數學期望(http://wenku.baidu.com/view/915a9c1ec5da50e2524d7f08.html?re=view)