學習筆記【機器學習重點與實戰】——12 EM演算法

1 EM演算法

之前章節的例項中都假設訓練樣本所有屬性變數的值都已被觀測到,即變數都是觀測變數(observable variable),訓練樣本是”完整”的。但在現實應用中往往會遇到”不完整”的訓練樣本,即存在未觀測變數(”隱變數” – hidden variable 或 latent variable)。 而EM演算法就可以處理這類含有隱變數樣本的問題。

EM演算法是一種迭代演算法,1977年由Dempster等人總結提出,用於含有隱變數的概率模型引數的極大似然估計,或極大後驗概率估計。EM演算法的每次迭代由兩步組成:E步,求期望(expectation);M步,求極大(maximization)。所以這一演算法稱為期望極大演算法(expectation maximization algorithm),簡稱EM演算法。

簡要來說, EM 演算法使用兩個步驟交替計算:第一步是期望 (E) 步,利用當前估計的引數值來計算對數似然的期望值;第二步是最大化 (M) 步,尋找能使 E 步產生的似然期望最大化的引數值。然後,新得到的引數值重新被用於 E 步,……直至收斂到區域性最優解。具體演算法流程如下:

輸入:觀測變數資料 Y” role=”presentation” style=”position: relative;”>YYY ,隱變數資料 Z” role=”presentation” style=”position: relative;”>ZZZ ,聯合分佈 P(Y,Z|θ)” role=”presentation” style=”position: relative;”>P(Y,Z|θ)P(Y,Z|θ)P(Y,Z|θ),條件分佈 P(Z|Y,θ)” role=”presentation” style=”position: relative;”>P(Z|Y,θ)P(Z|Y,θ)P(Z|Y,θ);

輸出:模型引數 θ” role=”presentation” style=”position: relative;”>θθθ。

(1)選擇引數的初值 θ(0)” role=”presentation” style=”position: relative;”>θ(0)θ(0)θ^{(0)} ,開始迭代;

(2) E 步:記 θ(i)” role=”presentation” style=”position: relative;”>θ(i)θ(i)θ^{(i)} 為第 i” role=”presentation” style=”position: relative;”>iii 次迭代引數 θ” role=”presentation” style=”position: relative;”>θθθ 的估計值,在第 i 1″ role=”presentation” style=”position: relative;”>i 1i 1i 1 次迭代的 E 步,計算

(31)Q(θ,θi)=EZ[logP(Y,Z|θ)|Y,θi](32)=∑ZlogP(Y,Z|θ)P(Z|Y,θi)” role=”presentation” style=”position: relative;”>Q(θ,θi)=EZ[logP(Y,Z|θ)|Y,θi]=∑ZlogP(Y,Z|θ)P(Z|Y,θi)(31)(32)(31)Q(θ,θi)=EZ[logP(Y,Z|θ)|Y,θi](32)=∑ZlogP(Y,Z|θ)P(Z|Y,θi)

\begin{align}
Q(θ,θ^{i})&=E_Z\Big[logP(Y,Z|θ) | Y,θ^{i}\Big]\\
&=\sum_ZlogP(Y,Z|θ)P(Z|Y,θ^{i})
\end{align}

這裡,P(Z|Y,θi)” role=”presentation” style=”position: relative;”>P(Z|Y,θi)P(Z|Y,θi)P(Z|Y,θ^{i}) 是在給定觀測資料 Y” role=”presentation” style=”position: relative;”>YYY 和當前的引數估計 θi” role=”presentation” style=”position: relative;”>θiθiθ^{i} 下隱變數資料 Z” role=”presentation” style=”position: relative;”>ZZZ 的條件概率分佈;

(3) M 步:求使 Q(θ,θi)” role=”presentation” style=”position: relative;”>Q(θ,θi)Q(θ,θi)Q(θ,θ^{i}) 極大化的 θ” role=”presentation” style=”position: relative;”>θθθ,確定第 i 1″ role=”presentation” style=”position: relative;”>i 1i 1i 1 次迭代的引數的估計值 θ(i 1)” role=”presentation” style=”position: relative;”>θ(i 1)θ(i 1)θ^{(i 1)}

θ(i 1)=argmaxθQ(θ,θi)” role=”presentation” style=”text-align: center; position: relative;”>θ(i 1)=argmaxθQ(θ,θi)θ(i 1)=argmaxθQ(θ,θi)

θ^{(i 1)}=arg \max_θQ(θ,θ^{i})

