機器學習 EM實踐

2021-10-24 02:35:00 字數 3109 閱讀 7620

import numpy as np

from scipy.stats import multivariate_normal

from sklearn.mixture import gaussianmixture

from mpl_toolkits.mplot3d import axes3d

from sklearn.metrics.pairwise import pairwise_distances_argmin

# 構造一組資料,data1 data2服從不同的高斯分布

np.random.seed(0)

mu1_fact =(0

,0,0

)cov1_fact = np.diag((1

,2,3

))data1 = np.random.multivariate_normal(mu1_fact, cov1_fact,

400)

mu2_fact =(2

,2,1

)cov2_fact = np.array(((

1,1,

3),(

1,2,

1),(

0,0,

1)))

data2 = np.random.multivariate_normal(mu2_fact, cov2_fact,

100)

data = np.vstack(

(data1, data2)

)y = np.array(

[true]*

400+

[false]*

100)

# 利用sklearn.mixture中的gaussianmixture包進行gmm

g = gaussianmixture(n_components=

2, covariance_type=

'full'

, tol=1e-

6, max_iter=

1000

)g.fit(data)

print

('類別概率:\t'

, g.weights_[0]

)print

('均值:\n'

, g.means_,

'\n'

)print

('方差:\n'

, g.covariances_,

'\n'

)mu1, mu2 = g.means_

sigma1, sigma2 = g.covariances_

# 自己用**實現em演算法

num_iter =

100n, d = data.shape

# 初始化mu1 mu2 sigma1 sigma2 pi

mu1 = data.

min(axis=0)

mu2 = data.

max(axis=0)

sigma1 = np.identity(d)

sigma2 = np.identity(d)

pi =

0.5# em

# 進行100次迴圈

for i in

range

(num_iter)

:# e step

norm1 = multivariate_normal(mu1, sigma1)

norm2 = multivariate_normal(mu2, sigma2)

tau1 = pi * norm1.pdf(data)

tau2 =(1

- pi)

* norm2.pdf(data)

gamma = tau1 /

(tau1 + tau2)

# m step

mu1 = np.dot(gamma, data)

/ np.

sum(gamma)

mu2 = np.dot((1

- gamma)

, data)

/ np.

sum((1

- gamma)

) sigma1 = np.dot(gamma *

(data - mu1)

.t, data - mu1)

/ np.

sum(gamma)

sigma2 = np.dot((1

- gamma)

*(data - mu2)

.t, data - mu2)

/ np.

sum(

1- gamma)

pi = np.

sum(gamma)

/ n print

(i,":\t"

, mu1, mu2)

print

('類別概率:\t'

, pi)

print

('均值:\t'

, mu1, mu2)

print

('方差:\n'

, sigma1,

'\n\n'

, sigma2,

'\n'

)# **分類

norm1 = multivariate_normal(mu1, sigma1)

norm2 = multivariate_normal(mu2, sigma2)

tau1 = norm1.pdf(data)

tau2 = norm2.pdf(data)

# pairwise_distances_argmin返回目標最近的標籤值

order = pairwise_distances_argmin(

[mu1_fact, mu2_fact]

,[mu1, mu2]

, metric=

'euclidean'

)# 將順序相對應

if order[0]

==0: c1 = tau1 > tau2

else

: c1 = tau1 < tau2

c2 =

~c1# 求出準確率

acc = np.mean(y == c1)

print

(u'準確率:%.2f%%'%(

100*acc)

)

機器學習 EM演算法

em演算法 最大期望演算法 expectation maximization algorithm,em 是為處理缺失資料的引數的估計問題,主要分為e步和m步交替組成,對給定的初始引數依賴較大。from numpy import import numpy as np import matplotlib...

機器學習演算法 EM演算法

介紹 理論分析 現在,已經知道目標函式 似然函式 maxj p x 假設隱變數為z,那麼可以寫成j zp x z 我們假設當前的引數為 i 那麼可以得到 j j i logp x logp x i log zp x,z logp x i log z p z x,i p x z p z x,i log...

機器學習 EM演算法推導

有時,我們用極大似然的時候,公式中可能會有隱變數 l i 1m p yi i 1 m z p yi z i 1m zp z p y i z 也就是 y 取什麼值是由隱含的變數 z 決定的。舉個栗子 有三個硬幣,abc,先拋a,由a的正反面決定下一步拋 b 還是拋 c a是正面拋b,a是反面拋c。第二...