條件隨機場
條件隨機場是一種判別式無向圖模型。條件隨機場試圖對多個變數在給定觀測值後的條件概率進行建模。
給定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
)均為線性鏈表示的隨機變數序列,若在給隨機變數序列 x
xx 的條件下,隨機變數序列 y
yy 的條件概率分布p(y
∣x
)p(y|x)
p(y∣x)
構成條件隨機場,即滿足馬爾可夫性
katex parse error: undefined control sequence: \x at position 21: …|x_1,x_2,\dots,\̲x̲_,y_1,y_2,…
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(
)
Task04 條件隨機場
理解條件隨機場最好的辦法就是用乙個現實的例子來說明它。但是目前中文的條件隨機場文章鮮有這樣幹的,可能寫文章的人都是大牛,不屑於舉例子吧。於是乎,我翻譯了這篇文章。希望對其他夥伴有所幫助。原文在這裡 想直接看英文的朋友可以直接點進去了。我在翻譯時並沒有拘泥於原文,許多地方都加入了自己的理解,用學術點的...
機器學習演算法 Task04條件隨機場(CRF)
最近看了一些有關於crf的 基本概念懂,但是到求解的部分有些疑惑。crf問題容易構成np hard問題,求解過程還需要再學習。下面稍微介紹一些crf的學習吧,這裡前面crf內容主要參考了下面博文,講的非常好 條件隨機場 conditional random fields 是一種判別式圖模型,因為其強...
ML Day4 條件隨機場
1.馬爾科夫過程 假設乙個隨機過程中,時刻的狀態 的條件發布,只與其前一狀態 1相關 2.隱馬爾科夫演算法 隱馬爾科夫演算法是對含有未知引數 隱狀態 的馬爾可夫鏈進行建模的生成模型,在隱馬爾科夫模型中,包含隱狀態 和 觀察狀態,隱狀態 對於觀察者而言是不可見的,而觀察狀態 對於觀察者而言是可見的。隱...