本文將講解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地形 其中,畫素的座標 地形的位置,畫素的灰度 地形的高度 每乙個區域性極小值及其周圍區域稱為集水盆地,而集水盆地...