決策樹(三)計算香農熵

<h1>計算給定數據的信息熵<h1>
我們的數據集如下表所示:

這里寫圖片描述

根據這張表,我們使用Python來構建我們的數據集。

def createDataSet():
    dataSet = [[1,1,'yes'],
              [1,1,'yes'],
              [1,0,'no'],
              [0,1,'no'],
              [0,1,'no']] # 我們定義了一個list來表示我們的數據集,這里的數據對應的是上表中的數據

    labels = ['no surfacing','flippers']

    return dataSet, labels

其中第一列的1表示的是不需要浮出水面就可以生存的,0則表示相反。 第二列同樣是1表示有腳蹼,0表示的是沒有。
在構建完數據集之后我們需要計算數據集的香農熵。 根據香農熵的定義可以知道:

這里寫圖片描述

根據這個公式我們來編寫相應的代碼。(注意:我們是計算每個類別的香農熵,也就是魚類還是非魚類的香農熵。在這我們的數據集當中我們用’yes’表示是魚類,用‘no’表示非魚類)

# 代碼功能:計算香農熵
from math import log #我們要用到對數函數,所以我們需要引入math模塊中定義好的log函數(對數函數)

def calcShannonEnt(dataSet):#傳入數據集
# 在這里dataSet是一個鏈表形式的的數據集
    countDataSet = len(dataSet) # 我們計算出這個數據集中的數據個數,在這里我們的值是5個數據集
    labelCounts={} # 構建字典,用鍵值對的關系我們表示出 我們數據集中的類別還有對應的關系
    for featVec in dataSet: 通過for循環,我們每次取出一個數據集,如featVec=[1,1,'yes']
        currentLabel=featVec[-1] # 取出最后一列 也就是類別的那一類,比如說‘yes’或者是‘no’
        if currentLabel not in labelCounts.keys():
            labelCounts[currentLabel] = 0
        labelCounts[currentLabel] += 1

    print labelCounts # 最后得到的結果是 {'yes': 2, 'no': 3}


    shannonEnt = 0.0 # 計算香農熵, 根據公式

    for key in labelCounts:
        prob = float(labelCounts[key])/countDataSet
        shannonEnt -= prob * log(prob,2)


    return shannonEnt

香農熵越高,則說明混合的數據越多,
得到熵之后我們就可以按照獲取最大信息增益的方法劃分數據集。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容