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。第二...