(4)重複第(2)步和第(3)步,直到收斂。

事實上,隱變數估計問題也可通過梯度下降等優化演算法求解,但由於求和的項數將隨著隱變數的數目以指數級上升,會給梯度計算帶來麻煩;而 EM 演算法則可看作一種非梯度優化方法。

在一般條件下 EM 演算法是收斂的,但不能保證收斂到全域性最優。

EM 演算法可以用於生成模型的非監督學習。生成模型由聯合概率分佈 P(X,Y)” role=”presentation” style=”position: relative;”>P(X,Y)P(X,Y)P(X,Y) 表示,可以認為非監督學習訓練資料是聯合概率分佈產生的資料。X” role=”presentation” style=”position: relative;”>XXX 為觀測資料,Y” role=”presentation” style=”position: relative;”>YYY 為未觀測資料。

2 高斯混合模型的引數估計

EM 演算法應用及其廣泛,主要應用於含有隱變數的概率模型的學習。高斯混合模型的引數估計是 EM 演算法的一個重要應用。

2.1 高斯混合模型

高斯混合模型是指具有如下形式的概率分佈模型:

P(y|θ)=∑k=1KαkΦ(y|θk)” role=”presentation” style=”text-align: center; position: relative;”>P(y|θ)=∑k=1KαkΦ(y|θk)P(y|θ)=∑k=1KαkΦ(y|θk)

P(y|θ)=\sum^K_{k=1}\alpha_kΦ(y|θ_k)

其中,αk” role=”presentation” style=”position: relative;”>αkαk\alpha_k 是係數(類別概率),αk≥0,∑k=1Kαk=1″ role=”presentation” style=”position: relative;”>αk≥0,∑Kk=1αk=1αk≥0,∑k=1Kαk=1\alpha_k≥0,\sum^K_{k=1}\alpha_k=1 ; Φ(y|θk)” role=”presentation” style=”position: relative;”>Φ(y|θk)Φ(y|θk)Φ(y|θ_k) 是高斯分佈密度函式,

Φ(y|θk)=12πσkexp⁡(−(y−μk)22σk2)” role=”presentation” style=”text-align: center; position: relative;”>Φ(y|θk)=12π−−√σkexp(−(y−μk)22σ2k)Φ(y|θk)=12πσkexp⁡(−(y−μk)22σk2)

Φ(y|θ_k)=\frac{1}{\sqrt{2\pi}σ_k}\exp\Big(-\frac{(y-\mu_k)^2}{2σ_k^2}\Big)

θk=(μk,σk2)” role=”presentation” style=”position: relative;”>θk=(μk,σ2k)θk=(μk,σk2)θ_k=(\mu_k,σ_k^2) ,稱為第 k” role=”presentation” style=”position: relative;”>kkk 個分模型。

一般混合模型可以由任意概率分佈密度代替上面的高斯分佈密度函式。

2.2 高斯混合模型引數估計的 EM 演算法

輸入:觀測資料 y1,y2,…,yN” role=”presentation” style=”position: relative;”>y1,y2,…,yNy1,y2,…,yNy_1,y_2,…,y_N ,高斯混合模型;

輸出:高斯混合模型引數

(1)取引數的初始值開始迭代

(2) E 步:依據當前模型引數,計算分模型 k” role=”presentation” style=”position: relative;”>kkk 對觀測資料 yj” role=”presentation” style=”position: relative;”>yjyjy_j 的響應度

γ^jk=αkΦ(yj|θk)∑k=1KαkΦ(yj|θk)   j=1,2…,N;k=1,2…,K” role=”presentation” style=”text-align: center; position: relative;”>γ^jk=αkΦ(yj|θk)∑Kk=1αkΦ(yj|θk)   j=1,2…,N;k=1,2…,Kγ^jk=αkΦ(yj|θk)∑k=1KαkΦ(yj|θk)   j=1,2…,N;k=1,2…,K

\hatγ_{jk}=\frac{\alpha_kΦ(y_j|θ_k)}{\sum^K_{k=1}\alpha_kΦ(y_j|θ_k)}{   }j=1,2…,N; k=1,2…,K

(3) M 步:計算新一輪迭代的模型引數

