最大熵模型python實現

2021-08-18 02:17:48 字數 4186 閱讀 2819

本文參考nltk maxentclassifier實現了乙個簡單的最大熵模型,主要用於理解最大熵模型中一些數學公式的實際含義。

最大熵模型:pw

(y|x

)zw(

x)=1

zw(x

)exp

(∑i=

1nwi

fi(x

,y))

=∑ye

xp(∑

i=1n

wifi

(x,y

))這裡fi

(x,y

) 代表特徵函式,wi

代表每個特徵函式對於的權值。

如何計算測試資料x被分為類別y的概率呢?

總結成一句話:我們把x和y傳給每個特徵函式得到相應的特徵值(0或者1),然後乘上相應的權值,最後通過softmax得到。

現在面臨兩個問題。

1.這裡的fi

(x,y

) 究竟是什麼鬼,如何得到? 2.w

i 又如何求得?

先來看看第乙個問題。

fi

(x,y

) 反映的是x和y的特徵,也就是說它是對輸入和輸出同時抽取特徵的

它的定義是f(

x,y)

= 這裡的下標表示第

i 個特徵對於的

w,上標表示第t輪迭代。

2.重複以下更新直至收斂:w(

t+1)

i=w(

t)i+

1clogep̂ 

(fi)

ep(n

)(fi

),i∈

其中c一般取樣本的最大特徵數,反應了

w 更新速度。 ep

̂ (f)

=∑x,

yp̂ (

x,y)

f(x,

y)表示的是某乙個特徵函式關於經驗分布p̂ 

(x,y

) 的期望值 ep

(f)=

∑x,y

p̂ (x

)p(y

|x)f

(x,y

) 表示的是某乙個特徵函式關於模型p(

y|x)

與經驗分布p̂ 

(x) 的期望值

先來看p̂ (

x,y)

和p̂ (

x) p

̂ (x=

x,y=

y)=v

(x=x

,y=y

)n p

̂ (x=

x)=v

(x=x

)n其中v(

x=x,

y=y)

表示樣本(x

,y) 出現的頻率,v(

x=x)

表示樣本

x 出現的頻率,

n表示樣本個數。

由於我們在訓練時,樣本資料存在唯一性,因此:p̂ 

(x=x

,y=y

)=p̂ 

(x=x

)=1n

所以有:ep

̂ (f)

=1n∑

x,yf

(x,y

) ep

(f)=

1n∑x

,yp(

y|x)

f(x,

y) e

p̂ (f

i)ep

(n)(

fi)=

∑x,y

fi(x

,y)∑

x,yp

(y|x

)fi(

x,y)

∑x,yfi(

x,y)

表示的所有樣本在被某乙個特徵函式抽取的特徵值之和,**實現如下:

def

calculate_empirical_fcount

for tok, label in train_toks:

fcount[index] += val

return fcount

fcount結構為 求p

(y|x

) 的實現如下:

def

prob

prob_dict = {}

for label in labels:

total = 0.0

total += weights[index]*val

prob_dict[label] = np.exp(total)

value_sum = sum(list(prob_dict.values()))

for(label, value) in prob_dict.items():

prob_dict[label] = prob_dict[label]/value_sum

return prob_dict

∑x

,yp(

y|x)

fi(x

,y) 的實現:

def

calculate_estimated_fcount

for tok, label in train_toks:

for label, p in prob_dict.items():

fcount[index] += p*val

return fcount

完整**如下:

import numpy as np

defencode

encoding =

for (fname, fval) in featureset.items():

return encoding

defcalculate_empirical_fcount

for tok, label in train_toks:

fcount[index] += val

return fcount

defprob

prob_dict = {}

for label in labels:

total = 0.0

total += weights[index]*val

prob_dict[label] = np.exp(total)

value_sum = sum(list(prob_dict.values()))

for(label, value) in prob_dict.items():

prob_dict[label] = prob_dict[label]/value_sum

return prob_dict

defcalculate_estimated_fcount

for tok, label in train_toks:

for label, p in prob_dict.items():

fcount[index] += p*val

return fcount

defmaxent_train

(train_toks):

labels = set()

feature_name = set()

for(tok, label) in train_toks:

for(fname, fval) in tok.items():

if (fname,fval,label) not

feature_name.add(fname)

labels.add(label)

c = len(feature_name)+1

cinv = 1/c

weights = np.zeros(len(empirical_fcount))

iter = 1

while

true:

if iter == 100:

break

weights += (empirical_fcount / estimated_fcount) * cinv

iter+=1

if __name__ == '__main__':

train_data = [

(dict(a=1, b=1, c=1), '1'),

(dict(a=1, b=1, c=0), '0'),

(dict(a=0, b=1, c=1), '1')]

maxent_train(train_data)

python實現最大熵模型

encoding utf 8 created on 2017 8 7 根據李航 統計學習方法 實現 from collections import defaultdict import math class maxent object def init self self.feats default...

python實現最大熵模型

本文參考nltk maxentclassifier實現了乙個簡單的最大熵模型,主要用於理解最大熵模型中一些數學公式的實際含義。最大熵模型 pw y x zw x 1zw x exp i 1nwifi x,y yexp i 1nwifi x,y pw y x 1zw x exp i 1nwifi x,...

最大熵模型及Python實現

熵的概念源自於熱力學,在熱力學中,熵為所有可能狀態數的對數值,可以表示分子的混亂程度。將熱力學中熵的概念引入到隨機變數的分布中,則隨機變數的熵度量了其不確定性的程度。數學表達如下 最大熵原理指在滿足約束的條件下,熵最大的模型是最優的模型。可以這樣理解,滿足約束 說明該模型體現了所有已知資訊,熵最大 ...