西瓜數據集D如下:
編號 | 色澤 | 根蒂 | 敲聲 | 紋理 | 臍部 | 觸感 | 好瓜 |
---|---|---|---|---|---|---|---|
1 | 青綠 | 蜷縮 | 濁響 | 清晰 | 凹陷 | 硬滑 | 是 |
2 | 烏黑 | 蜷縮 | 沉悶 | 清晰 | 凹陷 | 硬滑 | 是 |
3 | 烏黑 | 蜷縮 | 濁響 | 清晰 | 凹陷 | 硬滑 | 是 |
4 | 青綠 | 蜷縮 | 沉悶 | 清晰 | 凹陷 | 硬滑 | 是 |
5 | 淺白 | 蜷縮 | 濁響 | 清晰 | 凹陷 | 硬滑 | 是 |
6 | 青綠 | 稍蜷 | 濁響 | 清晰 | 稍凹 | 軟粘 | 是 |
7 | 烏黑 | 稍蜷 | 濁響 | 稍糊 | 稍凹 | 軟粘 | 是 |
8 | 烏黑 | 稍蜷 | 濁響 | 清晰 | 稍凹 | 硬滑 | 是 |
9 | 烏黑 | 稍蜷 | 沉悶 | 稍糊 | 稍凹 | 硬滑 | 否 |
10 | 青綠 | 硬挺 | 清脆 | 清晰 | 平坦 | 軟粘 | 否 |
11 | 淺白 | 硬挺 | 清脆 | 模糊 | 平坦 | 硬滑 | 否 |
12 | 淺白 | 蜷縮 | 濁響 | 模糊 | 平坦 | 軟粘 | 否 |
13 | 青綠 | 稍蜷 | 濁響 | 稍糊 | 凹陷 | 硬滑 | 否 |
14 | 淺白 | 稍蜷 | 沉悶 | 稍糊 | 凹陷 | 硬滑 | 否 |
15 | 烏黑 | 稍蜷 | 濁響 | 清晰 | 稍凹 | 軟粘 | 否 |
16 | 淺白 | 蜷縮 | 濁響 | 模糊 | 平坦 | 硬滑 | 否 |
17 | 青綠 | 蜷縮 | 沉悶 | 稍糊 | 稍凹 | 硬滑 | 否 |
即集合D為分類問題,分類瓜的好壞是一個二分類問題,故|y| =2 ,故只存在p1,p2
信息熵為衡量信息混亂程度的量
記好瓜比例為p1,壞瓜比例為p2
1. 若全是好瓜 , 則 p 1 = 1 , p 2 = 0 E n t ( D ) = ? ∑ k = 1 ∣ y ∣ p k l o g 2 p k = ? ( p 1 l o g 2 p 1 + p 2 l o g 2 p 2 ) = 1 ? l o g 2 ? 1 + 0 ? l o g 2 ? 0 = 0 2. 若全是好瓜 , 則 p 1 = 0 , p 2 = 1 E n t ( D ) = ? ∑ k = 1 ∣ y ∣ p k l o g 2 p k = ? ( p 1 l o g 2 p 1 + p 2 l o g 2 p 2 ) = 0 ? l o g 2 ? 0 + 1 ? l o g 2 ? 1 = 0 則完全不混亂為全是好瓜或全是壞瓜 , E n t ( D ) = 0 2. 若全是好壞瓜個一半 , 則 p 1 = 1 2 , p 2 = 1 2 E n t ( D ) = ? ∑ k = 1 ∣ y ∣ p k l o g 2 p k = ? ( p 1 l o g 2 p 1 + p 2 l o g 2 p 2 ) = ? ( 1 2 ? l o g 2 ? 1 2 + 1 2 ? l o g 2 ? 1 2 ) = 1 則最混亂為 E n t ( D ) = 1 1.若全是好瓜,則p_1=1,p_2=0 \\ Ent(D) = -\sum\limits _{k=1}^{|y|}p_klog_2p_k \\= -(p_1log_2p_1 + p_2log_2p_2 ) \\=1\cdot log_2\cdot 1 + 0\cdot log_2\cdot 0 \\=0\\ 2.若全是好瓜,則p_1=0,p_2=1 \\ Ent(D) = -\sum\limits _{k=1}^{|y|}p_klog_2p_k \\= -(p_1log_2p_1 + p_2log_2p_2 ) \\=0\cdot log_2\cdot 0 + 1\cdot log_2\cdot 1 \\=0\\ 則完全不混亂為全是好瓜或全是壞瓜,Ent(D) = 0\\ 2.若全是好壞瓜個一半,則p_1=\frac12,p_2=\frac12 \\ Ent(D) = -\sum\limits _{k=1}^{|y|}p_klog_2p_k \\= -(p_1log_2p_1 + p_2log_2p_2 ) \\=-(\frac12\cdot log_2\cdot \frac12 + \frac12\cdot log_2\cdot \frac12 )\\=1\\ 則最混亂為Ent(D) = 1 1.若全是好瓜,則p1?=1,p2?=0Ent(D)=?k=1∑∣y∣?pk?log2?pk?=?(p1?log2?p1?+p2?log2?p2?)=1?log2??1+0?log2??0=02.若全是好瓜,則p1?=0,p2?=1Ent(D)=?k=1∑∣y∣?pk?log2?pk?=?(p1?log2?p1?+p2?log2?p2?)=0?log2??0+1?log2??1=0則完全不混亂為全是好瓜或全是壞瓜,Ent(D)=02.若全是好壞瓜個一半,則p1?=21?,p2?=21?Ent(D)=?k=1∑∣y∣?pk?log2?pk?=?(p1?log2?p1?+p2?log2?p2?)=?(21??log2??21?+21??log2??21?)=1則最混亂為Ent(D)=1
當前樣本集合D中第k類樣本所占比例為pk(k=1,2,3,…,|y|),則D的信息熵為:
E n t ( D ) = ? ∑ k = 1 ∣ y ∣ p k l o g 2 p k Ent(D) = -\sum\limits _{k=1}^{|y|}p_klog_2p_k Ent(D)=?k=1∑∣y∣?pk?log2?pk?
信息增益為:
G a i n ( D , a ) = E n t ( D ) ? ∑ v = 1 V ∣ D v ∣ ∣ D ∣ E n t ( D v ) Gain(D,a) = Ent(D) - \sum\limits _{v=1}^V \frac{|Dv|}{|D|}Ent(D^v) Gain(D,a)=Ent(D)?v=1∑V?∣D∣∣Dv∣?Ent(Dv)
import math
D = [
['青綠','蜷縮','濁響','清晰','凹陷','硬滑','是'],
['烏黑','蜷縮','沉悶','清晰','凹陷','硬滑','是'],
['烏黑','蜷縮','濁響','清晰','凹陷','硬滑','是'],
['青綠','蜷縮','沉悶','清晰','凹陷','硬滑','是'],
['淺白','蜷縮','濁響','清晰','凹陷','硬滑','是'],
['青綠','稍蜷','濁響','清晰','稍凹','軟粘','是'],
['烏黑','稍蜷','濁響','稍糊','稍凹','軟粘','是'],
['烏黑','稍蜷','濁響','清晰','稍凹','硬滑','是'],
['烏黑','稍蜷','沉悶','稍糊','稍凹','硬滑','否'],
['青綠','硬挺','清脆','清晰','平坦','軟粘','否'],
['淺白','硬挺','清脆','模糊','平坦','硬滑','否'],
['淺白','蜷縮','濁響','模糊','平坦','軟粘','否'],
['青綠','稍蜷','濁響','稍糊','凹陷','硬滑','否'],
['淺白','稍蜷','沉悶','稍糊','凹陷','硬滑','否'],
['烏黑','稍蜷','濁響','清晰','稍凹','軟粘','否'],
['淺白','蜷縮','濁響','模糊','平坦','硬滑','否'],
['青綠','蜷縮','沉悶','稍糊','稍凹','硬滑','否']
]
A = ['色澤','根蒂','敲聲','紋理','臍部','觸感','好瓜']# 當前樣本集合D中第k類樣本所占比例為pk(k=1,2,3,…,|y|)
# 計算A的信息熵,以數據最后一列為分類
def getEnt(D):# 獲取一個類型k->出現次數的mapkMap = dict()for dLine in D:# 獲取分類值kk = dLine[len(dLine) - 1]# 獲取當前k出現的次數kNum = kMap.get(k)if kNum is None:kMap[k] = 1else:kMap[k] = kNum + 1# 遍歷mapdLen = len(D)rs = 0for kk in kMap:pk = kMap[kk]/dLenrs = rs + pk * math.log2(pk)return -rs# 求信息增益,aIndex為屬性列號
def getGain(D,aIndex):dMap = dict()for dLine in D:# 獲取屬性k = dLine[aIndex]# 屬性所屬的數組dChildren = dMap.get(k)if dChildren is None:dChildren = []dMap[k] = dChildrendChildren.append(dLine)rs = 0 for key in dMap:dChildren = dMap[key]entx = getEnt(dChildren)print(entx)r = len(dChildren)/len(D) * entxrs = rs + rreturn getEnt(D) - rs