(45)μ^k=∑j=1Nγ^jkyj∑j=1Nγ^jk(46)σ^k2=∑j=1Nγ^jk(yj−μk)2∑j=1Nγ^jk(47)α^k=∑j=1Nγ^jkN(48)j=1,2…,N;k=1,2…,K” role=”presentation” style=”position: relative;”>μ^kσ^2kα^kj=∑Nj=1γ^jkyj∑Nj=1γ^jk=∑Nj=1γ^jk(yj−μk)2∑Nj=1γ^jk=∑Nj=1γ^jkN=1,2…,N;k=1,2…,K(45)(46)(47)(48)(45)μ^k=∑j=1Nγ^jkyj∑j=1Nγ^jk(46)σ^k2=∑j=1Nγ^jk(yj−μk)2∑j=1Nγ^jk(47)α^k=∑j=1Nγ^jkN(48)j=1,2…,N;k=1,2…,K

\begin{align}
\hat\mu_k&=\frac{\sum_{j=1}^N\hatγ_{jk}y_j}{\sum_{j=1}^N\hatγ_{jk}}\\
\hatσ_k^2&=\frac{\sum_{j=1}^N\hatγ_{jk}(y_j-\mu_k)^2}{\sum_{j=1}^N\hatγ_{jk}}\\
\hat\alpha_k&=\frac{\sum_{j=1}^N\hatγ_{jk}}{N}\\
j&=1,2…,N; k=1,2…,K
\end{align}

(4)重複第(2)步和第(3)步,直到收斂。

3 實戰

3.1 高斯混合模型引數估計的 EM 演算法實現

生成兩個三維高斯分佈樣本集,並分E步和M步實現 EM 演算法。程式碼實現如下:

import numpy as np
from scipy.stats import multivariate_normal
from sklearn.mixture import GaussianMixture
from mpl_toolkits.mplot3d import Axes3D
import matplotlib as mpl
import matplotlib.pyplot as plt
from sklearn.metrics.pairwise import pairwise_distances_argmin
if __name__ == '__main__':
# 生成高斯混合模型樣本點
np.random.seed(0)               # 撒固定的種子,保證每次樣本集資料相同
mu1_fact = (0, 0, 0)            # 均值點
cov1_fact = np.diag((1, 2, 3))  # 分佈的協方差矩陣,對角陣
# 生成3維高斯分佈樣本集1
data1 = np.random.multivariate_normal(mu1_fact, cov1_fact, 400)
mu2_fact = (2, 2, 1)            # 均值點
cov2_fact = np.array(((4, 1, 3), (1, 2, 1), (3, 1, 4)))  # 正定協方差(協方差一定是對稱的)
# 生成3維高斯分佈樣本集2
data2 = np.random.multivariate_normal(mu2_fact, cov2_fact, 100)
# 合併樣本集,並樣本結果賦值
data = np.vstack((data1, data2))
y = np.array([True] * 400   [False] * 100)
num_iter = 100          # 迭代次數
n, d = data.shape
mu1 = data.min(axis=0)  # 樣本中的最小值
mu2 = data.max(axis=0)  # 樣本中的最大值
sigma1 = np.identity(d) # 對角單位矩陣
sigma2 = np.identity(d) # 對角單位矩陣
pi = 0.5                # 類別概率
# EM演算法
for i in range(num_iter):
# E步
norm1 = multivariate_normal(mu1, sigma1)    # 建立高斯分佈1
norm2 = multivariate_normal(mu2, sigma2)    # 建立高斯分佈2
tau1 = pi * norm1.pdf(data)
tau2 = (1 - pi) * norm2.pdf(data)
gamma = tau1 / (tau1   tau2)                # 響應度計算
# M步
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 - ", mu1, '\t mu2 - ', 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)
# 類別
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    # c2取反,用於畫圖取樣本點
acc = np.mean(y == c1)
print('準確率:%.2f%%' % (100*acc))
# 畫圖略

輸出結果如下:

