python写dnf游戏脚本辅助_HMM-维特比算法明白与实现(python)_dnf辅助,r6辅助
基于ELK搭建MySQL日志平臺的要點和常見錯誤絕地求生卡盟
解碼問題
給定觀察序列 (O=O_1O_2...O_T),模子 (lambda (A,B,pi)),找到最可能的狀態序列 (I^?={i^?_1,i^?_2,...i^?_T})
近似算法
在每個時刻 (t) 選擇最可能的狀態,獲得對應的狀態序列
憑據HMM-前向后向算法盤算時刻 (t) 處于狀態 (i^*_t) 的概率:
[i^?_t=argmax[gamma_t(i)],t=1,2,...T gamma_t(i) = frac{alpha_{i}(t) beta_{i}(t)}{sum_{i=1}^{N} alpha_{i}(t) beta_{i}(t)} ]
然則無法保證獲得的解是全局最優解
維特比算法
維特比算法的基礎可以歸納綜合為下面三點(來源于吳軍:數學之美):
若是概率最大的路徑經由籬笆網絡的某點,則從起始點到該點的子路徑也一定是從最先到該點路徑中概率最大的。
假定第 t 時刻有 k 個狀態,從最先到 t 時刻的 k 個狀態有 k 條最短路徑,而最終的最短路徑一定經由其中的一條。
憑據上述性子,在盤算第 t 1 時刻的最短路徑時,只需要思量從最先到當前的k個狀態值的最短路徑和當前狀態值到第 t 1 時刻的最短路徑即可。如求t=3時的最短路徑,即是求t=2時,從起點到當前時刻的所有狀態結點的最短路徑加上t=2到t=3的各節點的最短路徑。
通俗明白維特比算法,對上面三點加深明白
如果你從S和E之間找一條最短的路徑,最簡樸的方式就是列出所有可能的路徑 ((O(T^N))),選出最小的,顯然時間復雜度太高。怎么辦?(摘自[3])
使用維特比算法
S到A列的路徑有三種可能:S-A1,S-A2,S-A3,如下圖
S-A1,S-A2,S-A3 中肯定有一個屬于全局最短路徑。繼續往右,到了B列
對B1:
會發生3條路徑:
S-A1-B1,S-A2-B1,S-A3-B1
假設S-A3-B1是最短的一條,刪掉其他兩條。獲得
對B2:
會發生3條路徑:
S-A1-B2,S-A2-B2,S-A3-B2
假設S-A1-B2是最短的一條,刪掉其他兩條。獲得
對B3:
會發生3條路徑:
S-A1-B3,S-A2-B3,S-A3-B3
假設S-A2-B3是最短的一條,刪掉其他兩條。獲得
現在我們看看對B列的每個節點有哪些,回首維特比算法第二點
假定第 t 時刻有 k 個狀態,從最先到 t 時刻的 k 個狀態有 k 條最短路徑,而最終的最短路徑一定經由其中的一條
B列有三個節點,以是會有三條最短路徑,最終的最短路徑一定會經由其中一條。如下圖
同理,對C列,會獲得三條最短路徑,如下圖,dnf腳本,
到目前為止,仍然無法確定哪條屬于全局最短。最后,我們繼續看E節點
最終發現最短路徑為S-A1-B2-C3-E
數學形貌
在上述過程中,對每一列(每個時刻)會獲得對應狀態數的最短路徑。在數學上若何表達?紀錄路徑的最大概率值 $ delta_t(i)$ 和對應路徑經由的節點 (psi_t(i))。
界說在時刻 (t) 狀態為 (i) 的所有單條路徑中概率最大值為
[delta_{t}(i)=max _{i_{1}, i_{2}, ldots, i_{t-1}} Pleft(i_{t}=i, i_{t-1}, ldots, i_{1}, o_{t}, ldots, o_{1} | lambdaright), i=1,2, ldots, N ]
遞推公式
[begin{aligned} delta_{t 1}(i) &=max _{i_{1}, i_{2}, ldots, i_{t}} Pleft(i_{t 1}=i, i_{t}, ldots, i_{1}, o_{t 1}, ldots, o_{1} | lambdaright) &=max _{1 leq j leq N}left[delta_{t}(j) a_{j i}right] b_{i}left(o_{t 1}right), i=1,2, ldots, N ; t=1,2, ldots, T-1 end{aligned} ]
界說在時刻 (t) 狀態為 (i) 的所有單條路徑中,概率最大路徑的第 (t - 1) 個節點為
[psi_{t}(i)=arg max _{1 leq j leq N}left[delta_{t-1}(j) a_{j i}right], i=1,2, ldots, N ]
維特比算法步驟:
? step1:初始化
[begin{aligned}&delta_{1}(i)=pi_{i} b_{i}left(o_{1}right), i=1,2, ldots, N&psi_{1}(i)=0, i=1,2, ldots, Nend{aligned} ]
? step2:遞推,對 (t=2,3,...,T)
[delta_{t}(i)=max _{1 leq j leq N}left[delta_{t-1}(j) a_{j i}right] b_{i}left(o_{t}right), i=1,2, ldots, N psi_{t}(i)=arg max _{1 leq j leq N}left[delta_{t-1}(j) a_{j i}right], i=1,2, ldots, N ]
? step3:盤算時刻 (T) 最大的 $ delta _T(i)(,即為最可能隱藏狀態序列泛起的概率。盤算時刻)T(最大的)psi_T(i)(,即為時刻)T$最可能的隱藏狀態。
[P^{*}=max _{1 leq i leq N} delta_{T}(i) quad i_{T}^{*}=arg max _{1 leq i leq N} delta_{T}(i) ]
? step4:最優路徑回溯,對(t=T-1,...,1)
[i_{t}^{*}=psi_{t 1}left(i_{t 1}^{*}right)I^*=(i_{1}^{*},i_{2}^{*},...,i_{T}^{*}) ]
代碼實現
假設從三個 袋子 {1,2,3}中 取出 4 個球 O={red,white,red,white},模子參數(lambda = (A,B,pi)) 如下,盤算狀態序列,即取出的球來自哪個袋子
#狀態 1 2 3
A = [[0.5,0.2,0.3],
[0.3,0.5,0.2],
[0.2,0.3,0.5]]
pi = [0.2,0.4,0.4]
# red white
B = [[0.5,0.5],
[0.4,0.6],
[0.7,0.3]]
def hmm_viterbi(A,B,pi,O):
T = len(O)
N = len(A[0])
delta = [[0]*N for _ in range(T)]
psi = [[0]*N for _ in range(T)]
#step1: init
for i in range(N):
delta[0][i] = pi[i]*B[i][O[0]]
psi[0][i] = 0
#step2: iter
for t in range(1,T):
for i in range(N):
temp,maxindex = 0,0
for j in range(N):
res = delta[t-1][j]*A[j][i]
if res>temp:
temp = res
maxindex = j
delta[t][i] = temp*B[i][O[t]]#delta
psi[t][i] = maxindex
#step3: end
p = max(delta[-1])
for i in range(N):
if delta[-1][i] == p:
i_T = i
#step4:backtrack
path = [0]*T
i_t = i_T
for t in reversed(range(T-1)):
i_t = psi[t 1][i_t]
path[t] = i_t
path[-1] = i_T
return delta,psi,path
A = [[0.5,0.2,0.3],[0.3,0.5,0.2],[0.2,0.3,0.5]]
B = [[0.5,0.5],[0.4,0.6],[0.7,0.3]]
pi = [0.2,0.4,0.4]
O = [0,1,0,1]
hmm_viterbi(A,B,pi,O)
效果
references:
iOS中的事件響應鏈、單例模式、工廠模式、觀察者模式
總結
以上是生活随笔為你收集整理的python写dnf游戏脚本辅助_HMM-维特比算法明白与实现(python)_dnf辅助,r6辅助的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PFU 扫描仪将于 4 月由富士通变更为
- 下一篇: Meta“效率之年”并不高效:裁员传闻导