本文主要是學習比較,主要參考這幾篇博文,寫的非常通俗易懂:
拖了兩天了,今天唯一的任務就是把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...