尹智龍
(九江職業(yè)大學(xué)機(jī)電工程學(xué)院 江西九江 332000)
高斯混合模型(gaussian mixture model,GMM)就是用高斯概率密度函數(shù)將對象分解,形成正太分布曲線的模型。建模方式多種,但GMM建模是最成功的建模方法之一,其背景干凈清晰,用于建模心音信號系統(tǒng),具有較高的識別率。
文章選取50例正常心音,對其建立一個GMM模型庫,將需要識別的心音信號與建立的模型庫進(jìn)行匹配,識別被測心音是否屬于正常心音。
近年來,對于生物識別系統(tǒng),越來越多用到了高斯建模。對于心音信號的識別系統(tǒng)研究,建立GMM模型庫,最重要的一個環(huán)節(jié)就是正確提取MFCC特征參數(shù)。將樣本心音信號的特征參數(shù)進(jìn)行一系列的計算,最后建立GMM模型庫,同時將需要進(jìn)行識別的心音信號的特征參數(shù)也提取出來,對GMM模型庫進(jìn)行訓(xùn)練和匹配。判斷是否匹配的標(biāo)準(zhǔn)時計算其后驗概率p,當(dāng)p>0.95 時[1],表示與此模型庫中樣本信號接近,診斷被測心音正常。識別思路如圖1所示。
圖1 心音識別思路圖
建立GMM模型的主要思路就是將提取的心音信號MFCC頻率倒譜系數(shù)用概率函數(shù)表達(dá)出來,把所有的概率函數(shù)進(jìn)行加權(quán),得到這例心音信號的GMM概率密度函數(shù)[2],表達(dá)式如下所示:
bi(x)=
(1)
(2)
λ={ωi,μi,Σi}i=1,2…,M
(3)
相同的方法,確定50例正常心音信號的參數(shù)λ,從而建立起一個50例正常心音信號的模型庫。
(4)
心音模型的初始參數(shù)有M和λ,確定參數(shù)的初始值對整個心音信號的訓(xùn)練和識別起著至關(guān)重要的作用。階數(shù)M選取過大,概率函數(shù)的參數(shù)多,增加了計算量和識別時間;階數(shù)M取值過小,模型沒能完全表現(xiàn)出信號的特征,識別存在誤差,整個識別將變得毫無意義。M的取值通過各種文獻(xiàn)資料查詢和實驗結(jié)果論證,在此取值48。
對λ參數(shù)的初始化,采用聚類選擇法。利用最小距離法則來對心音信號參數(shù)進(jìn)行初始化,具體步驟如下:
(2)對待識別的信號分類:
(5)
滿足式(5),表示xk與第i類特征最相似。
(3)找到i后,對信號重新分類,得到新的聚類中心,計算公式如式(6)所示:
(6)
T=50,樣本個數(shù)
(4)條件判斷:
(7)
當(dāng)δ>0時,轉(zhuǎn)到第(2)步,繼續(xù)找最相關(guān)的樣本,當(dāng)δ→0時,滿足收斂條件,則計算出初始參數(shù)λ。
(4)初始參數(shù)λ公式如式(8)到式(10)所示:
(8)
(9)
(10)
初始化代碼如下:
def init_params(self):
self.mu =1/ni.random.rand(self.K,self.D)
self.cov =1/ni.array([np.eye(self.D)]* self.K)* 0.1
self.amiga = ni.array([1.0/self.K]* self.K)
被測心音信號的識別過程,可以概括成兩個步驟:
(1)計算期望值,即E步。
假設(shè)被測心音信號屬于GMM模型庫中第i個模型,建立其概率公式[3]:
(11)
E步的代碼如下:
def e_step(self,data):
gamma_log_prob = np.mat(np.zeros((self.N,self.K)))
for k in range(self.K):
gamma_log_prob[:,k]= log_weight_prob(data,self.alpha[k],self.mu[k],self.cov[k])
log_prob_norm = logsumexp(gamma_log_prob,axis=1)
log_gamma = gamma_log_prob-log_prob_norm[:,np.newaxis]
return log_prob_norm,np.exp(log_gamma)
(2)期望值最大化,即M步
定義一個似然函數(shù)Q,如式(12)所示:
(12)
Q反映的是被測心音信號的特征參數(shù)與GMM模型庫的參數(shù)的對數(shù)關(guān)系。對Q求λi中的三個參數(shù)求偏導(dǎo),并令偏導(dǎo)數(shù)為零,得到λi新的估算值:
(13)
(14)
(15)
Matlab仿真程序如下:
def m_step(self):
newmu = np.zeros([self.K,self.D])
newcov =[]
newamiga = np.zeros(self.K)
for k in range(self.K):
Nk = np.sum(self.gamma[:,k])
newmu[k,:]= np.dot(self.gamma[:,k].T,self.X)/Nk
cov_k = self.compute_cov(k,Nk)
newcov.append(cov_k)
newamiga[k]= Nk/self.N
newcov = np.array(newcov)
return newmu,newcov,newamiga
文章選取了80例正常心音信號(包括50例GMM模型庫中的心音信號),20例異常心音信號,用來測試后概率準(zhǔn)確率。測試結(jié)果統(tǒng)計如表1所示。
表1 識別結(jié)果統(tǒng)計
從表1中可知,采用文章方法,心音識別率達(dá)到90%以上。
階數(shù)M的選取,沒有公式參照,只能通過經(jīng)驗值不斷的實驗,得出最佳值。利用不同的M值,測試識別性能,得到表2。
表2 階數(shù)M對識別結(jié)果的影響
表2可以看出,M從16~48階時,識別率以近10%的幅度增長,識別時長沒有增加太多,當(dāng)48階過后,識別率提高的很緩慢,如48~64階,識別率只增長了0.7%,識別時間卻多用了近一倍,所以當(dāng)M>48時,系統(tǒng)用較多的時間而識別率沒有得到多少提高,增大M增加了GMM高斯建模的計算難度,所以綜合考慮,M取值48比較合理。
在測試一段心音信號時,測試的時間長短對系統(tǒng)的識別度時有影響的。識別時間太長,
計算時間長,產(chǎn)生很多沒用的數(shù)據(jù),加重系統(tǒng)識別的負(fù)擔(dān)。識別時間太短,不能充分識別,造成與原信號不符的后果。該系統(tǒng)分別測試了幾段不同時長的心音信號,不同時長經(jīng)過GMM模型訓(xùn)練后的識別率如下表3所示:
表3 不同信號的時長對應(yīng)的識別率
從表3中可以看出,10~30s,時長增加不到一倍,但識別率從74.2%增加到90%以上,30~60s,識別時間變?yōu)?倍,識別率只增長2.5%,綜合考慮,取30s的識別時長比較合理。
通過GMM模型訓(xùn)練,對心音信號進(jìn)行歸屬分類,經(jīng)數(shù)據(jù)分析,識別率達(dá)到90%以上,驗證率比較高,為心音信號的診斷提供了有效的方法。