求訓練集的熵和資訊增益

2021-10-09 14:30:42 字數 3766 閱讀 2967

**如下:

import math

l =[

's',

's',

'i',

'm',

'i',

'm',

'm',

'i',

'm',

's']

f =[

's',

'i',

'm',

'm',

'm',

'i',

's',

'm',

's',

's']

h =[

'n',

'y',

'y',

'y',

'y',

'n',

'n',

'n',

'y',

'y']

r =[

'n',

'y',

'y',

'y',

'y',

'y',

'n',

'y',

'y',

'n']

defh_r

(data)

:#求r熵的函式

y,n =0,

0for i in data:

if i ==

'y':

y +=

1#統計r中為y的個數

else

: n +=

1#統計r中為n的個數

ry = y/

(y+n)

rn = n/

(y+n)

hr =

-ry*math.log(ry,2)

-rn*math.log(rn,2)

#求r的熵

return hr

defh_rx

(data1,data2)

:#求h(r|l)和h(r|f)函式

s,m,i =0,

0,0for i in data1:

if i ==

's':

s +=

1#統計s的個數

elif i ==

'm':

m +=

1#統計m的個數

else

: i +=

1#統計i的個數

rs = s/

(s+m+i)

rm = m/

(s+m+i)

ri = i/

(s+m+i)

#分別求s,m,i的概率

rate =

[rs,rm,ri]

ty,tn,hr_x =0,

0,0 count =-1

#這是乙個計數器

for i in

['s'

,'m'

,'i']:

wd =

[k for k,x in

enumerate

(data1)

if x==i]

#分別定位所有s,m,i在列表中的位置

count +=

1#作為計數器標記rate列表對應元素

for j in wd:

if data2[j]

=='y'

: ty +=

1#統計分別在s,m,i對應的y的數量

elif data2[j]

=='n'

: tn +=

1#統計分別在s,m,i對應的n的數量

ry_x = ty/

(ty+tn)

rn_x = tn/

(ty+tn)

#分別求在s,m,i下y,n的概率

ty,tn =0,

0#讓上次統計的數量清0,使得下一次統計重新開始,防止與上次疊加

if ry_x==

0or rn_x ==0:

#防止出現0log0而無法計算

hr_x +=

0else

: hr_x +=

-rate[count]

*(ry_x*math.log(ry_x,2)

+rn_x*math.log(rn_x,2)

)return hr_x

defh_rh

(data1,data2)

: y,n =0,

0for i in data1:

if i ==

'y':

y +=

1else

: n +=

1#分別統計h中y和n的數量

ry = y/

(y+n)

rn = n/

(y+n)

#分別求出h中y、n的概率

rate =

[ry,rn]

ty,tn,hr_h =0,

0,0 count =-1

for i in

['y'

,'n']:

wd =

[k for k,x in

enumerate

(data1)

if x==i]

#分別定位h中所有y和n在列表中的位置

count +=

1for j in wd:

if data2[j]

=='y'

: ty +=

1#統計分別在h中的y、n對應的y的數量

elif data2[j]

=='n'

: tn +=

1#統計分別在h中的y、n對應的n的數量

ry_h = ty/

(ty+tn)

rn_h = tn/

(ty+tn)

#分別求在h的y、n下y,n的概率

ty,tn =0,

0#讓上次統計的數量清0,使得下一次統計重新開始,防止與上次疊加

if ry_h==

0or rn_h ==0:

#防止出現0log0而無法計算

hr_h +=

0else

: hr_h +=

-rate[count]

*(ry_h*math.log(ry_h,2)

+rn_h*math.log(rn_h,2)

)return hr_h

defg_hx

(hr,hr_x)

: gh_x = hr-hr_x

return gh_x

r = h_r(r)

l = h_rx(l,r)

f = h_rx(f,r)

h = h_rh(h,r)

print

("資訊熵分別為\n hr=\n h(r|l)=\n h(r|f)=\n h(r|h)="

.format

(h_r(r)

,h_rx(l,r)

,h_rx(f,r)

,h_rh(h,r)))

print

("資訊增益分別為\n g(l)=\n g(f)=\n g(h)="

.format

(g_hx(r,l)

,g_hx(r,f)

,g_hx(r,h)

))

執行結果如下:

熵和資訊增益

資訊理論中廣泛使用的乙個度量標準,稱為熵 entropy 它刻畫了任意樣例集的純度。給定包含關於某個目標概念的正反樣例的樣例集s,那麼s相對於這個布林型分類的熵為 其中,p 代表正樣例,比如p 則意味著去打羽毛球,而p 則代表反樣例,不去打球。注意 如果s的所有成員屬於同一類,那麼s的熵為0 如果集...

機器學習 資訊熵 資訊增益的概念

資訊熵表示 隨機變數 的不確定性。不確定性越大 即所謂的資訊量越大 資訊熵越大。首先從直覺上來講,是可以的。不然我們怎麼覺得有的人廢話特別多,卻沒什麼資訊量 而有的人一語中的,一句話就傳達了很大的資訊量。有些事情本來不是很確定 例如 明天 是漲是跌 1 明天nba決賽開始了 和 跌漲 沒關係,所以 ...

決策樹中熵和資訊增益的計算

資訊熵很亮的是在你知道乙個事件的結果後,平均會帶給你多大的資訊量,當事件的不確定性越大,那麼要搞清它所需要的資訊量也就越大,也就是資訊熵越大,是無序性,不確定性的度量指標。資訊熵的計算 p i logp i 底數為2 public static double calcentropy int p fo...