文章原創(chuàng),最近更新:2018-08-11
本章節(jié)的主要內(nèi)容是:
重點介紹項目案例1:判定魚類和非魚類的計算給定數(shù)據(jù)集的香農(nóng)熵的函數(shù)代碼
栈虚。
1.決策樹項目案例介紹:
項目案例1:
判定魚類和非魚類
項目概述:
- 根據(jù)以下 2 個特征拥刻,將動物分成兩類:魚類和非魚類。
- 特征: 1. 不浮出水面是否可以生存 2. 是否有腳蹼
開發(fā)流程:
- 收集數(shù)據(jù):可以使用任何方法
- 準備數(shù)據(jù):樹構(gòu)造算法只適用于標稱型數(shù)據(jù),因此數(shù)值型數(shù)據(jù)必須離散化
- 分析數(shù)據(jù):可以使用任何方法,構(gòu)造樹完成之后者铜,我們應(yīng)該檢查圖形是否符合預(yù)期
- 訓(xùn)練算法:構(gòu)造樹的數(shù)據(jù)結(jié)構(gòu)
- 測試算法:使用決策樹執(zhí)行分類
- 使用算法:此步驟可以適用于任何監(jiān)督學(xué)習(xí)算法,而使用決策樹可以更好地理解數(shù)據(jù)的內(nèi)在含義
數(shù)據(jù)集介紹
2.計算給定數(shù)據(jù)集的香農(nóng)熵的函數(shù)
這段代碼主要是計算給定數(shù)據(jù)集的熵,首先創(chuàng)建一個名為trees.py的文件,并創(chuàng)建一個函數(shù)calcShannonEn()函數(shù)錄入到trees.py文件.
def calcShannonEnt(dataSet):
# 獲取數(shù)據(jù)集dataSet列表的長度,表示計算參與訓(xùn)練的數(shù)據(jù)量
numEntries=len(dataSet)
# 新建一個空字典labelCounts放椰,用以統(tǒng)計每個標簽出現(xiàn)的次數(shù),進而計算概率
labelCounts={}
for featVec in dataSet:
# featVec[-1]獲取了daatSet中每行最后一個數(shù)據(jù)作烟,作為字典中的key(標簽)
currentLabel = featVec[-1]
# 以currentLabel作為key加入到字典labelCounts.
# 如果當前的鍵值不存在,則擴展字典并將當前鍵值加入字典砾医。每個鍵值都記錄了當前類別出現(xiàn)的次數(shù)拿撩。
# 鍵值存在則則對應(yīng)value+1,否則為0
if currentLabel not in labelCounts.keys():
labelCounts[currentLabel]=0
labelCounts[currentLabel] += 1
# 對于 label 標簽的占比,求出 label 標簽的香農(nóng)熵
shannonEnt = 0.0
for key in labelCounts:
# 計算分類概率prob=標簽發(fā)生頻率,labelCounts[key]除以數(shù)據(jù)集長度numEntries
prob = float(labelCounts[key])/numEntries
# 計算香農(nóng)熵,以2為底求對數(shù)
shannonEnt -=prob * log(prob,2)
return shannonEnt
createDataSet()函數(shù)主要是簡單魚鑒定數(shù)據(jù)集.并錄入到trees.py.
測試數(shù)據(jù)集
def createDataSet():
dataSet = [[1, 1, 'yes'],
[1, 1, 'yes'],
[1, 0, 'no'],
[0, 1, 'no'],
[0, 1, 'no']]
labels = ['no surfacing','flippers']
return dataSet, labels
測試代碼及其結(jié)果如下:
import trees
a, b = trees.createDataSet()
trees.calcShannonEnt(a)
Out[90]: 0.9709505944546686
通過數(shù)學(xué)方式計算以上數(shù)據(jù)集的信息熵
yes | no | 總共 | |
---|---|---|---|
個數(shù) | 2 | 3 | 5 |
比率 | \frac{2}{5} | \frac{3}{5} | 1 |
則為:
=-(\frac{2}{5}\log_{2}\frac{2}{5}+\frac{3}{5}\log_{2}\frac{3}{5})=0.97095
熵越高如蚜,則數(shù)據(jù)越混亂压恒,這里可在數(shù)據(jù)集dataSet列表里修改第0個元素 [1, 1, 'yes']更改為[1, 1, 'maybe'],分類看下熵的變化,復(fù)制以上代碼運行下:
def createDataSet():
dataSet = [[1, 1, 'maybe'],
[1, 1, 'yes'],
[1, 0, 'no'],
[0, 1, 'no'],
[0, 1, 'no']]
labels = ['no surfacing','flippers']
return dataSet, labels
測試代碼及其結(jié)果如下:
import trees
a, b = trees.createDataSet()
trees.calcShannonEnt(a)
Out[97]: 1.3709505944546687
通過數(shù)學(xué)方式計算以上數(shù)據(jù)集的信息熵
maybe | yes | no | 總共 | |
---|---|---|---|---|
個數(shù) | 1 | 1 | 3 | 5 |
比率 | \frac{1}{5} | \frac{1}{5} | \frac{3}{5} | 1 |
則為:
=-(\frac{1}{5}\log_{2}\frac{1}{5}+\frac{1}{5}\log_{2}\frac{1}{5}+\frac{3}{5}\log_{2}\frac{3}{5})=1.37095
3.相關(guān)知識點
3.1香農(nóng)熵(又名信息熵)
香農(nóng)熵如果要用平民語言說得盡可能直白的話错邦,可以認為是信息的雜亂程度的量化描述探赫。具體公式如下:
H(x)=-\sum_{i=1}^{n}p(x_{i})\log_{2}P(x_{i}),i=1,2,...,n
其中,x可以當成一個向量撬呢,就是若干個xi產(chǎn)生的概率乘以該可能性的信息量伦吠,然后各項做加和。
備注:在其他資料上會看到這里的log是取10的對數(shù)lg魂拦,或者自然常數(shù)e的ln自然對數(shù)毛仪。這里強調(diào)一下,在應(yīng)用的過程中用任何一種值做底都是可以的芯勘,但是注意在某一次應(yīng)用的整個過程中箱靴,參與本次應(yīng)用的所有香農(nóng)熵都必須采用同一個底,不能將不同底的對數(shù)求出的熵再做加和或者比較荷愕,這樣完全沒有意義(就好像3米和2英尺衡怀,雖然都是長度單位,但是3米+2英尺既得不到5米也得不到5英尺)路翻。
案例1:2選1“一邊倒”
假設(shè)中國乒乓球隊和巴西乒乓球隊歷史交手共64次,其中中國獲勝63次茄靠,63/64是賽前普遍認可的中國隊獲勝的概率——注意茂契,這個是先驗概率。中國乒乓球隊和巴西乒乓球隊比賽的結(jié)果的香農(nóng)熵約為
中國 | 巴西 | 總共 | |
---|---|---|---|
獲勝次數(shù) | 63 | 1 | 64 |
比率 | \frac{63}{64} | \frac{1}{64} | 1 |
H(x)=-(\frac{63}{64}\log_{2}\frac{63}{64}+\frac{1}{64}\log_{2}\frac{1}{64})=0.1164
總結(jié):
對于無限不循環(huán)小數(shù)只能根據(jù)需要取一個近似值慨绳,注意這是一個“2選1的情況掉冶,并且確定性相當高”的事件的熵真竖。
案例2:2選1“差不多”
再看一個兩者勢均力敵的例子,假設(shè)德國乒乓球隊和法國乒乓球隊比賽厌小,雙方歷史交手64次恢共,交手勝負為32:32,那么1/2是賽前普遍認可的德國隊的獲勝概率璧亚,同時也是法國隊的獲勝概率讨韭。德國乒乓球隊和法國乒乓球隊比賽的結(jié)果的香農(nóng)熵約為
中國 | 巴西 | 總共 | |
---|---|---|---|
獲勝次數(shù) | 32 | 32 | 64 |
比率 | \frac{1}{2} | \frac{1}{2} | 1 |
H(x)=-(\frac{1}{2}\log_{2}\frac{1}{2}+\frac{1}{2}\log_{2}\frac{1}{2})=1
案例3:32選1“差不多”
如果在足球世界杯決賽階段,即假設(shè)32支球隊獲得冠軍等概率的情況下進行香農(nóng)熵的計算癣蟋。(一共32個)
隊伍1 | 隊伍2 | 隊伍i | 隊伍32 | 總共 | |
---|---|---|---|---|---|
獲勝次數(shù) | 1 | 1 | ... | 1 | 32 |
比率 | \frac{1}{32} | \frac{1}{32} | ... | \frac{1}{32} | 1 |
H(x)=-(\frac{1}{32}\log_{2}\frac{1}{32}+\frac{1}{32}\log_{2}\frac{1}{32}+...\frac{1}{32}\log_{2}\frac{1}{32})=5
案例4:32選1“一邊倒”
假設(shè)隊伍1獲勝概率為99%透硝,而其他31支隊伍每一支隊伍的獲勝概率都為1%/31,求比賽結(jié)果的香農(nóng)熵為多少疯搅。(一共32個)
隊伍1 | 隊伍2 | 隊伍i | 隊伍32 | 總共 | |
---|---|---|---|---|---|
比率 | 0.99 | 0.01/31 | ... | 0.01/31 | 1 |
H(x)=-(0.99log_{2}0.99+0.01log_{2}\frac{0.01}{31}+...0.01log_{2}\frac{0.01}{31}=0.130
結(jié)論:
- 在信息可能有N種情況時濒生,如果每種情況出現(xiàn)的概率相等,那么N越大幔欧,香農(nóng)熵越大罪治。
- 在信息可能有N種情況時,當N一定礁蔗,那么其中所有情況概率相等時香農(nóng)熵是最大的觉义,而如果有一種情況的概率比其他情況的概率都大很多,那么香農(nóng)熵就會越小瘦麸。
具體的值在具體情況可以進行量化的計算比較谁撼。籠統(tǒng)地說就是:
信息越確定滋饲,越單一厉碟,香農(nóng)熵越小屠缭;
信息越不確定箍鼓,越混亂,香農(nóng)熵越大呵曹。