【機器學習】模型聚類

點擊上方藍色字體,關注AI小白入門

跟着博主的腳步,每天進步一點點

文介紹了混合高斯聚類算法。首先介紹了混合高斯的類表示是一個高斯模型,相似性度量定義爲服從類參數爲高斯分佈,其是一種典型的基於模型的密度聚類算法。然後介紹了混合高斯模型假設類間服從伯努利分佈,類內服從高斯分佈,結合最大似然函數給出了混合高斯模型的目標函數。最後介紹了混合高斯模型的EM求解流程。

作者 | 文傑

編輯 | yuquanle

模型聚類

高斯混合

高斯混合的類表示是一個高斯模型,相似性度量定義爲服從類高斯分佈的概率(Kmeans的相似度量是距離度量),所以高斯混合聚類也可以看作是有參的密度聚類。

高斯混合假設類之間服從伯努利分佈,樣本在某一類下服從高斯分佈,也就是說每個樣本獨立服從多元高斯分佈。爲了使得所有樣本的概率最大化,即最大化對數似然函數:

也就是說假設類之間服從一個伯努利分佈:

樣本在類下的條件概率服從高斯分佈:

那麼樣本和類標籤的聯合分佈爲:

以上,當已知時,即標籤信息已知的話,類似於高斯判別分析(當然,高斯判別分析中多個高斯分佈之間具有相同的協方差),對應的且只屬於一類(類標已知),那麼上式有:

最大似然估計有參數:

可以看出爲每一類樣本所佔的比例,爲該類下樣本的均值,爲該類下樣本的協方差。

考慮到高斯混合模型中的類劃分是概率劃分,表示第個樣本屬於第類的概率。所以,高斯混合模型的所有參數都需要乘上類的劃分概率

高斯混合模型流程

1)初始化參數隱類別數,模型參數

2)採用EM算法,先假設參數,期望最大化,然後更新樣本的劃分概率更新參數

a)E-step:對所有樣本,根據參數劃分每個樣本類概率:

b)M-step:根據劃分後的類概率更新參數

這裏可以看出,當是已知的,即類標籤已知,則直接進行參數估計等價於高斯判別分析,當是硬劃分,同Kmenas又是一致的。

代碼實戰

Matrix GMM::E_step(const Matrix &x) 
 { 
 Matrix w; 
 w.initMatrix(K, x._row, 0); 
 Matrix wNorm; 
 wNorm.initMatrix(1, x._row, 0); 
 Matrix xOne; 
 double p = 0; 
 for(size_t i = 0; i < x._row; i++) 
 { 
 for(int k = 0; k < w._row; k++) 
 { 
 xOne = x.getOneRow(i); 
 p = Phi[k] * 1.0 / (pow(PI,double(K/2.0)) * COV2(Sigma[k])) * exp(-0.5 *(((xOne-Mu[k]) * Sigma[k].niMatrix()) * (xOne-Mu[k]).transposeMatrix())._data[0][0]); 
 w._data[k][i] = p; 
 wNorm._data[0][i] += p; 
 } 
 for(int k = 0; k < w._row; k++) 
 { 
 w._data[k][i] /= wNorm._data[0][i]; 
 } 
 } 
 return w; 
 } 
   int GMM::M_step(const Matrix &w, const Matrix &x) 
 { 
 Phi.clear(); 
 Mu.clear(); 
 Sigma.clear(); 
 Matrix mu; 
 mu.initMatrix(1, x._col, 0); 
 Matrix sigma; 
 sigma.initMatrix(x._col, x._col, 0); 
 for(size_t k = 0; k < w._row; k++) 
 { 
 Phi.push_back(0); 
 for(size_t j = 1; j < x._col; j++) 
 mu._data[0][j] = 0; 
 for(size_t i = 0; i < sigma._row; i++) 
 for(size_t j = 1; j < sigma._col; j++) 
 sigma._data[i][j] = 0; 
 for(size_t i = 0; i < x._row; i++) 
 { 
 Phi[k] += w._data[k][i];//計算phi 
 for(size_t j = 0; j < x._col; j++) 
 mu._data[0][j] += w._data[k][i] * x._data[i][j];//計算mu 
 } 
 Phi[k] /= x._row;//更新phi 
 for(size_t j = 0; j < x._col; j++) 
 mu._data[0][j] /= (Phi[k] * x._row); 
 Mu.push_back(mu);//更新mu 
 for(size_t i = 0; i < x._row; i++) 
 { 
 for(size_t j = 0; j < x._col; j++) 
 { 
 for(size_t j2 = 0; j2 < x._col; j2 ++) 
 { 
 sigma._data[j][j2] += w._data[k][i] * (x._data[i][j]-mu._data[0][j]) * (x._data[i][j2]-mu._data[0][j2]); 
 } 
 } 
 } 
 for(size_t i = 0; i < sigma._row; i++) 
 for(size_t j = 0; j < sigma._col; j++) 
 sigma._data[i][j] /= (Phi[k] * x._row); 
 Sigma.push_back(sigma);//更新Sigma 
 } 
 return 0; 
 }

The End

方便交流學習,備註:暱稱-學校or公司-方向,進入DL&NLP交流羣。

記得備註呦

【推薦閱讀】

初學者|NLP相關任務簡介

【科研】自然語言理解難在哪兒?

自然語言處理中注意力機制綜述

新年送福氣|您有一份NLP大禮包待領取

“達觀杯”文本智能處理挑戰賽,季軍帶你飛

【機器學習】一文讀懂線性迴歸、嶺迴歸和Lasso迴歸

長按二維碼關注
AI小白入門

ID:StudyForAI

學習AI學習ai(愛)

期待與您的相遇~

你點的每個在看,我都認真當成了喜歡

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章