Expectation Maximization Algorithm
EM算法和之前學(xué)的都不太一樣,EM算法更多的是一種思想筑凫,所以后面用幾個例子講解滓技,同時也會重點(diǎn)講解GMM高斯混合模型令漂。
①極大似然估計(jì)
極大似然估計(jì)這里面用的比較多荚孵。假設(shè)我們想要知道我們學(xué)生身高的分布收叶,首先先假設(shè)這些學(xué)生都是符合高斯分布我們要做的就是要估計(jì)這兩個參數(shù)到底是多少。學(xué)生這么多哆致,挨個挨個來肯定是不切實(shí)際的摊阀,所以自然就是抽樣了胞此。
為了統(tǒng)計(jì)學(xué)生身高,我們抽樣200個人組成樣本
我們需要估計(jì)的參數(shù)首先估計(jì)一下抽到這兩百人的概率一共是多少酣胀,抽到男生A的概率
抽到學(xué)生B的概率
所以同時抽到這兩個學(xué)生的概率就是
那么同時抽到這200個學(xué)生的G概率
最后再取一個對數(shù)就好了:
notation和log
上面有一條公式里面是同時存在了;和|,這兩個符號差別其實(shí)有點(diǎn)大的铆农。|一般我們是用來表示條件概率墩剖,比如
就是表示x在θ的條件下發(fā)生的概率涛碑。
也是一個意思。
分號;表示的就是表示后面的是待估計(jì)的參數(shù)揉阎,也就是說P(x;θ)意思就是后面的θ是需要估計(jì)的參數(shù)而不是條件毙籽,所以|也有另一層意思烙如,如果不是表示條件概率亚铁,那么就是表示后面有待估計(jì)參數(shù)徘溢。
當(dāng)然是在|不表示條件概率的情況下。
這兩種表示法是源于兩種學(xué)派的不同理解:
頻率派認(rèn)為參數(shù)為固定的值曾雕,是指真實(shí)世界中剖张,參數(shù)值就是某個定值修械。
貝葉斯派認(rèn)為參數(shù)是隨機(jī)變量,是指取這個值是有一定概率的吨枉。當(dāng)然貌亭,無論是;還是|,他們都是表示條件概率的意思剧腻,只不過這兩個學(xué)派理解不一樣而已书在。
notation的問題解決了之后就是log的問題了栏账,為什么需要log化挡爵,講道理了讨,是不需要的。但是求log有這么幾個好處:
1.計(jì)算簡單男杈,累乘是很難計(jì)算的伶棒,log之后可以變換成累加肤无。
2.概率累乘是會出現(xiàn)數(shù)字非常小的情況,log之后就可以避免這種情況窥翩。
3.log之后函數(shù)的梯度方向是沒有變化的寇蚊,對于函數(shù)優(yōu)化的方向影響很小仗岸。
似然函數(shù)的執(zhí)行步驟:
1.得到似然函數(shù)
2.取對數(shù)整理
3.求導(dǎo)數(shù)右犹,另導(dǎo)數(shù)為零
4.解方程得到解
②Jensen不等式
首先引出凸函數(shù)的概念那么就是凸函數(shù)念链,所以它的圖像就是一個勾形的掂墓,看起來是一個凹函數(shù),實(shí)際上是凸函數(shù)吃嘿。
凸函數(shù)的性質(zhì)很顯而易見了
其實(shí)很明顯的,看圖就知道了降瞳,E(x)其實(shí)就是a到b的平均值挣饥,上面的結(jié)論很容易證實(shí)。那么如果想要取到等號锹安,需要改變上面搓侄?取等號的意思就是相切,相切的意思就是a = b泊交,既然a = b了,那么x自然就是常數(shù)了云石,所以當(dāng)且僅當(dāng)
③EM算法的推導(dǎo)
正常來看先是要引入一個最大似然函數(shù):但這樣其實(shí)是和難求的铅乡,P(x|θ)完全混在了一起阵幸,根本求不出來,所以我們要引入一個輔助變量z咬腕。
隱變量Z
隱變量是觀測不到的涨共,比如做一個抽樣,從3個袋子里面抽取小球扒吁。而抽取這些小球的過程是不可見的魁索,抽取的過程其實(shí)就是隱變量粗蔚,而這些隱變量致扯,也就是過程可以告訴我們這個x是從哪個袋子來的抖僵,由此來區(qū)分耍群。這個隱變量和HMM里面的隱含序列不是一個東西,隱含序列是當(dāng)前x的狀態(tài)呻征,而不是抽取x的過程沐祷。所以在這里赖临,通俗點(diǎn)講兢榨,這個z就是用來找到x的組類的,也就是說z來告訴這個x你是屬于哪一組的吟逝。
另外需要注意的是块攒,隱變量是不可以隨便添加的囱井,添加隱變量之后不能影響邊緣概率。也就是說千扶,原來是P(x)澎羞,添加之后就是P(x,z)妆绞,那么必須有:
所以我們引入隱變量的原因是為了轉(zhuǎn)化成和這幾個高斯模型相關(guān)的式子括饶,否則無從下手”钠化簡一下上式子:既然z可以指定x藤滥,那么我們只需要求解出z就好了拙绊。
注意上面凸函數(shù)所提到的一個期望性質(zhì)标沪,這里就可以使用了谨娜。因?yàn)殡m然優(yōu)化了上面的式子趴梢,還是不能求出來,因?yàn)閦變量實(shí)在是太抽象了彰阴,找不到一個合適的公式來表示它尿这。EM的一個方法就是用優(yōu)化下界函數(shù)的方法來達(dá)到優(yōu)化目標(biāo)函數(shù)的目的射众。
既然z很抽象典蜕,那么我們就需要一個轉(zhuǎn)變一下愉舔。對于每一個樣例x都會對應(yīng)一個z轩缤,那么假設(shè)一個分布Q(z)是滿足了z的分布的,而Q(z)滿足的條件是Qi意味著每一個x對應(yīng)的z都會對應(yīng)著一個Q了卫玖,這里有點(diǎn)復(fù)雜假瞬,再詳細(xì)解釋一下脱茉。一個x對應(yīng)一組z,z是一個向量溉躲,但是每一個z又會分別對應(yīng)一個一個分布Q锻梳。以為最后得到的z不會是一個數(shù)字疑枯,而是一個概率国章,也就是說Q(z)得到的是這個x樣例屬于這個類別的概率是多少你画。而z的數(shù)量适滓,一個是當(dāng)前有多少個分布混合在一起的數(shù)量。
再梳理一下:現(xiàn)在的樣本是xi撕彤,那么每一個xi將會對應(yīng)著一組的z麻蹋,每一個xi同時也會對應(yīng)著一個分布Qi专肪,z其實(shí)就是反應(yīng)了這個樣本是來自于哪個分布的。比如這個x是A1分布做了3咕晋,A2分布做了5质蕉,那么z可能就是={3,5}兑宇。所以Qi(z)得到的是這個x屬于這些個分布的概率,也就是說這些分布對x做了多少百分比的功,自然就是要等于1了。
還要注意的是,上面的這個并不能得到Qi(z)就是分布對x做了多少功的結(jié)論,得到這個結(jié)論是后面下界函數(shù)與目標(biāo)函數(shù)相等得到的壹士。這里只是知道了總和等于1,因?yàn)槭欠植嫉目偤吐铩?/strong>
現(xiàn)在就到了公式的化簡:
仔細(xì)看一下這個式子這個式子其實(shí)就是求
的期望苞慢,假設(shè)
辑畦,那么可以利用上面
潦刃。于是化簡:
這個時候就得到了下界函數(shù)胧洒,上面也講過了肾砂,想要相等源葫,自然就是x要是常數(shù),所以
既然
即硼,而且z也是一樣的,因?yàn)橐粋€樣本嘛僻澎。所以上下加和(如果是離散的窟勃,那就sum一下秉氧,連續(xù)的那就積分汁咏,這里是離散的攘滩,所以就是sum一下)漂问。于是有
于是有:
所以Q(z)計(jì)算的是后驗(yàn)概率。計(jì)算在當(dāng)前參數(shù)θ和已經(jīng)抽樣到x的條件下勤哗,這個x是從z來的概率。其實(shí)就是z對x做了多少貢獻(xiàn)疮鲫。
所以整個EM算法步驟就很清晰了:
EM算法計(jì)算步驟:
E-step:
對于每一個者祖,求
M-step:
這時候就可以使用求導(dǎo)迭代的方法求解了。
這就是整一個EM算法的框架了皮仁,可以看到其實(shí)沒有比較具體的算法谣蠢,大致上就是一個框架册烈。那么問題來了,怎么樣證明這東西是一個收斂的巨坊?究珊?
證明EM算法的收斂性
既然是極大似然估計(jì)瞬浓,那么需要證明的自然就是
宪躯,也就是說極大似然估計(jì)要單調(diào)遞增精置。因?yàn)槊恳淮味际菢O大火欧,那么隨著時間增加霎俩,自然就是要增大的了。
當(dāng)給定一個的時候,相當(dāng)于t時間的EM算法進(jìn)行了E步了贷揽,所以有:
然后就走M(jìn)步,M步之前還沒有求最大,所以:
這一步有點(diǎn)復(fù)雜回还,這里是M-step了闻葵,
是L(θ)求極大值得到的憎夷,而最重要的是L和后面下界函數(shù)的關(guān)系饮焦。這兩個東西是不相等的,下界函數(shù)等于目標(biāo)函數(shù)的條件是x為constant毯炮,x == constant意味著Q得求出來蛋叼,這里看這個Q貌似是出來了,但是這個Q是
,是上一個時刻的匣吊,而不是這個時刻的淀歇,所以t+1時刻Q還沒有被固定住掸哑,也就是沒有滿足x == constant的條件琢岩,所以下界函數(shù)小于等于目標(biāo)函數(shù)拼坎。接下來就簡單了赂摆,直接把
換成
就好了逊朽。
這樣就證明了收斂性渐逃。
EM algorithm的優(yōu)化方法:
之前討論過舶衬,這種方法是迭代朵栖,使用極大似然估計(jì)和迭代的方法來進(jìn)行優(yōu)化坑质,但實(shí)際上這更像是一種坐標(biāo)上升的方法:
一次固定一個變量驻仅,對另外的求極值昧碉,最后逐步逼近極值今妄。對應(yīng)到EM上受神,E步:固定 θ排吴,優(yōu)化Q;M步:固定 Q缰儿,優(yōu)化 θ;交替將極值推向極大勺美。Kmeans也是這樣更新的叭喜,固定中心點(diǎn)着倾,優(yōu)化Ein;優(yōu)化完成泣棋,更新中心點(diǎn)修赞。SMO也是,固定更新α1和α2荔泳。
④GMM的推導(dǎo)
可以直接把高斯混合模型代入EM框架里面沾鳄。
存在多個高斯分布混合生成了一堆數(shù)據(jù)X吞歼,取各個高斯分布的概率是糯俗,第i個高斯分布的均值是
淘正,方差是
惩淳,求法φ,μ含蓉,σ差油。
按照套路刃鳄,第一個E-step求出Q,于是有:
意思就是求出第i個樣本屬于第j個分布的概率是多少。之后就是M-step了伦忠,就是化簡了:
這里可能需要解釋一下,根據(jù)至于條件,因?yàn)楹苊黠@赋咽,z是隱變量旧噪,只是指明了x是屬于哪個類別,和μ脓匿,Σ沒有什么關(guān)系淘钟,所以直接忽略那兩個參數(shù)了,所以P(z)是沒有那兩個參數(shù)的陪毡,z是代表了分布米母,所以每一個分布的概率肯定是包括了,所以就只有一個概率的參數(shù)毡琉。P(x|z)是本身的概率铁瞒,就是已經(jīng)知道分布是那個了,求屬于這個分布的概率是多少桅滋,既然已經(jīng)選定了分布那么自然就不需要再看φ了慧耍,因?yàn)棣帐歉鱾€分布的概率。
之后就是求導(dǎo)數(shù)了:
導(dǎo)數(shù)等于0丐谋,于是有:
對于φ,那就簡單了笋鄙,實(shí)際上需要優(yōu)化的式子:
要注意的是φ還有一個條件:
接著求導(dǎo)
Σ也是一樣:
這樣整個推導(dǎo)就算結(jié)束了袁余。
⑤硬幣模型
現(xiàn)在有兩個硬幣AB擎勘,進(jìn)行5次試驗(yàn)每一次投10次,并不知道是哪個硬幣投的颖榜,求兩種硬幣的正面的概率棚饵。
首先E-step:
首先先初始化一下煤裙,
第一個試驗(yàn)選中A的概率:
同樣求得
計(jì)算機(jī)出每一個試驗(yàn)的概率然后相加求均值。
之后就是M-step了:
⑥代碼實(shí)現(xiàn)
方差的求解就不玩了欣硼,主要就是迭代求解μ和φ的值了题翰。
首先是生成數(shù)據(jù),4個高斯分布分别,每一個高斯分布的sigma都是一樣的遍愿,不一樣的只有μ和α,也就是φ耘斩,習(xí)慣上把前面的一個參數(shù)叫做權(quán)值沼填,所以用α來表示。
def generate_data(sigma, N, mu1, mu2, mu3, mu4, alpha):
global X
X = np.zeros((N, 2))
X = np.matrix(X)
global mu
mu = np.random.random((4, 2))
mu = np.matrix(mu)
global expect
expect = np.zeros((N, 4))
global alphas
alphas = [0.25, 0.25, 0.25, 0.25]
for i in range(N):
if np.random.random(1) < 0.1:
X[i, :] = np.random.multivariate_normal(mu1, sigma, 1)
elif 0.1 <= np.random.random(1) < 0.3:
X[i, :] = np.random.multivariate_normal(mu2, sigma, 1)
elif 0.3 <= np.random.random(1) < 0.6:
X[i, :] = np.random.multivariate_normal(mu3, sigma, 1)
else:
X[i, :] = np.random.multivariate_normal(mu4, sigma, 1)
plt.title('Generator')
plt.scatter(X[:, 0].tolist(), X[:, 1].tolist(), c = 'b')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()
這四個模型的比例分別是1:2:3:4括授,使用EM來找到他們屬于的類別坞笙。
其實(shí)如果用kmeans聚類的話更加快速,但是這里還是用EM荚虚。
E-step:
def e_step(sigma, k, N):
global X
global mu
global expect
global alphas
for i in range(N):
W = 0
for j in range(k):
W += alphas[j] * math.exp(-(X[i, :] - mu[j, :]) * sigma.I * np.transpose(X[i, :] - mu[j, :])) / np.sqrt(np.linalg.det(sigma))
for j in range(k):
w = math.exp(-(X[i, :] - mu[j, :]) * sigma.I * np.transpose(X[i, :] - mu[j, :])) / np.sqrt(np.linalg.det(sigma))
expect[i, j] = alphas[j]*w/W
pass
就是按照公式來求解w即可薛夜,求解每一個分布對樣本點(diǎn)做了多少的功,之后求單個樣本點(diǎn)求比例版述。
M-step:
def m_step(k, N):
global expect
global X
global alphas
for j in range(k):
mathor = 0
son = 0
for i in range(N):
son += expect[i, j]*X[i, :]
mathor += expect[i, j]
mu[j, :] = son / mathor
alphas[j] = mathor / N
直接按照公式優(yōu)化即可梯澜。
if __name__ == '__main__':
iterNum = 1000
N = 500
k = 4
probility = np.zeros(N)
mu1 = [5, 35]
mu2 = [30, 40]
mu3 = [20, 20]
mu4 = [45, 15]
sigma = np.matrix([[30, 0], [0, 30]])
alpha = [0.1, 0.2, 0.3, 0.4]
generate_data(sigma, N, mu1, mu2, mu3, mu4, alpha)
for i in range(iterNum):
print('iterNum : ', i)
err = 0
err_alpha = 0
Old_mu = copy.deepcopy(mu)
Old_alpha = copy.deepcopy(alphas)
e_step(sigma, k, N)
m_step(k, N)
for z in range(k):
err += (abs(Old_mu[z, 0] - mu[z, 0]) + abs(Old_mu[z, 1] - mu[z, 1]))
err_alpha += abs(Old_alpha[z] - alphas[z])
if (err <= 0.001) and (err_alpha < 0.001):
print(err, err_alpha)
break
color = ['blue', 'red', 'yellow', 'green']
markers = ['<', 'x', 'o', '>']
order = np.zeros(N)
for i in range(N):
for j in range(k):
if expect[i, j] == max(expect[i, ]):
order[i] = j
plt.scatter(X[i, 0], X[i, 1], c = color[int(order[i])], alpha=0.5, marker=markers[int(order[i])])
plt.show()
print('standedμ:',mu4, mu3, mu2, mu1)
print('standedα:',alpha)
print('new μ:', mu)
print('new α:',alphas)
運(yùn)行函數(shù)】饰觯看看結(jié)果:
結(jié)果其實(shí)還是相差不大晚伙。達(dá)到預(yù)期。
⑦EM的另一種理解方法
上面所講的其實(shí)只是一種理解方法俭茧,在李航老師的統(tǒng)計(jì)學(xué)習(xí)方法里面是另一種比較厲害的解法:
1.E-step:求出Q函數(shù)咆疗。
2.M-step:利用Q函數(shù)求極大值。
其實(shí)這兩種方法是完全一樣的母债,Q函數(shù)就是下界函數(shù)午磁,
事實(shí)上兴猩,李航老師的Estep求出Q函數(shù)期吓,其實(shí)就是通俗理解里面的求出Q(z)并代入下界函數(shù)的過程。因?yàn)榍蟪鯭(z)就相當(dāng)于這個Q(z)被固定了倾芝,可以去掉了讨勤,于是就和李航老師的式子一樣了。有機(jī)會再補(bǔ)一些李航老師的推導(dǎo)蛀醉,勃大精深悬襟。
⑧總結(jié)
EM和Kmeans算法其實(shí)很類似,事實(shí)上步驟基本可以用EM框架來替換拯刁,但是Kmeans算法是硬分類脊岳,說一不二,但是EM算法不太一樣垛玻,是軟分類割捅,百分之幾是那個,百分之幾是這個帚桩。
缺點(diǎn)也還是有的:初值敏感亿驾,局部最優(yōu)。因?yàn)榇嬖诹穗[變量账嚎,所以導(dǎo)致了直接對x做極大似然是不可行的莫瞬,log已經(jīng)在sum的外面了儡蔓。所以EM算法就轉(zhuǎn)向了下界函數(shù),而這種方法本來就不保證找到局部最優(yōu)解疼邀。
如果將樣本看作觀察值喂江,潛在類別看作是隱藏變量,那么聚類問題也就是參數(shù)估計(jì)問題旁振。如果一個目標(biāo)函數(shù)存在多個變量获询,那么梯度下降牛頓法這些逼近方法就用不了了。但我們可以使用坐標(biāo)上升方法拐袜,固定一個變量吉嚣,對另外一個求導(dǎo)數(shù),然后替換最后逐步逼近極值點(diǎn)蹬铺。對應(yīng)到EM算法也是一樣尝哆,E步求隱含的z變量,Mstep求解其他參數(shù)丛塌。
最后符上GitHub代碼: