GMM(高斯混合模型)以及簡單實現

2021-07-22 09:33:12 字數 3808 閱讀 6674

本文主要是學習比較,主要參考這幾篇博文,寫的非常通俗易懂:

拖了兩天了,今天唯一的任務就是把gmm搞清楚,然後把博文寫出來, 嗯嗯,就這樣。

先看一下單高斯模型(sgm):

公式都寫成**的形式了,工具還不太會用。

正態分佈的概率密度是:

x~ n(u, sigma^2) –> pdf(x) = 1./(math.sqrt(2 * math.pi) * sigma) * exp( -(x-u)^2 / (2. * sigma^2) )

多維單高斯(正態)分布的概率密度是(在sre或者asr中一般去mfcc特徵,x=(x1,x2,x3,…,xd). t的維度d一般為39或者42, 注意x為列向量, 實際計算中一般是行向量,便於計算):

pdf(x) = 1./( (math.sqrt((2 * math.pi)^d) * np.linalg.det(c)) ) * exp(-0.5 * (x-u).t * np.linalg.inv(c) * (x-u))

其中c為x1,x2,..,xd的協方差矩陣,

u為x的期望(u的維數是xi的維數,比如這個地方是39,可以看作u1是每個x的第乙個數做均值),

np.linalg.det(c)求協方差矩陣的行列式

np.linalg.inv(c)是c逆,

由於資料型別都是numpy,直接用 (x-u).t表示轉置。

對於sgm,可以用於模式識別中的二分類問題,比如有單高斯模型k, 判斷乙個訓練樣本是不是屬於k類,求 n(x , c),

其中 c = (u , c), u為mean vector , c為 covariance matrix.

n(x , c)= pdf = 1./( (math.sqrt((2 * math.pi)^d * np.linalg.det(c) ))) * exp(-0.5 * (x-u).t * np.linalg.inv(c) * (x-u))

如果pdf大於閾值t, 則表示屬於c類, 否則不屬於。其中閾值t的選擇可以是經驗值或者是實驗的結果或者是其他的策略,這裡不展開,下面**中使用乙個經驗值,比如0.7

note: sgm的幾何意義,注意通過集合意義與gmm區分,理解內在的含義,二維點在平面上近似橢圓,三維點在空間中近似橢球,但是無論如何都只是乙個超平面,但是gmm是多個不同的sgm,通過平移來平滑的描述任何的圖形。

高斯混合模型 gmm:

例如有一批觀察資料x=(x1, x2, x3, …, xn), 樣本個數為n,每乙個樣本的維度為d, 在空間的分布不是橢球壯,那麼就不適合sgm的pdf來描述。 此時我們假設每個點均由乙個sgm來描述,而這一批資料由m個sgm生成,sgm的均值和方差都未知,xi屬於那個sgm未知且每個sgm在gmm的比例pij未知 , 將來自不同分布的點混在一起,該分布稱為混合高斯分布。

p(xi) = sum ( [pi[j] * sgm(x[i], miu[j], sigma[j]) for j in range(m)] ) (一), 其中 sum(pi[j] for j in range(m) ) = 1,

sgm函式為n(xi, uj, sigmaj), sigmaj是第j個sgm的協方差矩陣。其中

sgm(x[i], miu[j], sigma[j]):

d = len(x[i])

a = 1./( (math.sqrt((2 * math.pi)^d * np.linalg.det(sigma[j]) )) )

b = exp( -0.5 * (x[i] - miu[j]).t * np.linalg.inv(sigma[j]) * (x[i] - miu[j]) )

1./( (math.sqrt((2 * math.pi)^d) * np.linalg.det(c)) ) * exp(-0.5 * (x-u).t * np.linalg.inv(c) * (x-u)) (二)

其中式一表示的是 xi 在所有sgm下的概率之和, 式二表示 xi在第j個sgm下的概率密度函式

令lamda[j] = (pi[j], miu[j], sigma[j]), gmm 共有 m 個sgm, 現在我們需要通過樣本集x來訓練gmm所有的引數lamda[0:m]。

我們要求樣本x的概率最大來訓練引數,用極大似然估計法來求,設極大似然函式為:

l(x, lamda) :

for i in range(n):

for j in range(m):

temp += pi[j] * sgm(x[i] , miu[j], sigma[j])

loss += math.log10(temp)

return loss

我們有了目標函式,有了要訓練的引數, 有了樣本資料,下面我們看是訓練gmm引數:

第一步

初始值的確定:

方案一: 協方差矩陣為單位矩陣, pi[j] = 1./m ; miu[j]為隨機數。 (本實驗取方案一)

方案二: 用k-mean演算法對樣本進行巨雷,利用各類樣本的均值作為miu, 各類樣本的協方差作為sigma , 各類樣本佔樣本總數的比例為pi.

訓練的過程用em(expectation maximization )演算法來訓練引數。

第二步

e step:

這裡由於sgm的值可能比較小,為了使值能相對均勻的分布,我們將xi在第j個高斯分布下的概率定義為:

gamma(i, j) = pi[j] * sgm(x[i], miu[j], sigma[j])

gamma(i, j) = gamma(i, j) / sum(gamma(i, j) for j in range(m))

由此我們可以得到所有點在所有sgm下的pdf, 構成乙個n * m 的matrix:

j = 1, i = 1…n , 得到n * 1 的vector

再令j = 1..m 得到n * m的matrix, 矩陣的每一列為所有點在該sgm下的pdf。

sum = zeros(m)

for i in range(n):

for j in range(m):

sum[i] += pi[j] * sgm(x[i], miu[j], sigma[j])

pdf_matrix = zeroslike((n,m))

for i in range(n):

for j in range(m):

pdf_matrix(i, j) = pi[j] * sgm(x[i], miu[j], sigma[j]) / sum[i] #有些語法錯誤是因為這個markdown還不太會用

loss = sum(pdf_matrix)

第三步:

m step, 更新引數,直到收斂

pi』[j] = sum( gamma(i,j) for i in range(n) ) / n

miu』[j] = sum( gamma(i,j) * x[i] for i in range(n) ) / sum( gamma(i,j) for i in range(n) ) #用pi』[j]

sigma』[j] = sum( gamma(i,j) for i in range(n) ) / sum( gamma(i,j) * (x[i]-miu[j])*(x[i]-miu[j]).t for i in range(n) ) #用pi』[j], miu』[j]

收斂條件: 不斷的迭代e step and m step, 重複更新lamda, 直到l(x, lamba) - l(x, lamba』) < delta , 其中delta = 10^(-5)

完整**上面的鏈結裡邊也有, 不過貌似有點問題,有時間來填坑

GMM高斯混合模型

在一般的分類問題中,通常的套路都是提取特徵,將特徵輸入分類器訓練,得到最終的模型。但是在具體操作時,一開始提出的特徵和輸入分類器訓練的特徵是不一樣的。比如假設有n張 100 100 100 100 的影象,分別提取它們的hog特徵x rp q x rp q,p p為特徵的維數,q q 為這幅影象中h...

高斯混合模型(GMM)

講這個之前,要先對模糊聚類和基於概率模型的聚類有個大體的認識。不清楚的同學可以參考下jiawei的書去看一看,或者看看我的這篇文章。資料探勘 概念與技術 第三版 之第十一章的學習記錄 ok,這裡假設,大家已經有了上面我提到的先驗知識。gmm 和 k means 很像。不過 gmm 是學習出一些概率密...

高斯混合模型 GMM

本文主要針對初次接觸gmm的人,簡單的給出了一些自己初識的一些理解,比較淺顯。初次真正意義上接觸高斯混合模型 gaussian mixed model,gmm 是因為要用它來進行音訊分類,以音訊訊號特徵為輸入,通過gmm來建模,完成最終的分類。有乙個說法是gmm是多個高斯分布函式的線性組合。理論上g...