看理論之前先來【舉個例子】:
對於乙個未知引數的模型,我們觀測他的輸出,得到下圖這樣的直方圖:
我們先假設它是由兩個高斯分布混合疊加而成的,那麼我們該怎麼去得到這兩個高斯分布的引數呢?
em演算法!!
假設觀測資料 y1
,y2,
...,
yn是由高斯混合模型生成的。 p(
y|θ)
=∑k=
1kαk
θ(y|
θk)
其中,θ
= 。表示的是高斯模型的引數,em演算法也正是要用來估計高斯混合模型的這個引數。
還是以上面的例子來說,對於我們的觀測資料 yi
,i=1
,2,.
..,n
來說,該資料肯定是由分模型的資料疊加得到的。那麼我們設想 yi
是這樣產生的:
1> 首先依概率 αk
選擇第
k 個高斯模型 ϕ(
y|θk
); 2> 然後依第
k 個分模型的概率分布 ϕ(
y|θk
)生成觀測資料。
這時候觀測資料是已知的,反應觀測資料yj
來自第k 個分模型的資料是未知的,k=
1,2,
...,
k, 以隱變數 γj
k 來表示。
可以得到完全似然函式:
γjk 和 ∑n
j=1e
γjk 替換,得到q函式。eγ
jk表示分模型
k 對觀測資料yj
的響應度。
迭代m步就是求函式q(
θ,θ(
i)) 對
θ 的極大值,即求新一輪迭代的模型引數: θ(
i+1)
=arg
maxθ
q(θ,
θ(i)
) 每一次迭代中引數計算公式表示可得到:
最終迭代計算到引數沒有明顯的變化時為止。
例項**:
import math
import copy
import numpy as np
import matplotlib.pyplot as plt
isdebug = false
# 指定k個高斯分布引數,這裡k=2。2個高斯分布具有相同均方差sigma,均值分別為mu1,mu2。
defini_data
(sigma,mu1,mu2,k,n):
global x
global mu
global expectations
x = np.zeros((1,n))
mu = np.random.random(2)
expectations = np.zeros((n,k))
for i in xrange(0,n):
if np.random.random(1) > 0.5:
x[0,i] = np.random.normal()*sigma + mu1
else:
x[0,i] = np.random.normal()*sigma + mu2
if isdebug:
print
"***********"
print
u"初始觀測資料x:"
print x
# em演算法:步驟1,計算e[zij]
defe_step
(sigma,k,n):
global expectations
global mu
global x
for i in xrange(0,n):
denom = 0
for j in xrange(0,k):
denom += math.exp((-1/(2*(float(sigma**2))))*(float(x[0,i]-mu[j]))**2)
for j in xrange(0,k):
numer = math.exp((-1/(2*(float(sigma**2))))*(float(x[0,i]-mu[j]))**2)
expectations[i,j] = numer / denom
if isdebug:
print
"***********"
print
u"隱藏變數e(z):"
print expectations
# em演算法:步驟2,求最大化e[zij]的引數mu
defm_step
(k,n):
global expectations
global x
for j in xrange(0,k):
numer = 0
denom = 0
for i in xrange(0,n):
numer += expectations[i,j]*x[0,i]
denom +=expectations[i,j]
mu[j] = numer / denom
# 演算法迭代iter_num次,或達到精度epsilon停止迭代
defrun
(sigma,mu1,mu2,k,n,iter_num,epsilon):
ini_data(sigma,mu1,mu2,k,n)
print
u"初始:", mu
for i in range(iter_num):
old_mu = copy.deepcopy(mu)
e_step(sigma,k,n)
m_step(k,n)
print i,mu
if sum(abs(mu-old_mu)) < epsilon:
break
if __name__ == '__main__':
run(6,40,20,2,1000,1000,0.0001)
plt.hist(x[0,:],50)
plt.show()
機器學習 高斯混合模型引數估計的EM演算法
看理論之前先來 舉個例子 對於乙個未知引數的模型,我們觀測他的輸出,得到下圖這樣的直方圖 我們先假設它是由兩個高斯分布混合疊加而成的,那麼我們該怎麼去得到這兩個高斯分布的引數呢?em演算法!假設觀測資料 y1 y2,yn是由高斯混合模型生成的。p y k 1k k y k 其中,表示的是高斯模型的引...
機器學習之引數估計
引數估計 parameter estimate 就是通過一系列演算法,來求出模型的最優引數。在各個機器學習深度學習的框架裡,都變成了optimizer的活了。其實這個名字很奇怪,但是在比較早的機器學習 裡都是這麼叫的,我們重點來關注下裡面涉及的一些演算法。這裡主要關注的是 二乘是平方的意思,感覺最小...
引數估計 CIR模型的引數估計
cox ingersoll ross cir 模型是量化金融風控中,特別是在利率和信用風險的期限結構模型中經常用到的一種模型。與其他模型如ho lee,vasicek等相比,它的特點是其解總是非負的 如果滿足feller條件則以概率為1為正 並且滿足均值回歸性質。cir 的基本形式是如下的sde 其...