第 0 次迭代:     mu1 -  [-0.05498014  0.05278006 -0.22147695]    mu2 -  [2.53655062 2.21992108 2.48836929]
第 1 次迭代:     mu1 -  [-0.0476418   0.07074223 -0.16462639]    mu2 -  [2.59781374 2.20706534 2.2859227 ]
第 2 次迭代:     mu1 -  [-0.05110509  0.07462042 -0.13266706]    mu2 -  [2.64701043 2.21013144 2.13833637]
第 3 次迭代:     mu1 -  [-0.05698022  0.07382559 -0.11061553]    mu2 -  [2.68221212 2.21679115 2.0194979 ]
第 4 次迭代:     mu1 -  [-0.06272106  0.07097723 -0.09449537]    mu2 -  [2.70182207 2.22314359 1.92211961]
第 5 次迭代:     mu1 -  [-0.06741194  0.06725362 -0.08260728]    mu2 -  [2.70645078 2.22713641 1.84247397]
......
第 95 次迭代:    mu1 -  [-0.08011793 -0.06035502  0.06892191]    mu2 -  [1.82861573 1.93127578 0.70517931]
第 96 次迭代:    mu1 -  [-0.08011794 -0.06035504  0.06892194]    mu2 -  [1.82861559 1.93127571 0.70517919]
第 97 次迭代:    mu1 -  [-0.08011794 -0.06035507  0.06892196]    mu2 -  [1.82861548 1.93127565 0.70517908]
第 98 次迭代:    mu1 -  [-0.08011795 -0.06035509  0.06892197]    mu2 -  [1.82861538 1.9312756  0.70517899]
第 99 次迭代:    mu1 -  [-0.08011795 -0.06035511  0.06892199]    mu2 -  [1.8286153  1.93127556 0.70517891]
類別概率:    0.7670785478701622
均值:  [-0.08011795 -0.06035511  0.06892199] [1.8286153  1.93127556 0.70517891]
方差:
[[ 0.83206246 -0.06865792 -0.01790841]
[-0.06865792  2.03682771 -0.03791651]
[-0.01790841 -0.03791651  2.5827817 ]] 
[[4.14127447 0.80620157 3.63441567]
[0.80620157 1.85697497 1.02708058]
[3.63441567 1.02708058 5.15539735]] 
準確率:83.40%

輸出圖形如下:

這裡寫圖片描述

3.2 EM演算法估算GMM的引數

使用身高、體重樣本集對性別使用GaussianMixture進行聚類。程式碼實現如下:

import numpy as np
from sklearn.mixture import GaussianMixture
from sklearn.model_selection import train_test_split
import matplotlib as mpl
import matplotlib.colors
import matplotlib.pyplot as plt
if __name__ == '__main__':
# 載入資料
data = np.loadtxt('.\\HeightWeight.csv', dtype=np.float, delimiter=',', skiprows=1)
print('資料集大小:',data.shape)
# 資料劃分
y, x = np.split(data, [1, ], axis=1)
x, x_test, y, y_test = train_test_split(x, y, test_size=0.4, random_state=0)
# 高斯混合模型:兩個簇,方差型別full
gmm = GaussianMixture(n_components=2, covariance_type='full')
gmm.fit(x)  # 訓練
print('均值: \n', gmm.means_)
print('方差: \n', gmm.covariances_)
y_hat = gmm.predict(x)              # 訓練集預測
y_test_hat = gmm.predict(x_test)    # 測試集預測
# 計算準確率
acc = np.mean(y_hat.ravel() == y.ravel())
acc_test = np.mean(y_test_hat.ravel() == y_test.ravel())
print('訓練集準確率:%.2f%%' % (acc * 100))
print('測試集準確率:%.2f%%' % (acc_test * 100))
# 若均值相反,則樣本結果互換
change = (gmm.means_[0][0] > gmm.means_[1][0])
if change:
z = y_hat == 0
y_hat[z] = 1
y_hat[~z] = 0
z = y_test_hat == 0
y_test_hat[z] = 1
y_test_hat[~z] = 0
# 預測後驗概率,畫後驗概率等高線
p = gmm.predict_proba(grid_test)
print('後驗概率:', p)
p = p[:, 0].reshape(x1.shape)
CS = plt.contour(x1, x2, p, levels=(0.1, 0.5, 0.8), colors=list('rgb'), linewidths=2)
plt.clabel(CS, fontsize=12, fmt='%.1f', inline=True)
# 畫圖略

輸出結果如下:

資料集大小: (114, 3)
均值: 
[[160.13983374  55.93370575]
[173.50243688  65.03359308]]
方差: 
[[[ 18.82128194  12.30370549]
[ 12.30370549  31.23596113]]
[[ 23.22794989  28.48688647]
[ 28.48688647 105.81824734]]]
訓練集準確率:77.94%
測試集準確率:82.61%
後驗概率: [[9.99997750e-01 2.25031842e-06]
[9.99997839e-01 2.16136597e-06]
[9.99997923e-01 2.07669097e-06]
...
[6.34944402e-11 1.00000000e 00]
[5.78303161e-11 1.00000000e 00]
[5.26521608e-11 1.00000000e 00]]

