主要參考機(jī)器學(xué)習(xí)筆記十:各種熵總結(jié)
一遍蟋、什么是熵
熵定義:隨機(jī)變量的概率分布對應(yīng)的 **信息量的平均值 ** 就叫做隨機(jī)變量的熵。
可見崇堰,為了理解熵,需要先理解什么是信息量涩咖。
1.1 信息量
首先考慮一個離散的隨機(jī)變量x,當(dāng)我們觀察到這個變量的一個具體值的時候,我們接收到多少信息呢?
我們暫時把信息看做在學(xué)習(xí)x的值時候的”驚訝程度”(這樣非常便于理解且有意義).當(dāng)我們知道一件必然會發(fā)生的事情發(fā)生了,
比如往下掉的蘋果.我們并不驚訝,因?yàn)榉凑@件事情會發(fā)生,因此可以認(rèn)為我們沒有接收到信息.但是要是一件平時覺得不可能發(fā)生的事情發(fā)生了,那么我們接收到的信息要大得多.因此,我們對于信息內(nèi)容的度量就將依賴于概率分布p(x).
一句話總結(jié):概率越小的事件發(fā)生時海诲,帶來的信息量越大。
因此我們尋找一個函數(shù)檩互,能夠體現(xiàn)這句話的含義特幔,于是有單調(diào)遞減函數(shù)
函數(shù)圖像如下所示:
注意一般是以2為對數(shù)的底。
若是稱I(x)為自信息量闸昨,那么根據(jù)其中x的不同蚯斯,根據(jù)概率中的聯(lián)合概率薄风,條件概率,我們可以得到
聯(lián)合自信息量
條件自信息量
1.2拍嵌、熵
熵(entropy):已知信息量I(x)遭赂,那么我們想要知道這整個概率分布對應(yīng)的信息量的平均值.這個平均值就叫做隨機(jī)變量x的熵 。
求I(x)的期望横辆,其中I(x)是概率分布p(x)的函數(shù)撇他,則根據(jù)定理,可以得到I(x)的期望狈蚤,也就是熵:
對“信息熵的本質(zhì)可以看做是某個分布的自信息的期望”這句話的進(jìn)一步理解:
也就是說困肩,熵,所求的是脆侮,這個事件的信息量的平均值锌畸。所以說,熵越大他嚷,這個事件整體所含的信息量就越大蹋绽,不確定性就越高。比如筋蓖,蘋果一定落地卸耘,信息量就很小。蘋果落到某個盒子粘咖,熵也就大了蚣抗,信息量比較大,不確定性也比較大了瓮下。
需要注意的地方
-
服從于某個分布的X的熵翰铡,等價于這個分布的熵
因?yàn)殪刂灰蕾囉赬的分布 - 定義0log0=0,因?yàn)榭赡艹霈F(xiàn)某個取值概率為0的情況
- 熵越大讽坏,隨機(jī)變量的不確定性就越大锭魔。
常用的例子:
X服從0-1分布,即:
則熵為:
當(dāng)事件發(fā)生概率p從0依次取到1時路呜,畫出熵的圖:
1.當(dāng)p=0或者p=1的時候,隨機(jī)變量可以認(rèn)為是沒有不確定性.
2.當(dāng)p=0.5的時候,H(p)=1,隨機(jī)變量的不確定性最大.
熵的計(jì)算公式迷捧,就是按照期望公式求概率分布的期望。
二胀葱、條件熵
2.1漠秋、聯(lián)合熵與條件熵
仿照之前信息量的公式,根據(jù)聯(lián)合分布與條件分布抵屿,我們可以得到聯(lián)合熵(復(fù)合熵)和條件熵:
復(fù)合熵:
條件熵:
為什么要在條件概率前面再乘上以一個p(yj)?
如果以x表示學(xué)生體重庆锦,以y表示身高,以 p(x∣y)表示身高為某個特定的y時的體重為x的概率轧葛,把熵公式用到這個特殊情況得到是熵顯然應(yīng)當(dāng)是
上面是確定的y = yj時計(jì)算得到的概率搂抒,然而y等于yj的概率是p(yj)艇搀,所以在不確定y等于多少時,應(yīng)該在前面乘以一個yj發(fā)生時的概率燕耿,y一共有m個取值中符,所以應(yīng)該是m個p(yj)乘以上面式子再相加。
于是可以得到上面的條件熵誉帅。
2.2條件熵的變形
根據(jù)條件分布:
可以把上面的求條件熵的式子改成如下形式:
上面式子表明,只要你能得到聯(lián)合分布和y的分布就能夠求出條件熵了右莱,不過還可以經(jīng)過推導(dǎo)蚜锨,得到更加常見的形式:
證明:
三、相對熵(KL散度)
要理解相對熵慢蜓,先理解交叉熵是什么
3.1亚再、從信息論編碼長度理解交叉熵與相對熵
參考中, 把H(p,q)定義為交叉熵晨抡,跟上面的聯(lián)合熵有些出入氛悬,不知道是不是定義有問題,暫時就這么認(rèn)為把耘柱,區(qū)別開來如捅。
由Gibbs' inequality知,交叉熵H(p,q)一定大于熵H(p)调煎,即用用錯誤分布來表示真實(shí)分布的平均編碼長度镜遣,一定要長與真實(shí)分布的平均編碼長度。例子:
我們將由q得到的平均編碼長度比由p得到的平均編碼長度多出的bit數(shù)稱為“相對熵”:
3.2士袄、從信息量理解相對熵
參考一文搞懂交叉熵在機(jī)器學(xué)習(xí)中的使用悲关,透徹理解交叉熵背后的直覺
在機(jī)器學(xué)習(xí)中腊满,P往往用來表示樣本的真實(shí)分布谁鳍,比如樣本的真是分布為[1,0,0]消略。Q用來表示模型所預(yù)測的分布态蒂,比如[0.7,0.2,0.1] 穷缤。
直觀的理解就是如果用P來描述樣本跟继,那么就非常完美隘冲。而用Q來描述樣本妇押,雖然可以大致描述需了,但是不是那么的完美跳昼,信息量不足,需要額外的一些“信息增量”才能達(dá)到和P一樣完美的描述肋乍。
其中鹅颊,額外的信息增量就是:
機(jī)器學(xué)習(xí)就是通過反復(fù)訓(xùn)練,學(xué)習(xí)Q墓造,讓Q也能完美的描述樣本堪伍,那么就不再需要額外的“信息增量”锚烦,此時Q等價于P。
相對熵的兩個主要性質(zhì):非對稱性與非負(fù)性:
參考交叉熵是否非負(fù)帝雇?
知道涮俄,離散型隨機(jī)變量的熵時非負(fù)的,連續(xù)性隨機(jī)變量可能為負(fù)尸闸。
3.3彻亲、相對熵的應(yīng)用
3.3.1、計(jì)算文本相似度
相對熵可以衡量兩個隨機(jī)分布之間的距離吮廉,當(dāng)兩個隨機(jī)分布相同時苞尝,它們的相對熵為零,當(dāng)兩個隨機(jī)分布的差別增大時宦芦,它們的相對熵也會增大宙址。所以相對熵(KL散度)可以用于比較文本的相似度,先統(tǒng)計(jì)出詞的頻率调卑,然后計(jì)算KL散度就行了抡砂。
3.3.2、在機(jī)器學(xué)習(xí)中作為損失函數(shù)進(jìn)行訓(xùn)練
具體的一些細(xì)節(jié)恬涧,參考一文搞懂交叉熵在機(jī)器學(xué)習(xí)中的使用注益,透徹理解交叉熵背后的直覺
四、互信息气破、信息增益
先看定義:互信息可以看成是一個隨機(jī)變量中包含的關(guān)于另一個隨機(jī)變量的信息量聊浅,或者說是一個隨機(jī)變量由于已知另一個隨機(jī)變量而減少的不確定性。
兩個隨機(jī)變量X现使,Y的互信息低匙,定義為X,Y的聯(lián)合分布和獨(dú)立分布乘積的相對熵。
公式是怎么得到的呢碳锈?
根據(jù)上一小節(jié)的信息熵的理解:相對熵可以看做顽冶,為了和真實(shí)分布P一樣完美描述事件的額外增量。
當(dāng)我們知道Y的條件下售碳,能夠幫助我們判斷X强重,此時的信息量相對為H(X|Y)。當(dāng)我們不知道Y時贸人,此時為了描述X的信息量H(X)间景,需要多一些額外的信息量,而這里的額外增量艺智,就是信息增益:I(X,Y)倘要。
于是 I(X,Y) = H(X) - H(X|Y),可以得到信息增益的公式十拣。
舉例:西瓜書p75頁封拧,有對于信息增益的講解 志鹃。
此時,我們認(rèn)為X為label即[好瓜泽西,壞瓜]捧杉,色澤為Y[青綠,烏黑,淺白]。我們可以計(jì)算出在不知道Y時的H(X)為0.998,在已知Y時零聚,H(X|Y)為0.889.于是我們可以得到色澤的信息增益
Gain(色澤) = H(X) - H(X|Y) = 0.109
注意隶症,這里是按照文章中公式來算的蚂会,跟樹中的計(jì)算方法有點(diǎn)出入刊咳,除了要明確好x和y代表的意義让蕾,還要仔細(xì)計(jì)算好每一個公式,每一個概率。
一般情況下庇配,大多不會用定義的公式耀鸦,而是求得H(X) - H(X|Y)以后袖订,得到信息增益的皮服。
小結(jié):
五、代碼實(shí)現(xiàn)
實(shí)現(xiàn)一
根據(jù)上面的公式,定義一個熵函數(shù)归斤,條件熵函數(shù)痊夭,交叉熵函數(shù)即可。
實(shí)現(xiàn)二
在計(jì)算方面脏里,其中條件熵還可以從這個角度計(jì)算:
即認(rèn)為X確定為x1時她我,Y此時的熵,再乘以此時X=x1的概率p1。
比如番舆,西瓜書中酝碳,當(dāng)X為青綠時,有6個樣例恨狈,Y此時對應(yīng)6個標(biāo)簽中3個正例3個負(fù)例疏哗。計(jì)算得到Ent(D1)以后再乘以p1。
代碼上實(shí)現(xiàn)上參考這個python 計(jì)算信息熵和信息增益
其中一段代碼:
#這段是基于numpy的計(jì)算
import numpy as np
def calc_ent(x):
"""
calculate shanno ent of x
"""
#用set加count的方法禾怠,避免了用字典的操作返奉。但是在大數(shù)據(jù)集中,可能并不合適
#此時x_list中只有單個元素吗氏,可以用于與下面的count方法配合芽偏,求得概率
x_value_list = set([x[i] for i in range(x.shape[0])])
ent = 0.0
for x_value in x_value_list:
#下面用了numpy中索引的方法x[x == x_value],返回x數(shù)組中等于x_value的數(shù)弦讽,有多少污尉,返回多少
#比如,x = np.array([1,1,0,2,3]),那么x[x == 1]就返回數(shù)組類型[1 1]
#
#下面這行代碼的意思往产,就是求x=1的概率十厢,shape[0]獲得數(shù)組的長度,2/5
p = float(x[x == x_value].shape[0]) / x.shape[0]
logp = np.log2(p)
ent -= p * logp
return ent