<h1>計(jì)算給定數(shù)據(jù)的信息熵<h1>
我們的數(shù)據(jù)集如下表所示:
這里寫圖片描述
根據(jù)這張表,我們使用Python來構(gòu)建我們的數(shù)據(jù)集。
def createDataSet():
dataSet = [[1,1,'yes'],
[1,1,'yes'],
[1,0,'no'],
[0,1,'no'],
[0,1,'no']] # 我們定義了一個(gè)list來表示我們的數(shù)據(jù)集,這里的數(shù)據(jù)對(duì)應(yīng)的是上表中的數(shù)據(jù)
labels = ['no surfacing','flippers']
return dataSet, labels
其中第一列的1表示的是不需要浮出水面就可以生存的,0則表示相反。 第二列同樣是1表示有腳蹼,0表示的是沒有。
在構(gòu)建完數(shù)據(jù)集之后我們需要計(jì)算數(shù)據(jù)集的香農(nóng)熵。 根據(jù)香農(nóng)熵的定義可以知道:
這里寫圖片描述
根據(jù)這個(gè)公式我們來編寫相應(yīng)的代碼。(注意:我們是計(jì)算每個(gè)類別的香農(nóng)熵,也就是魚類還是非魚類的香農(nóng)熵。在這我們的數(shù)據(jù)集當(dāng)中我們用’yes’表示是魚類,用‘no’表示非魚類)
# 代碼功能:計(jì)算香農(nóng)熵
from math import log #我們要用到對(duì)數(shù)函數(shù),所以我們需要引入math模塊中定義好的log函數(shù)(對(duì)數(shù)函數(shù))
def calcShannonEnt(dataSet):#傳入數(shù)據(jù)集
# 在這里dataSet是一個(gè)鏈表形式的的數(shù)據(jù)集
countDataSet = len(dataSet) # 我們計(jì)算出這個(gè)數(shù)據(jù)集中的數(shù)據(jù)個(gè)數(shù),在這里我們的值是5個(gè)數(shù)據(jù)集
labelCounts={} # 構(gòu)建字典,用鍵值對(duì)的關(guān)系我們表示出 我們數(shù)據(jù)集中的類別還有對(duì)應(yīng)的關(guān)系
for featVec in dataSet: 通過for循環(huán),我們每次取出一個(gè)數(shù)據(jù)集,如featVec=[1,1,'yes']
currentLabel=featVec[-1] # 取出最后一列 也就是類別的那一類,比如說‘yes’或者是‘no’
if currentLabel not in labelCounts.keys():
labelCounts[currentLabel] = 0
labelCounts[currentLabel] += 1
print labelCounts # 最后得到的結(jié)果是 {'yes': 2, 'no': 3}
shannonEnt = 0.0 # 計(jì)算香農(nóng)熵, 根據(jù)公式
for key in labelCounts:
prob = float(labelCounts[key])/countDataSet
shannonEnt -= prob * log(prob,2)
return shannonEnt
香農(nóng)熵越高,則說明混合的數(shù)據(jù)越多,
得到熵之后我們就可以按照獲取最大信息增益的方法劃分?jǐn)?shù)據(jù)集。