輸出圖形如下:

這裡寫圖片描述

3.3 GMM調參

生成兩個二維高斯分佈樣本集,使用GaussianMixture聚類。程式碼實現如下:

import numpy as np
from sklearn.mixture import GaussianMixture
import matplotlib as mpl
import matplotlib.colors
import matplotlib.pyplot as plt
if __name__ == '__main__':
np.random.seed(0)       # 撒固定的種子,保證每次樣本集資料相同
cov1 = np.diag((1, 2))  # 分佈的協方差矩陣,對角陣
N1 = 500; N2 = 300      # 樣本數量
N = N1   N2
# 生成2維高斯分佈樣本集1,均值點為(1, 2)
x1 = np.random.multivariate_normal(mean=(1, 2), cov=cov1, size=N1)
# 樣本集1變換
m = np.array(((1, 1), (1, 3)))
x1 = x1.dot(m)
# 生成2維高斯分佈樣本集2,均值點為(-1, 10)
x2 = np.random.multivariate_normal(mean=(-1, 10), cov=cov1, size=N2)
# 合併樣本集,並樣本結果賦值
x = np.vstack((x1, x2))
y = np.array([0]*N1   [1]*N2)
# 高斯混合模型,方差型別集合
types = ('spherical', 'diag', 'tied', 'full')
err = np.empty(len(types))  # 錯誤率集
bic = np.empty(len(types))  # BIC集
# 遍歷方差型別訓練高斯混合模型
for i, type in enumerate(types):
# 高斯混合模型:兩個簇,方差型別type
gmm = GaussianMixture(n_components=2, covariance_type=type)
gmm.fit(x)          # 訓練
err[i] = 1 - accuracy_rate(gmm.predict(x), y)   # 錯誤率,越小越優
bic[i] = gmm.bic(x) # BIC值,越小越優
print('錯誤率:', err.ravel())
print('BIC:', bic.ravel())
# 找到最優BIC的方差型別
optimal = bic.argmin()
gmm = GaussianMixture(n_components=2, covariance_type=types[optimal])
gmm.fit(x)              # 訓練
print('均值 = \n', gmm.means_)
print('方差 = \n', gmm.covariances_)
y_hat = gmm.predict(x)  # 預測
# 不同方差型別的誤差率和BIC直方圖
# 畫圖略

輸出結果如下:

錯誤率: [0.385   0.315   0.3     0.00125]
BIC: [7990.62231203 7855.56050855 8006.49834359 6845.79374805]
均值 = 
[[-0.97642254 10.06927801]
[ 2.88444448  6.69484552]]
方差 = 
[[[ 0.91302546 -0.04298504]
[-0.04298504  1.9603531 ]]
[[ 2.87015473  6.64421303]
[ 6.64421303 18.00318872]]]

輸出圖形如下:

這裡寫圖片描述

這裡寫圖片描述

3.4 GMM無監督分類鳶尾花資料

使用GaussianMixture無監督分類鳶尾花資料。程式碼實現如下:

import numpy as np
import pandas as pd
from sklearn.mixture import GaussianMixture
import matplotlib as mpl
import matplotlib.colors
import matplotlib.pyplot as plt
from sklearn.metrics.pairwise import pairwise_distances_argmin
if __name__ == '__main__':
path = '.\\iris.data'                   # 資料檔案路徑
data = pd.read_csv(path, header=None)   # 讀取資料
x_prime = data[np.arange(4)]            # 取特徵值
y = pd.Categorical(data[4]).codes       # 取標籤值
# 簇的大小
n_components = 3
# 特徵值分為6組
feature_pairs = [[0, 1], [0, 2], [0, 3], [1, 2], [1, 3], [2, 3]]
plt.figure(figsize=(8, 6), facecolor='w')
for k, pair in enumerate(feature_pairs, start=1):
x = x_prime[pair]
m = np.array([np.mean(x[y == i], axis=0) for i in range(3)])  # 均值的實際值
print('實際均值 = \n', m)
# 高斯混合模型:3個簇,方差型別full
gmm = GaussianMixture(n_components=n_components, covariance_type='full', random_state=0)
gmm.fit(x)              # 訓練
print('預測均值 = \n', gmm.means_)
print('預測方差 = \n', gmm.covariances_)
y_hat = gmm.predict(x)  # 預測
order = pairwise_distances_argmin(m, gmm.means_, axis=1, metric='euclidean')
print('順序:\t', order)
# 變換順序
n_sample = y.size
change = np.empty((n_components, n_sample), dtype=np.bool)
for i in range(n_components):
change[i] = y_hat == order[i]
for i in range(n_components):
y_hat[change[i]] = i
acc = '準確率:%.2f%%' % (100*np.mean(y_hat == y))
print(acc)
# 畫圖略

