決策樹(三)計(jì)算香農(nóng)熵

<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ù)集。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容