HMM條件下的 前向演算法 和 維特比解碼

2021-09-08 13:26:26 字數 3173 閱讀 5129

一、隱馬爾科夫hmm如果:

有且僅僅有3種天氣:0晴天。1陰天。2雨天

各種天氣間的隔天轉化概率mp:

mp[3][3]

晴天陰天

雨天晴天

0.33333

0.33333

0.33333

陰天0.33333

0.33333

0.33333

雨天0.33333

0.33333

0.33333

有2種活動:            0去公園,1不去公園

各種天氣下進行各種活動的概率:

w2a[3][2]

去公園不去公園

晴天0.75

0.25

陰天0.4

0.6雨天

0.25

0.75

觀察5天的活動序列:0 0 1 0 1 ;(0去公園,1不去公園)

5天的動作觀察序列 o[5]

1天2天

3天4天

5天去公園

去公園不去

去公園不去00

101

第0天的天氣概率pi:

pi[3]

第0天天氣概率

晴天0.5

陰天0.3

雨天0.2

定義幾個巨集及變數表示hmm:

#define t 5        //觀察n天 

#define m 3 //每天可能有m種天氣

#define n 2 //動作種類。去公園+不去公園

float mp[m][m]; //相鄰兩天的天氣轉換概率

float w2a[m][n]; //weather to action,各天氣下採取各動作的概率

int o[t]; //n天觀察到的天氣序列

int bestpath[t][m];//bestpath[t][i]表示 (第t天處於第i種天氣狀態且出現「o0-ot」觀察序列的概率最大的)路徑在時間t-1時刻的天氣狀態

float pi[m]; //乙個m維向量,表示第一天各種天氣出現的概率

二、前向演算法--出現觀察動作序列的概率

即求出現:「1去公園,2去公園,3不去公園,4去公園,5不去公園」 動作序列的概率。

這是乙個求和問題。用dp思想的前向演算法解決。

1、構造矩陣float sump[t][m];

sump[t][i]表示:在時間t,處於天氣i,且出現觀察動作序列o0-ot的概率

2、填表求解過程:

//初始表

for(i=0; i

求觀察序列出現概率:

float sumpp=0;

for(i=1;i

三、維特比解碼-哪種天氣下出現觀察動作序列的概率最大

在哪種天氣序列下,出現觀察序列的概率最大,並求 (出現該天氣序列和觀察動作序列事件)的最大概率。

這是最優化問題,dp思想求最大,採用維特比解碼

1、構造矩陣maxp[t][m]

maxp[t][j], 算出第t天處於第i狀態且出現觀察序列o0~ot的路徑中,(出現天氣路徑和觀察路徑)概率最大的路徑的概率。

bestpath[t][i],表示是第t天,天氣狀態為i狀態出現觀察序列o0~ot的最大概率路徑下(即取得maxp[t][i])。第t-1天的天氣狀態。

2、填表過程:

//初始表

float maxpp=0;

int maxpre=0;

for(i=0;imaxpp)

}//後填表

for(t=1;tmaxpp)

}maxp[t][i] = maxpp;

bestpath[t][i] = maxpre;

}

}

輸出最大概率及其天氣路徑:

float maxendp=0;

int lastchoice;

for(i=0; imaxendp)

}cout<

}

//輸入各天氣下,採取不同動作的概率

for(i=0; i>w2a[i][j];

}

} //輸入pi

for(i=0; i>pi[i];

} //輸入觀察序列

for(i=0; i>o[i];

} }/*維特比演算法

已知hmm模型,轉移概率(天氣轉換概率),初始狀態(第0天的天氣或天氣概率),各天氣下採取各動作的概率。觀察序列(動作序列)

1.求出(使觀察序列出現概率最大的)天氣路徑,

即在那種天氣序列下。出現觀察序列的概率最大

2.求出 (出現天氣路徑且出現觀察序列的事件)的最大概率

這是一種最優化問題,求最大,dp思想

*/float viterbi() }

//後填表

for(t=1;tmaxpp)

}maxp[t][i] = maxpp;

bestpath[t][i] = maxpre;

} }

float maxendp=0;

int lastchoice;

for(i=0; imaxendp)

}cout<

{ cout<

五、執行結果:

0.33333 0.33333 0.33333

0.33333 0.33333 0.33333

0.33333 0.33333 0.33333

0.75 0.25

0.4 0.6

0.25 0.75

0.5 0.3 0.2

0 0 1 0 1

最大的概率為:0.00146479

全部路徑中,出現觀察序列概率的最大的天氣路徑為:

2 0 2 0 0

使用前向演算法算出,觀察序列的出現概率為0.0284842

HMM模型學習筆記(前向演算法例項)

hmm演算法想必大家已經聽說了好多次了,完全看公式一頭霧水。但是hmm的基本理論其實很簡單。因為hmm是馬爾科夫鏈中的一種,只是它的狀態不能直接被觀察到,但是可以通過觀察向量間接的反映出來,即每乙個觀察向量由乙個具有相應概率密度分布的狀態序列產生,又由於每乙個狀態也是隨機分布的,所以hmm是乙個雙重...

HMM學習最佳範例五 前向演算法3

五 前向演算法 forward algorithm 前向演算法定義 forward algorithm definition 我們使用前向演算法計算t長觀察序列的概率 其中y的每乙個是觀察集合之一。區域性 中間 概率 s 是遞迴計算的,首先通過計算t 1時刻所有狀態的區域性概率 也就是當前狀態相應的...

限制條件下計算累加和

question 求 1 2 n 要求不能使用乘除法 for while if else switch case 等關鍵字。ps 無誤,但執行則需要自行整理 沒錯,我就是懶得整理 no.0 三目運算子 class solution no.1 或斷路 class solution no.2 與短路 c...