1.馬爾科夫過程假設乙個隨機過程中, ??時刻的狀態 ??的條件發布,只與其前一狀態 ??−1相關
2.隱馬爾科夫演算法隱馬爾科夫演算法是對含有未知引數(隱狀態)的馬爾可夫鏈進行建模的生成模型,在隱馬爾科夫模型中,包含隱狀態 和 觀察狀態,隱狀態 ??對於觀察者而言是不可見的,而觀察狀態 ??對於觀察者而言是可見的。隱狀態間存在轉移概率,隱狀態 ??到對應的觀察狀態 ??間存在輸出概率。
3.基本問題條件隨機場包含概率計算問題、學習問題和**問題三個問題:
import numpy as np
class
crf(
object):
'''實現條件隨機場**問題的維特比演算法
'''def__init__
(self, v, vw, e, ew)
:'''
:param v:是定義在節點上的特徵函式,稱為狀態特徵
:param vw:是v對應的權值
:param e:是定義在邊上的特徵函式,稱為轉移特徵
:param ew:是e對應的權值
'''self.v = v #點分布表
self.vw = vw #點權值表
self.e = e #邊分布表
self.ew = ew #邊權值表
self.d =
#delta表,最大非規範化概率的區域性狀態路徑概率
self.p =
#psi表,當前狀態和最優前導狀態的索引表s
self.bp =
#bestpath,最優路徑
return
defviterbi
(self)
:'''
條件隨機場**問題的維特比演算法,此演算法一定要結合crf引數化形式對應的狀態路徑圖來理解,更容易理解.
'''self.d = np.full(shape=
(np.shape(self.v)
), fill_value=.0)
self.p = np.full(shape=
(np.shape(self.v)
), fill_value=.0)
for i in
range
(np.shape(self.v)[0
]):#初始化if0
== i:
self.d[i]
= np.multiply(self.v[i]
, self.vw[i]
) self.p[i]
= np.array([0
,0])
print
('self.v[%d]='
%i, self.v[i]
,'self.vw[%d]='
%i, self.vw[i]
,'self.d[%d]='
%i, self.d[i]
)print
('self.p:'
, self.p)
pass
#遞推求解布局最優狀態路徑
else
:for y in
range
(np.shape(self.v)[1
]):#delta[i][y=1,2...]
for l in
range
(np.shape(self.v)[1
]):#v[i-1][l=1,2...]
delta =
0.0 delta += self.d[i-
1, l]
#前導狀態的最優狀態路徑的概率
delta += self.e[i-1]
[l,y]
*self.ew[i-1]
[l,y]
#前導狀態到當前狀體的轉移概率
delta += self.v[i,y]
*self.vw[i,y]
#當前狀態的概率
print
('(x%d,y=%d)-->(x%d,y=%d):%.2f + %.2f + %.2f='
%(i-
1, l, i, y, \
self.d[i-
1, l]
, \ self.e[i-1]
[l,y]
*self.ew[i-1]
[l,y]
, \ self.v[i,y]
*self.vw[i,y]
), delta)if0
== l or delta > self.d[i, y]
: self.d[i, y]
= delta
self.p[i, y]
= l print
('self.d[x%d,y=%d]=%.2f\n'
%(i, y, self.d[i,y]))
print
('self.delta:\n'
, self.d)
print
('self.psi:\n'
, self.p)
#返回,得到所有的最優前導狀態
n = np.shape(self.v)[0
] self.bp = np.full(shape=
(n,)
, fill_value=
0.0)
t_range =-1
* np.array(
sorted(-
1*np.arange(n)))
for t in t_range:
if n-
1== t:
#得到最優狀態
self.bp[t]
= np.argmax(self.d[-1
])else
:#得到最優前導狀態
self.bp[t]
= self.p[t+1,
int(self.bp[t+1]
)]#最優狀態路徑表現在儲存的是狀態的下標,我們執行儲存值+1轉換成示例中的狀態值
#也可以不用轉換,只要你能理解,self.bp中儲存的0是狀態1就可以~~~~
self.bp +=
1print
('最優狀態路徑為:'
, self.bp)
return self.bp
defcrf_manual()
:
s = np.array([[
1,1]
,#x1:s(y1=1), s(y1=2)[1
,1],
#x2:s(y2=1), s(y2=2)[1
,1]]
)#x3:s(y3=1), s(y3=1)
sw = np.array([[
1.0,
0.5]
,#x1:sw(y1=1), sw(y1=2)
[0.8
,0.5],
#x2:sw(y2=1), sw(y2=2)
[0.8
,0.5]]
)#x3:sw(y3=1), sw(y3=1)
e = np.array([[
[1,1
],#edge:y1=1--->(y2=1, y2=2)[1
,0]]
,#edge:y1=2--->(y2=1, y2=2)[[
0,1]
,#edge:y2=1--->(y3=1, y3=2) [1
,1]]
])#edge:y2=2--->(y3=1, y3=2)
ew= np.array([[
[0.6,1
],#edgew:y1=1--->(y2=1, y2=2)[1
,0.0]]
,#edgew:y1=2--->(y2=1, y2=2)[[
0.0,1]
,#edgew:y2=1--->(y3=1, y3=2)[1
,0.2]]
])#edgew:y2=2--->(y3=1, y3=2)
crf = crf(s, sw, e, ew)
ret = crf.viterbi(
)print
('最優狀態路徑為:'
, ret)
return
if __name__==
'__main__'
: crf_manual(
)
參考部落格
機器學習演算法筆記 4 條件隨機場
1.馬爾可夫鏈 通俗理解馬爾可夫鏈 假設乙個隨機過程中,t nt n tn 時刻的狀態x nx n xn 的條件發布,只與其前一狀態xn 1x xn 1 p x n x1 x2,xn 1 p xn x n 1 p x n x 1,x 2,x p x n x p xn x1 x2 xn 1 p xn ...
Task04條件隨機場
條件隨機場 條件隨機場是一種判別式無向圖模型。條件隨機場試圖對多個變數在給定觀測值後的條件概率進行建模。給定x x1,x 2,xn y y 1,y2 y n x x 1,x 2,dots,x n y y 1,y 2,dots,y n x x1 x2 x n y y 1 y 2 yn 均為線性鏈表示的...
Task04 條件隨機場
理解條件隨機場最好的辦法就是用乙個現實的例子來說明它。但是目前中文的條件隨機場文章鮮有這樣幹的,可能寫文章的人都是大牛,不屑於舉例子吧。於是乎,我翻譯了這篇文章。希望對其他夥伴有所幫助。原文在這裡 想直接看英文的朋友可以直接點進去了。我在翻譯時並沒有拘泥於原文,許多地方都加入了自己的理解,用學術點的...