白話機器學習演算法(十六)HMM 隱馬爾科夫鏈

2021-06-28 17:43:40 字數 2914 閱讀 5130

隱馬爾科夫鏈主要是兩部分:

第一部分:與傳統馬爾科夫過程一樣,都是乙個狀態轉移矩陣,假設是:當前狀態只與前一狀態有關;

第二部分:在某一狀態下會有乙個對應的觀測模型,不同狀態有不同的觀測模型;

這點與gmm都是一種兩級跳的思想,只是gmm選定的高斯分布之間沒有關聯,我這次哪個高斯部件來生成與上次選擇沒有關係,但是hmm前後有關係,不過只有一階;

用乙個圖表示如下:

(**於網際網路)

觀測序列為o1   o2     o3.......ot   每個觀測序列的背後都有乙個隱含狀態,而且這些隱含狀態之間有個跳轉概率,每個狀態對應乙個概率密度函式,該狀態依據這個概率密度函式來生成觀測值;說他是隱馬爾科夫鏈,正是因為,這個馬爾科夫過程隱藏在觀測值的背後;

hmm有三個引數:

1)初始狀態概率 pi ;

2)狀態之間的概率轉移矩陣a;

3)每個狀態對應的生成觀測模型b ;

有了這三個引數,我們就能完整的描述乙個隱馬爾科夫鏈。

關於這個模型,必然有其應用,其對應的三個問題如下:

1)概率計算的問題:最簡單的,我給定hmm的引數,求出觀測序列o1   o2     o3.......ot 的概率;

2)學習問題:我給出觀測序列o1   o2     o3.......ot 求出這個隱馬爾科夫模型的三個引數,這是個最大似然估計的問題;

3)解碼問題:給出觀測序列o1   o2     o3.......ot,求這個觀測背後的狀態序列s1   s2     s3.......st。

對於第乙個問題:(概率計算問題)

1)直接計算法

pi為初始狀態概率,中間的s是隱含狀態,因為對應的s狀態序列可能有多種可能性(假設有n種可能狀態,序列長度為k,那麼就有n的t次方個可能的狀態序列),因而對這個公式求和是乙個非常複雜的事情。因而這個方法僅僅作為理論推導使用,並不實用;

2)前向演算法

這種演算法類似於動態規劃,每一步利用前一步的結果,這樣就不需要重複計算,說他是前向演算法,源於其一步一步向前遞推的過程,動態規劃的演算法最重要的是要考慮好,每一步我要儲存什麼資料,這個資料對下一次的計算有用

用來儲存時間截止時間為t ,且 t 時刻狀態為 i,且觀測現象為o(t) 的概率,那麼根據遞推我們能得到

aji代表狀態轉移矩陣中從狀態 j 轉到狀態 i 的概率  bi(o(t+1))代表狀態為 i 的時候觀察值為o(t+1)的概率,通過這個簡單的遞推我們能得到

綜上我們根據觀測序列求出每一步的alpha

最後我們要求的值

**如下:

[cpp]view plain

copy

#include

using

namespace

std;  

typedef

struct

namuna  

numofstate=numofstate_input;  

numofobs=numofobs_input;  

pi=new

double

[numofstate];  

a=(double

**)new

int[numofstate];  

for(

inti=0;i

b=(double

**)new

int[numofstate];         

for(

inti=0;i

}  ~namuna()  

delete

a;  

for(

inti=0;i

delete

b;  

}  }namuna;  

//輸出在給定模型引數情況下,當前觀測序列出現的概率

double

hmmqx(namuna &namuna_input,

int*pobs,

intnlenofobsseq);  

intmain()  

;  cout

return

0;  

}  //pobs儲存的是時間為t時候的觀測值

double

hmmqx(namuna &namuna_input,

int*pobs,

intnlenofobsseq)  

for(int

i=0;i

for(int

t=1;t

alpha[t][i]=tempsum*namuna_input.b[i][pobs[t]];  

}  }  

double

dres=0.0;  

for(

inti=0;i

return

dres;  

}  

3)後向演算法

第二個問題:(學習問題)

1)監督學習演算法

2)非監督學習演算法  baum-welch演算法,em在hmm中的具體實現

第三個問題:(解碼問題)

1)近似演算法

2)維特比演算法(這是很厲害的乙個演算法)

具體的以後再補充。(未完待續)

白話機器學習演算法(二)KNN

knn是一種分類演算法,在現實生活中,我們看乙個人怎麼樣,可以看他的朋友怎麼樣,至少說這樣推斷的可信度比較高 knn就是這種思想。1 初始化輸入為有標籤樣本 2 當我們得到乙個新樣本的時候,我們就看這個新樣本的半徑為r的周圍,各種有標籤樣本的比例,哪種標籤佔的比例最高,我們就給這個新樣本打上這個標籤...

白話機器學習演算法(四)K means

k means演算法是一種無監督聚類演算法,還是打個比方吧 1 現在房間裡有一群人,各自隨機站在房間裡,這時候有個上帝,隨機挑選了房間裡k個人當k個小組的領導 2 選完領導,每個人開始站隊了,找離自己最近的那個領導,表示自己是那一隊的 3 站完隊,大家開始不滿了,要求重新選領導,選誰?選這一小組的中...

白話機器學習演算法(七)LDA

lda也是一種線性變換,其整個證明過程與pca非常相似,找到目標函式,利用特徵值,但是其跟pca的目標是不同的,pca目的是在新座標系中方差最大,lda則是在新座標系中,類內方差盡量小,類間距離盡量大,並以這兩個指標定義乙個目標函式,通過最大化這個目標函式然後得到相應的對映方法,即新座標系 這兩者本...