李宏毅機器學習7(Additional References(熵的理解))

一. 熵的概念

1.1 信息熵

信息量對於這個事情判斷的能提供的信息度。
而其實信息熵是信息量的期望(均值),它不是針對每條信息,而是針對整個不確定性結果集而言,信息熵越大,事件不確定性就越大。單條信息只能從某種程度上影響結果集概率的分佈。
使用一個公式來計算記錄n天數據需要的存儲空間:Sn
(1.1)Sn=n×i=14(Pi×F(Pi)) S_{n}=n \times \sum_{i=1}^{4}\left(P_{i} \times F\left(P_{i}\right)\right),\tag{1.1}
PiP_i表示第i個事件發生的概率;F(Pi)F(P_i) 表示存儲空間的存儲因子
如何確定這個函數 F(Pi)F(P_i) 的形式?考慮這個函數需要滿足條件:概率大的事件對應小的存儲空間,說人話,就是成反比,就很容易反映出是1Pi\frac{1}{P_{i}}
發現裏面有個除號,爲了不要除號,我們就可以選擇取對數。理由:

  • 對數操作可以讓原本不符合正態分佈的模型符合正態分佈,比如隨着模型自變量的增加,因變量的方差也增大的模型取對數後會更加穩定;
  • 對數可以把乘法變加法。

這樣很容易得出定義:
(1.2)F(Pi)=loga(1Pi) F\left(P_{i}\right)=\log _{a}\left(\frac{1}{P_{i}}\right),\tag{1.2}
a作爲底數,可以取2(處理2bit數據),10(萬金油),e(處理正態分佈相關的數據)
然後我們將公式1.1和公式1.2結合,可以得到
(1.3)H(P)=iP(i)loga1P(i)=iP(i)logaP(i) H(P)=\sum_{i} P(i) \log _{a} \frac{1}{P(i)}=-\sum_{i} P(i) \log _{a} P(i),\tag{1.3}
信息熵其實從某種意義上反映了信息量存儲下來需要多少存儲空間

總結爲:根據真實分佈,我們能夠找到一個最優策略,以最小的代價消除系統的不確定性,而這個代價的大小就是信息熵。

1.2 交叉熵

假定在確定性更大的概率分佈情況下,用更不確定的存儲策略來計算,比如使用 P 的概率乘上 Q的存儲因子,套用公式1.3
(2.1)H(P,Q)=iP(i)loga1Q(i) H(\mathbf{P}, \mathbf{Q})=\sum_{i} P(i) \log _{a} \frac{1}{Q(i)},\tag{2.1}

1.3 相對熵

有了信息熵和交叉熵後,相對熵是用來衡量兩個概率分佈之間的差異,記爲 D(PQ)=H(P,Q)H(P)D(P \| Q)=H(P, Q)-H(P),也稱爲KL散度
DKL(PQ)=iP(i)logaP(i)Q(i) D_{K L}(P \| Q)=\sum_{i} P(i) \log _{a} \frac{P(i)}{Q(i)}
P(i)=Q(i)P(i)=Q(i)的時候,該值爲0,深度學習過程也是一個降低該值的過程,該值越低,訓練出來的概率Q越接近樣本集概率P,即越準確,或者可以理解爲相對熵一把標尺,用來衡量兩個函數是否相似,一樣就是0,當然,這種解釋十分牽強,但是更直觀

計算數據集的shangnonEnt


import numpy as np
import pandas as pd
data=pd.read_csv('watermelon_3a.csv')

def calc_entropy(dataSet):
    m=len(dataSet)
    labelcounts={}
    for i in range(m):
        label=dataSet[i][-1]
        labelcounts[label]=labelcounts.get(label,0)+1
    entropy=0.0
    for counts in labelcounts.values():
        prob=counts/m
        entropy-=prob*np.log2(prob)
    return entropy
    
dataset=data.values
entropy=calc_entropy(dataset)

參考文獻

https://charlesliuyx.github.io/2017/09/11/什麼是信息熵、交叉熵和相對熵/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章