原理
“最大似然”,英文是 Maximum Likelihood戴已,Likelihood 代表可能性切平,所以最大似然也就是最大可能性的意思。
最大似然:根據(jù)我們的經(jīng)驗点楼,相同年齡下男性的平均身高比女性的高一些
最大似然估計: 它指的就是一件事情已經(jīng)發(fā)生了扫尖,然后反推更有可能是什么因素造成的。還是用一男一女比較身高為例掠廓,假設有一個人比另一個人高换怖,反推他可能是男性。最大似然估計是一種通過已知結果蟀瞧,估計參數(shù)的方法沉颂。
EM 算法是一種求解最大似然估計的方法,通過觀測樣本悦污,來找出樣本的模型參數(shù)铸屉。
練習
假設我們有 A 和 B 兩枚硬幣,我們做了 5 組實驗切端,每組實驗投擲 10 次抬探,每次只能只有A或者B一枚硬幣。那么我們統(tǒng)計出現(xiàn)每組實驗正面的次數(shù),實驗結果如下:
雖然B出現(xiàn)正面次數(shù)為5的概率比A的小小压,但是也不是0线梗。這時候我們應該考慮進這種可能的情況,那么這時候怠益,第一輪實驗用的A的概率就是: 0.246 / (0.246 + 0.015) = 0.9425仪搔;用B的概率就是1-0.9425 = 0.0575。
有0.9425的概率是硬幣A蜻牢,有0.0575的概率是硬幣B烤咧,不再是非此即彼。這樣我們在估計和
時抢呆,就可以用上每一輪實驗的數(shù)據(jù)煮嫌,而不是某幾輪實驗的數(shù)據(jù),顯然這樣會更好一些抱虐。這一步昌阿,我們實際上估計的是用A或者B的一個概率分布,這步就稱作E步恳邀。
以硬幣A為例懦冰, 第一輪的正面次數(shù)為5相當于 5次正面,5次反面
0.9425 * 5 = 4.7125(這是正面)谣沸,0.9425 * 5 = 4.7125(這是反面)
新的 = 4.22 / (4.22+7.98)=0.35 這樣刷钢,改變了硬幣A和B的估計方法之后,會發(fā)現(xiàn)乳附,新估計的
會更加接近真實的值内地,因為我們使用了每一輪的數(shù)據(jù),而不是某幾輪的數(shù)據(jù)赋除。 這步中阱缓,我們根據(jù)E步求出了硬幣A和B在每一輪實驗中的一個概率分布,依據(jù)最大似然法則結合所有的數(shù)據(jù)去估計新的
和
贤重, 被稱作M步
總結
EM算法可以先給無監(jiān)督學習估計一個隱狀態(tài)(即標簽),有了標簽清焕,算法模型就可以轉換成有監(jiān)督學習并蝗,這時就可以用極大似然估計法求解出模型最優(yōu)參數(shù)。其中估計隱狀態(tài)流程應為EM算法的E步秸妥,后面用極大似然估計為M步滚停。
EM 算法相當于一個框架,你可以采用不同的模型來進行聚類粥惧,比如 GMM(高斯混合模型)键畴,或者 HMM(隱馬爾科夫模型)來進行聚類。
GMM 是通過概率密度來進行聚類,聚成的類符合高斯分布(正態(tài)分布)起惕。
而 HMM 用到了馬爾可夫過程涡贱,在這個過程中,我們通過狀態(tài)轉移矩陣來計算狀態(tài)轉移的概率惹想。HMM 在自然語言處理和語音識別領域中有廣泛的應用问词。
Sklearn
GaussianMixture(n_components=1, covariance_type='full', max_iter=100)
- n_components:即高斯混合模型的個數(shù),也就是我們要聚類的個數(shù)嘀粱,默認值為 1激挪。如果你不指定 n_components,最終的聚類結果都會為同一個值锋叨。
- covariance_type:代表協(xié)方差類型垄分。一個高斯混合模型的分布是由均值向量和協(xié)方差矩陣決定的,所以協(xié)方差的類型也代表了不同的高斯混合模型的特征娃磺。協(xié)方差類型有 4 種取值:
covariance_type=full薄湿,代表完全協(xié)方差,也就是元素都不為 0豌鸡;
covariance_type=tied嘿般,代表相同的完全協(xié)方差;
covariance_type=diag涯冠,代表對角協(xié)方差炉奴,也就是對角不為 0,其余為 0蛇更;
covariance_type=spherical瞻赶,代表球面協(xié)方差,非對角為 0派任,對角完全相同砸逊,呈現(xiàn)球面的特性。 - max_iter:代表最大迭代次數(shù)掌逛,EM 算法是由 E 步和 M 步迭代求得最終的模型參數(shù)师逸,這里可以指定最大迭代次數(shù),默認值為 100豆混。
import matplotlib.pyplot as plt
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.mixture import GaussianMixture
#from sklearn import datasets
from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data
y = iris.target
# 采用Z-Score規(guī)范化數(shù)據(jù)篓像,保證每個特征維度的數(shù)據(jù)均值為0,方差為1
ss = StandardScaler()
X = ss.fit_transform(X)
#繪制數(shù)據(jù)分布圖
plt.scatter(X[:, 0], X[:, 1], c="red", marker='o', label='see')
plt.xlabel('petal length')
plt.ylabel('petal width')
plt.legend()
plt.show()
# 構造GMM聚類
gmm = GaussianMixture(n_components=3, covariance_type='full')
gmm.fit(X)
# 訓練數(shù)據(jù)
label_pred = gmm.predict(X)
print('聚類結果', '\n', label_pred) # (150,) [1 1 1 1 1 2 2 2 2 2 0 2 2 2 2 0 2 2 ...]
print('真實類別', '\n', y)
x0 = X[label_pred == 0]
x1 = X[label_pred == 1]
x2 = X[label_pred == 2]
print(x0.shape, x1.shape, x2.shape) # (62, 4) (50, 4) (38, 4)
plt.scatter(x0[:, 0], x0[:, 1], c="red", marker='o', label='label0')
plt.scatter(x1[:, 0], x1[:, 1], c="green", marker='*', label='label1')
plt.scatter(x2[:, 0], x2[:, 1], c="blue", marker='+', label='label2')
plt.xlabel('petal length')
plt.ylabel('petal width')
plt.legend()
plt.show()
from sklearn.metrics import calinski_harabasz_score
print(calinski_harabasz_score(X, label_pred))
# 指標分數(shù)越高皿伺,代表聚類效果越好员辩,也就是相同類中的差異性小,不同類之間的差異性大鸵鸥。當
# 然具體聚類的結果含義奠滑,我們需要人工來分析,也就是當這些數(shù)據(jù)被分成不同的類別之后,具體每個類表代表的含義宋税。