**如下:
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...