一. 熵的概念
1.1 信息熵
信息量對於這個事情判斷的能提供的信息度。
而其實信息熵是信息量的期望(均值),它不是針對每條信息,而是針對整個不確定性結果集而言,信息熵越大,事件不確定性就越大。單條信息只能從某種程度上影響結果集概率的分佈。
使用一個公式來計算記錄n天數據需要的存儲空間:Sn
表示第i個事件發生的概率; 表示存儲空間的存儲因子
如何確定這個函數 的形式?考慮這個函數需要滿足條件:概率大的事件對應小的存儲空間,說人話,就是成反比,就很容易反映出是。
發現裏面有個除號,爲了不要除號,我們就可以選擇取對數。理由:
- 對數操作可以讓原本不符合正態分佈的模型符合正態分佈,比如隨着模型自變量的增加,因變量的方差也增大的模型取對數後會更加穩定;
- 對數可以把乘法變加法。
這樣很容易得出定義:
a作爲底數,可以取2(處理2bit數據),10(萬金油),e(處理正態分佈相關的數據)
然後我們將公式1.1和公式1.2結合,可以得到
信息熵其實從某種意義上反映了信息量存儲下來需要多少存儲空間
總結爲:根據真實分佈,我們能夠找到一個最優策略,以最小的代價消除系統的不確定性,而這個代價的大小就是信息熵。
1.2 交叉熵
假定在確定性更大的概率分佈情況下,用更不確定的存儲策略來計算,比如使用 P 的概率乘上 Q的存儲因子,套用公式1.3
1.3 相對熵
有了信息熵和交叉熵後,相對熵是用來衡量兩個概率分佈之間的差異,記爲 ,也稱爲KL散度
當 的時候,該值爲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)