Task04條件隨機場

2021-10-05 14:51:52 字數 4566 閱讀 6313

條件隨機場

條件隨機場是一種判別式無向圖模型。條件隨機場試圖對多個變數在給定觀測值後的條件概率進行建模。

給定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.隱馬爾科夫演算法 隱馬爾科夫演算法是對含有未知引數 隱狀態 的馬爾可夫鏈進行建模的生成模型,在隱馬爾科夫模型中,包含隱狀態 和 觀察狀態,隱狀態 對於觀察者而言是不可見的,而觀察狀態 對於觀察者而言是可見的。隱...