輸出結果如下:

實際均值 = 
[[5.006 3.418]
[5.936 2.77 ]
[6.588 2.974]]
預測均值 = 
[[5.01494511 3.44040237]
[6.69225795 3.03018616]
[5.90652226 2.74740414]]
預測方差 = 
[[[0.11948421 0.08969613]
[0.08969613 0.12149899]]
[[0.3588512  0.05091598]
[0.05091598 0.08956947]]
[[0.27590209 0.08910477]
[0.08910477 0.09414053]]]
順序:  [0 2 1]
準確率:78.67%
實際均值 = 
[[5.006 1.464]
[5.936 4.26 ]
[6.588 5.552]]
預測均值 = 
[[5.0060006  1.46399865]
[6.04240777 4.41742864]
[6.58888904 5.63329718]]
預測方差 = 
[[[0.12176525 0.01581631]
[0.01581631 0.0295045 ]]
[[0.28119672 0.23746926]
[0.23746926 0.31503012]]
[[0.48521779 0.36602418]
[0.36602418 0.32601109]]]
順序:  [0 1 2]
準確率:91.33%
實際均值 = 
[[5.006 0.244]
[5.936 1.326]
[6.588 2.026]]
預測均值 = 
[[5.00605757 0.23727675]
[6.57289666 2.05192938]
[5.977111   1.33910201]]
預測方差 = 
[[[0.12407758 0.01055895]
[0.01055895 0.00905628]]
[[0.4171415  0.05278455]
[0.05278455 0.06790735]]
[[0.30671183 0.08640131]
[0.08640131 0.05609398]]]
順序:  [0 2 1]
準確率:96.00%
實際均值 = 
[[3.418 1.464]
[2.77  4.26 ]
[2.974 5.552]]
預測均值 = 
[[3.41800009 1.46400001]
[2.97017899 5.56073357]
[2.80062882 4.43004172]]
預測方差 = 
[[[0.14227691 0.01144799]
[0.01144799 0.029505  ]]
[[0.11477629 0.07760424]
[0.07760424 0.38871245]]
[[0.09376548 0.10702236]
[0.10702236 0.34454954]]]
順序:  [0 2 1]
準確率:92.67%
實際均值 = 
[[3.418 0.244]
[2.77  1.326]
[2.974 2.026]]
預測均值 = 
[[3.41800003 0.244     ]
[2.93629236 1.98607968]
[2.79657869 1.31224583]]
預測方差 = 
[[[0.14227697 0.011208  ]
[0.011208   0.011265  ]]
[[0.11263095 0.06192916]
[0.06192916 0.08966439]]
[[0.09554395 0.04869984]
[0.04869984 0.03787478]]]
順序:  [0 2 1]
準確率:93.33%
實際均值 = 
[[1.464 0.244]
[4.26  1.326]
[5.552 2.026]]
預測均值 = 
[[1.4639995  0.24399977]
[5.57721357 2.04303223]
[4.30594389 1.34787855]]
預測方差 = 
[[[0.02950483 0.00558393]
[0.00558393 0.01126496]]
[[0.30034404 0.04402642]
[0.04402642 0.07200287]]
[[0.24667106 0.08489917]
[0.08489917 0.04585074]]]
順序:  [0 2 1]
準確率:97.33%

輸出圖形如下:

這裡寫圖片描述

對比學習筆記【機器學習重點與實戰】——4 整合學習-Bagging學習筆記【機器學習重點與實戰】——4 整合學習-Bagging中分別使用隨機森林和AdaBoost對鳶尾花資料有監督學習的訓練結果,可知使用GMM無監督分類鳶尾花效果也還不錯。

4 參考

  1. 《統計學習方法》第9章 EM演算法及其推廣
  2. 《機器學習 – 周志華》7.6 EM演算法

===========文件資訊============
學習筆記由博主整理編輯,供非商用學習交流用
如本文涉及侵權,請隨時留言博主,必妥善處置
版權宣告:非商用自由轉載-保持署名-註明出處
署名(BY) :dkjkls(dkj卡洛斯)
文章出處:http://blog.csdn.net/dkjkls