HMM演算法學習筆記

2021-10-07 05:00:49 字數 3295 閱讀 6771

本文將講解hmm的各種演算法運用

背景:有3個色子abc,編號是1到m(此例中取3),每個色子可擲1到6,但分布律各不相等,現在我擲n次,每次隨機取乙個色子隨機擲得乙個點數並記為x[i],但是我不知道每次擲的色子是哪個色子。

概念引入:

隱藏狀態數:m,現在是3種色子,所以隱藏狀態數是3種

輸出狀態數:s,可擲到的數是1到6,所以輸出狀態數是6種

隱藏狀態鏈:取得的色子編號序列

可見狀態鏈:x[i]序列(i從1到n)

初始向量:向量π中元素π[i]表示首次取色子時,取到色子編號為i的概率

輸出矩陣:矩陣b中元素b[j][k]表示這次抽到的色子是m[j],擲得點數是k的概率

轉移矩陣:矩陣a中元素a[i][j]表示上次抽到的色子是m[i],這次抽到的色子是m[j]的概率

問題一:最簡單的動態規劃

已知:隱藏狀態數,輸出狀態數,可見狀態鏈,初始向量,轉移矩陣,輸出矩陣

求解:問得到這串可見狀態鏈的概率

方法一:前向演算法

設定變數:dpa[i]表示第i次抽到的色子是a且能擲出可見狀態鏈前i個點數的概率,dpb與dpc同理

初始狀態:dpa[1]=p(a)*p(a->x[1]),dpb[1]=p(b)*p(b->x[1]),dpc[1]=p(c)*p(c->x[1])

動態規劃:for(int i=2;i<=n;i++)迴圈執行下面三行

dpa[i]=*p(a->x[i])

dpb[i]=*p(b->x[i])

dpc[i]=*p(c->x[i])

最終結果:max(dpa[n],dpb[n],dpc[n])

補充說明:

p(a)= π[1],p(a->x[i])=b[1][i],p(a->a)=a[1][1],p(a->b)=a[1][2],p(a->c)=a[1][3]

p(b)= π[2],p(b->x[i])=b[2][i],p(b->a)=a[2][1],p(b->b)=a[2][2],p(b->c)=a[2][3]

p(c)= π[3],p(c->x[i])=b[3][i],p(c->a)=a[3][1],p(c->b)=a[3][2],p(c->c)=a[3][3]

方法二:後向演算法

設定變數:dpa[i]指第i次抽到的色子是a且能擲出可見狀態鏈第i到n個點數的概率,dpb與dpc同理

初始狀態:dpa[n]= p(a->x[n]),dpb[n]= p(b->x[n]),dpc[n]= p(c->x[n])

動態規劃:for(int i=n;i>=2;i++)迴圈執行下面三行

dpa[i-1]=*p(a->x[i])

dpb[i-1]=*p(b->x[i])

dpc[i-1]=*p(c->x[i])

最終結果:max(p(a)*dpa[1],p(b)*dpb[1],p(c)*dpc[1])

補充說明:

p(a)= π[1],p(a->x[i])=b[1][i],p(a->a)=a[1][1],p(a->b)=a[1][2],p(a->c)=a[1][3]

p(b)= π[2],p(b->x[i])=b[2][i],p(b->a)=a[2][1],p(b->b)=a[2][2],p(b->c)=a[2][3]

p(c)= π[3],p(c->x[i])=b[3][i],p(c->a)=a[3][1],p(c->b)=a[3][2],p(c->c)=a[3][3]

問題二:對比前文把求和變求最大值,帶記憶陣列回溯的動態規劃

已知:隱藏狀態數,輸出狀態數,可見狀態鏈,初始向量,轉移矩陣,輸出矩陣

求解:求最大概率對應的隱藏狀態鏈

方法:動態規劃-維特比演算法

設定變數:

dp[i][j]表示第i次抽到的色子編號是j,能擲出可見狀態鏈前i個點數的概率

res[i][j]表示第i次抽到的色子編號是j,是從從i-1狀態中哪個色子轉移過來

初始狀態:

for(int j=1;j<=m;j++)dp[1][j]=π[i]*b[j][x[i]];

for(int i=2;i<=n;i++)for(int j=1;j<=m;j++)dp[i][j]=0;

動態規劃:

for(int i=2;i<=n;i++)//第i次抽

for(int j=1;j<=m;j++)//這一次抽到j號色子

for(int k=1;k<=m;k++)//上一次抽的是k號色子

if(dp[i][j]dp[i][j]=dp[i-1][k]*a[k][j]*b[i][x[i]];

res[i][j]=k;

}最終結果:

answer[n]=for(int i=1;i<=m;i++)max(answer[n],dp[n][i]);

for(int i=n-1;i>=1;i--)answer[i]=res[i][answer[i+1]];

則answer陣列序列就是第1到n次取到的色子編號

問題三:

(引用自

上面是已知部分隱藏鏈的直接最大似然,下面是不知隱藏鏈的用鮑姆-韋爾奇演算法

已知:隱藏狀態數(事先人為預判),輸出狀態數(從可見狀態鏈中數出來),可見狀態鏈(相當於唯一已知條件)

求解:求初始向量,轉移矩陣,輸出矩陣

方法:鮑姆-韋爾奇演算法

補充說明:

π[i]是初始向量,aij即a[i][j]轉移矩陣,bjk即b[j][k]輸出矩陣,在第一步隨機賦值

一共有d組樣本(用d遍歷),每組樣本各抽擲色子t次(用t遍歷)

此處的o[t]相當於前文設的x[i]可見狀態鏈,vk就是前面bjk中規定輸出點數是k

為什麼要寫成vk,那是因為我前文規定點數取值範圍是1開始的自然數而已,但實際上色子可擲得的點數取值範圍可以是234567,這樣就vk=k+1,k仍是取1到6,寫成vk可以更加抽象,更加一般性

補充:鮑姆-韋爾奇演算法抽象起來叫em演算法思想,在聚類時就是這種思想

不斷迭代,先e步,再m,下面列舉乙個簡單的em演算法例子演算過程

例子引用自:

演算法 學習筆記

1.輸入輸出演算法至少有乙個或多個輸出 2.有窮性 3.確定性 4.可行性 1.正確性a.演算法程式沒有語法錯誤 b.演算法程式對於合法的輸入資料能夠產生滿足要求的輸出結果 c.演算法程式對於非法的輸入資料能夠得出滿足規格說明的結果 d.演算法對於精心選擇的,甚至刁難的測試資料都有滿足要求的輸出結果...

演算法學習筆記

複雜度分析 1.只關注迴圈次數最多的一行 2.總複雜度等於量級最大 的複雜度 3.巢狀 的複雜度等於巢狀 內外複雜度的乘積 單鏈表結構和順序儲存結構的優缺點 儲存分配方式 時間效能 空間效能 單鏈表結構 用一組任意的儲存單元存放線性表元素 查詢 o n 插入和刪除 找到某位置的指標後,插入和刪除的時...

演算法學習筆記

影象分割是機器視覺後續處理的基礎,通過分割提取影象中的目標區域,方便後續進一步分析處理。分水嶺分割演算法 傳統的分水嶺演算法,是基於數學形態學的分割方法。其基本思想是,將2d影象視為3d地形 其中,畫素的座標 地形的位置,畫素的灰度 地形的高度 每乙個區域性極小值及其周圍區域稱為集水盆地,而集水盆地...