淺談訊源編碼(Source Coding)之霍夫曼編碼(Huffman Coding)&編碼效率(Coding Efficiency)

Ac Studio
Jun 29, 2023

--

2018.01.30 Japan

訊源編碼(Source Coding)是一種將資料整理的技術,避免傳送的資料太冗長。通常我們把出現頻率高的訊息用長度較短的編碼表示,並把出現頻率低的訊息用長度較長的編碼表示,以壓縮資料的長度,稱為變動長度碼(Variable Length Code)。舉例而言,摩斯密碼就是一種很常見的變動長度碼。摩斯密碼的英文字母和數字的對應如下圖:

Source: Wikipedia

其中比較常出現的母音e跟i就分別用一個點和兩個點表示,因為點的長度是槓的三分之一,可以看出頻率高的字母長度比較短。

霍夫曼編碼(Huffman Coding)

霍夫曼編碼是一種資料壓縮技術,它首先掃描所有要傳輸的資料,並計算每個符號(Symbol)出現的頻率。然後,按照符號的出現機率由高到低排序,並將出現機率最低的兩個符號標記為0和1,接下來,把被標記的兩個符號之機率相加,此時,機率之高低排序已經和一開始不同,所以要重新排序。不斷重複這個過程,直到最後只剩下兩個符號被完全標記。如下圖,假設有5個符號(S0、S1、S2、S3、S4),其出現機率分別為P(S0)=0.3, P(S1)=0.3, P(S2)=0.2, P(S3)=0.1, P(S4)=0.1。我們可以使用霍夫曼編碼來完成編碼的過程。

接著我們沿著剛剛畫的白線,從最右邊開始往左走,記錄每個遇到的0或1直到沒有路可以往左走,再將此編碼的結果對應左邊的符號,以得到每個符號的編碼結果。

熵 (Entropy)與編碼效率(Coding Efficiency)

介紹完這些編碼後,我們可以計算編碼效率來判斷我們的編碼方式夠不夠好,在介紹編碼效率前,要先解釋什麼是熵。熵是對於不確定性的一種量化方式,熵反映了事件發生所提供的資訊量。舉丟硬幣的隨機試驗為例,假設丟一枚硬幣有90%的機率正面朝上,10%的機率反面朝上。那麼當我們丟出正面朝上時,得到的資訊量就比較少,因為這是預料之內的結果。反之,當我們丟出反面朝上時,得到的資訊量就比較多。從這個例子可以看出,當各個結果的機率不相同時,就比較容易預測到結果,如果各個結果的機率都相等,則很難去猜測結果是什麼,意味著不確定性就比較高,因此熵就越大。

我們可以說資訊量是1/p(x),其中p(x)是事件發生的機率。舉例來說,機率為90%的事件發生時的資訊量=1/0.9=1.111,而機率為10%的事件發生時的資訊量=1/0.1=10。換言之,一個事件發生的機率越高,我們得到的資訊量就越低。通常我們不太在乎某個特定值的資訊量,我們比較在乎隨機試驗帶來的資訊量,也就是期望值。為此,我們定義熵為資訊量的期望值(單位是位元),其數學定義如下:

圖(一):熵的公式

舉例來說,若P0=1/4, P1=1/4, P2=1/2,那熵就是:

可以注意到,熵的計算以2為底,代表資訊量可以用多少個位元表示,因為取完對數後的結果代表了多少個2相乘,而這就是2進位的運作方式。熵的數值就可以表示為位元的數量,也是我們能達到編碼的最短長度,各位有發現嗎?這可以從熵的定義去理解,首先,「熵」代表了「資訊量」(以位元為單位)的期望值,而機率越小資訊量越大,代表我們把出現機率低的符號用比較多的位元表示,因此熵才能夠當作最短的編碼長度。

假設我們編碼完的訊息是S0, S1, …, SK,其出現的機率分別為P0, P1, …, PK,長度分別為L0, L1, …, LK個位元,那麼長度的期望值即為:

圖(二):訊息的長度的期望值

Lavg代表了我們採用的編碼方式平均每個符號需要的位元數,而這不一定是最有效率的編碼方式,最有效的編碼方式會剛好等於隨機試驗的熵(Entropy)。因此,編碼效率(Coding Efficiency)定義為:

圖(三):編碼效率

因為熵是理論上能達到的最短長度,因此當編碼效率為1時,代表我們已經把編碼的方式最優化了。此外,編碼效率不可能大於1,因為Lavg不會小於H(S),此理論即為夏農信源編碼定理(Shannon’s source coding theorem)。

看完這些後,各位不妨算算看以下例題使用霍夫曼編碼的編碼效率是多少吧,如果算出1就代表你學會了~

P0=0.25, P1=0.25, P2=0.125, P3=0.125, P4=0.125, P5=0.0625, P6=0.0625。

--

--