信息熵等介紹

李宏毅打卡第七次

信息量計算,原理

首先我們要知道什麼是信息量

信息量

是一個用來描述東西包含的信息的多寡,越是確定的信息,信息量就越少。

信息熵

熵 (entropy) 這一詞最初來源於熱力學,是一種描述物體混亂程度的度量。宇宙間的物體總是趨向於熵增加的。也就是趨向於更爲混亂的成都。

接下來我們就引入信息熵,也就是常說的香農熵。

“信息熵”(information entropy)

是度量樣本集合純度的最常用的一種指標。

假設當樣本前集合D中第k類樣本所佔的比例爲pkp_k(k = 1,2,3……,|y|),則D的信息熵定義爲:

Ent(D)=k=1ypklog2pkEnt(D) = - \sum_{k=1}^{|y|}p_klog_2p_k

證明0H(p)logn0 \leqslant H(p) \leqslant logn

在這裏插入圖片描述

聯合概率,邊緣概率

本來想在課本上找到解釋的,但是好像沒有找到我需要的,我只能自己解釋一波。

我們一般知道對於某件事情的概率標記爲P(X),這意味着這是事件X發生的概率大小,而聯合概率就是對於事件X,Y它們發生的概率爲P(X,Y),特別的,如果X和Y是獨立的,那麼P(X,Y) = P(X) * P(Y)。

然後什麼是邊緣概率呢?我們由上面知道了聯合概率,那麼邊緣概率就是我們不管某一個變量算出來的概率,比如我們不關注X算出來的概率P(X,Y)就是Y的邊緣概率,而這個時候P(X,Y1) = P(X1,Y1) + P(X2,Y2) …… P(XN,Y1)(其實寫成積分形式的概率密度函數似乎更好些)

聯合熵,條件熵,條件熵公式推導

聯合熵指的是:對於服從聯合分佈P(X,Y)的一堆離散變量(X,Y),其聯合熵表示爲:H(X,Y)=xXyYP(x,y)log2P(x,y)H(X,Y) = -\sum_{x \in X} \sum_{y \in Y} P(x,y)log_2P(x,y)

條件熵指的是:當前有聯合概率分佈爲P(X,Y),條件熵H(Y|X)指的是在X確定的條件下,隨機變量Y的不確定性,隨機變量X給定的條件下隨機變量Y的條件熵H(Y|X),定義爲X給定條件下Y的條件概率分佈的熵對X的數學期望,也就是:
H(YX)=i=1mpiH(YX=xi)H(Y|X) = \sum_{i=1}^{m}p_iH(Y|X = x_i)

對於條件熵公式推導:
在這裏插入圖片描述

互信息,互信息公式推導

互信息指的是兩個隨機變量x,y的聯合分佈乘以獨立分佈,是用來兩個隨機變量的“相關性”,公式如下:

I(X,Y)=xyP(x,y)log2P(x,y)P(x)P(y)I(X,Y) = \sum_{xy}P(x,y)log_2{\frac{P(x,y)}{P(x)P(y)}}

定義式的推導如圖:

![](3.jpg)
## 相對熵,交叉熵

如果我們對於同一個隨機變量 x 有兩個單獨的概率分佈 P(x) 和 Q(x),我們可以使用 KL 散度來衡量這兩個分佈的差異,具體做法是P(X),Q(X)的比值取對數之後,在P(X)的概率分佈上求期望:

D(PQ)=xP(x)log2P(x)Q(x)D(P|Q) = \sum_x P(x)log2 {\frac{P(x)}{Q(x)}}

相對熵可以度量兩個隨機變量的“距離”

交叉熵:

D(PQ)=xP(x)log2P(x)Q(x)=H(P)+(xP(x)log2Q(x))D(P|Q) = \sum_x P(x)log2 {\frac{P(x)}{Q(x)}} = -H(P) + (-\sum_x P(x)log_2 Q(x))

前一部分是p的熵,後一部分就是交叉熵

回顧LR中的交叉熵

其中交叉熵的部分計算爲:

L(θ)=i=1m(yilog2hθ(xi)+(1yi)(1log2hθ(xi))L(θ) = \sum_{i=1}^m (-y^i log_2 {h_θ(x^i)+ (1 - y^i)(1 - log_2 {h_θ(x^i)})}

用來度量兩個分佈之間的差異成都。

計算給定數據集中的香農熵

import math

def get_data(name):
    with open(name,"r") as f:
        data = f.readlines()
    length = 0
    for i in range(len(data)):
        data[i] = data[i].strip()
        length += len(data[i])
    return data,length

if __name__ == '__main__':
    name = "watermelon_3a.csv"
    data , length = get_data(name)
    all = {}
    for i in data:
        for j in i:
            if not j in all.keys():
                all[j] = 0
            else:
                all[j] += 1
    Ent = 0
    for i in all.keys():
        if all[i]/length == 0:
            Ent += 0
        else:
            Ent += -all[i]/length * math.log(all[i]/length) / math.log(2)
    print(Ent)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章