3-1節(jié) 決策樹|計算給定數(shù)據(jù)集的香農(nóng)熵的函數(shù)|機器學(xué)習(xí)實戰(zhàn)-學(xué)習(xí)筆記

文章原創(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)熵越大呵曹。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末款咖,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子奄喂,更是在濱河造成了極大的恐慌铐殃,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件跨新,死亡現(xiàn)場離奇詭異富腊,居然都是意外死亡,警方通過查閱死者的電腦和手機域帐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門赘被,熙熙樓的掌柜王于貴愁眉苦臉地迎上來是整,“玉大人,你說我怎么就攤上這事民假「∪耄” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵羊异,是天一觀的道長事秀。 經(jīng)常有香客問我,道長球化,這世上最難降的妖魔是什么秽晚? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮筒愚,結(jié)果婚禮上赴蝇,老公的妹妹穿的比我還像新娘。我一直安慰自己巢掺,他們只是感情好句伶,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著陆淀,像睡著了一般瀑罗。 火紅的嫁衣襯著肌膚如雪蛮寂。 梳的紋絲不亂的頭發(fā)上煌寇,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天阳距,我揣著相機與錄音,去河邊找鬼含懊。 笑死身冬,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的岔乔。 我是一名探鬼主播酥筝,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼雏门!你這毒婦竟也來了嘿歌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤茁影,失蹤者是張志新(化名)和其女友劉穎宙帝,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體募闲,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡步脓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沪编。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖年扩,靈堂內(nèi)的尸體忽然破棺而出蚁廓,到底是詐尸還是另有隱情,我是刑警寧澤厨幻,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布相嵌,位于F島的核電站,受9級特大地震影響况脆,放射性物質(zhì)發(fā)生泄漏饭宾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一格了、第九天 我趴在偏房一處隱蔽的房頂上張望看铆。 院中可真熱鬧,春花似錦盛末、人聲如沸弹惦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽棠隐。三九已至,卻和暖如春檐嚣,著一層夾襖步出監(jiān)牢的瞬間助泽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工嚎京, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留嗡贺,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓挖藏,卻偏偏與公主長得像暑刃,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子膜眠,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容