一、隱馬爾科夫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...