關於數據壓縮、信源編碼、赫夫曼碼的一些研究,以及由此引出對決策樹模型的信息論本質的思考

1. 關於數據壓縮

0x1:什麼是數據壓縮?爲何要進行數據壓縮?

從信息論的角度來看數據壓縮,本質上就是經過尋找一種編碼方案,在不損失或者儘可能少損失原始信源信號的前提下,將原始信源信號映射到另外一個D元碼字空間上。html

在機器學習中,咱們常常討論到的」模型訓練「,其本質上就是在尋找一個」信源映射函數「,例如線性迴歸的迴歸參數,就是一種信源映射函數,能夠將輸入空間X,一一映射到Y空間,因此,獲得了一組模型參數,本質上就是獲得了一個信源映射函數,此後,就能夠由模型參數代替原始的樣本數據。web

回到信息論數據壓縮的話題,信息論數據壓縮討論和定義的是:在信源映射函數中,應該將哪些碼字分配給哪些信源,怎麼分配是最優的,即節省傳輸開銷的。算法

本文經過討論信息壓縮的基本臨界值(即最短碼字長度),從另外一個方面來看熵的定義和合理性。經過對數據源中最頻繁出現的結果分配較短的描述,而對不常常出現的結果分配較長的描述,可達到壓縮數據的目的。shell

0x2:關於壓縮編碼的幾個例子

1. 信源編碼的定義

數據壓縮的的本質是找到一種高效的壓縮編碼方案,這小節咱們先定義一下信源編碼的一些形式化定義與記號,而後一塊兒來看幾個關於壓縮編碼的例子。架構

關於隨機變量X的信源編碼C是從X的取值空間X到D*的一個映射,其中D*表示D元字母表D上有限長度的字符串所構成的集合,用C(x)表示x的碼字並用 l(x) 表示C(x)的長度。框架

設隨機變量X的機率密度函數爲p(x),定義信源編碼C(x)的指望長度L(C)(expected length)爲機器學習

,其中l(x)表示對應於x的碼字的長度函數

另外,不是通常性,能夠假定D元字母表爲D={0,1,....,D-1}性能

2. 等比例碼字編碼舉例

所謂等比碼字編碼,就是指對信源裏的全部信號都採用相同長度的碼字,例如:學習

C(紅)=00,C(藍)=11,是X={紅,藍}關於字母表D={0,1}的一個信源編碼。

3. 對非等概隨機變量進行非等比例編碼舉例

設隨機變量X的分佈及其碼字分配以下:

可知X的熵H(X) = 1/2 * 1 + 1/4 * 2 + 1/8 * 3 + 1/8 * 3 = 1.75比特。而指望長度L(C) = El(X) = 1.75比特。

這裏,咱們看到一個指望長度正好等於其熵值的編碼,仔細對比會發如今該編碼方案下,熵的計算公式和指望長度的計算公式是徹底相同的。

另外,注意到這個編碼方案是可逆的,任何一個比特序列均可以惟一地解碼成關於X中的字符序列,例如,比特串010111100110解碼後爲134213。

4. 對等概隨機變量機械能給你非等比例編碼舉例

繼續沿着上面那個例子的討論,假設此次隨機變量是一個均勻分佈,但此次不像第一個例子採用等比例編碼,而是採用變長編碼,以下:

正如前面的例子同樣,該編碼也是惟一可譯的,但這種的編碼方案的熵爲log3 = 1.58比特,而編碼的指望長度爲1.66比特,即此時

爲何會這樣呢?發生了什麼事呢?

簡單的解釋就是:這個例子中的編碼方案不是最優的,之因此指望長度比熵要大,是由於使用了多餘的碼字來對信源信號進行編碼。

5. 莫爾斯碼

莫爾斯碼是關於英文字母表的一個至關有效的編碼方案。

  • 使用四個字符的字母表:點、劃、字母間隔、單詞間隔
  • 使用短序列表示頻繁出現的字母(例如,用單個點表示E),而用長序列表示不常常出現的字母(例如,Q表示爲」劃,劃,點,劃」)

須要注意的是,對於四字符的字母表來講,莫斯編碼並不是最佳表示,由於依此方式,許多可能的碼字未被使用(碼字空間沒有被充分利用,這和前一個例子犯了一樣的錯誤)。

香農在1948年的開創性論文中解決了對英文字母最佳編碼方案的搜索問題,該問題也與磁記錄的編碼問題有聯繫,其中不容許出現一些長串的0。

# relative links about this topic
http://xueshu.baidu.com/usercenter/paper/show?paperid=2c9070b5bd7f5b00847480d94c9cfd7a&site=xueshu_se
http://xueshu.baidu.com/usercenter/paper/show?paperid=cac5df4cbee54e31c90ef560bf806712&site=xueshu_se

Relevant Link: 

《信息論基礎》阮吉壽著 - 第五章

 

2. 信源編碼

這一節開始咱們討論信源編碼,逐步對編碼的條件進行定義,設xn表示信源序列(x1,x2,....,xn)。C(x1)C(x2)....C(xn)表示相應碼字的串聯,咱們稱之爲編碼C的擴展(extension)

0x1:非奇異編碼

若是編碼將X的取值空間中的每一個元素映射爲D*中不一樣的字符串,即

則稱這個編碼是非奇異的(nonsigular)

0x2:惟一可譯碼

若是一個編碼的擴展編碼是非奇異的,也即整個序列能夠一一對應一個信源序列,則稱該編碼是惟一可譯的(uniquely decodable)

惟一可譯碼的任一編碼字符串只來源於惟一可能的信源字符串。儘管如此,仍然可能須要通觀整個編碼字符串,才能最終肯定信源字符串。有時甚至是第一個碼字也一樣。

能夠看到,非奇異性雖然保證表示X的每一個碼字值明確性。可是,若是咱們須要發送一段序列,就須要在兩個碼字之間添加一個特殊符號(例如「逗號」),才能夠確保其可譯性。但如此使用特殊的分割符號會下降編碼的效率。

一個很天然的想法是,若是能利用碼的自我間斷性或即時碼的思想,就能夠同時兼顧效率與一一對應精確性這兩個目的。這就是接下要來討論的前綴碼。

0x3:前綴碼(prefix code)

若碼中無任何碼字是其餘碼字的前綴,則稱該編碼爲前綴碼(prefix code)即時碼(instantaneous code)自我間斷碼

在前綴碼中,每個碼字什麼時候結束能夠瞬時判斷出來,於是無需參考後面的碼字就能夠譯出即時碼,每一次bit進行一次碼字表查表,當命中某個碼字序列時當即中止,由於不可能存在該碼字同時由是其餘碼字的前綴,所以能夠100%判定該序列爲某個肯定的碼字。

所以,對即時碼來說,一旦分配給字符xi的碼字結束,無需再等待後面的碼字,就能夠當即譯出字符xi

例如前面例子中的編碼方案

這就是一個前綴碼,若是獲得一個二元串,010111100110,咱們可將其譯碼爲,0,10,111,110,10。

0x4:信源編碼各類編碼之間的關係

關於信源編碼的幾種編碼方式之間的關係圖以下:

用一個具體的例子來講明各個信源編碼方案的區別,下表分別列舉了在碼字分配在各個編碼方案中的狀況。

  • 對於非奇異碼,碼串010可能對應3個信源序列:二、1四、31,所以,該編碼不是惟一可譯的。
  • 惟一可譯碼也不必定是要無前綴的。關於碼的惟一可譯性,Sardinas和Patterson已經設計出一個有效檢驗的方法,其主要步驟是造成全部碼字的可能後綴集,同時系統地刪除它們
  • 表中最後一個是即時碼,全部碼字中無一碼字是其餘任一碼字的前綴

Relevant Link: 

《信息論基礎》阮吉壽著 - 第五章

  

3. Kraft不等式

爲了描述一個給定的信源,咱們的目標是構造指望長度最小的即時碼。接下來最大的問題是,顯然不可能將短的碼字分配給全部的信源字符而扔保持是無前綴的,那應該是按照什麼約束條件來尋找全部可能的碼字分配方案呢,由於可能知足指望長度最小的碼字分配方案並不惟一。Kraft不等式定義了這個約束條件。

0x1:Kraft不等式形式化定義

即時碼的一組可能的碼字長度知足以下不等式,即kraft不等式。

對於D元字母表上的即時碼(前綴碼),碼字長度一定知足不等式

反之,若給定知足以上不等式的一組碼字長度,則存在一個相應的即時碼,其碼字長度就是給定的長度。

考慮一個每一節點均含D個子節點的D叉樹,

  • 樹枝表明碼字的一個字符,例如,源於根節點的D條樹枝表明着碼字的第一個字符的D個可能值
  • 樹葉表明每一個碼字,始於根節點的路徑可描繪出碼字中全部字符

從上圖中能夠看出,碼字的前綴條件代表樹中無一碼字是其餘任一碼字的祖先。於是,在這樣的編碼樹中,每一碼字都去除了它的可能成爲碼字的全部後代。從建樹過程上看,有點啓發式優化的影子,後面咱們會討論到,咱們最熟悉的決策樹的建樹過程,本質上就是一個前綴碼的尋優與構建過程。

爲碼字集中最長碼字長度,考慮在樹中層的全部節點,可知其中有些是碼字,有些是碼字的後代,而另外的節點既不是碼字,也不是碼字的後代。

在樹中層的碼字擁有層中的個後代,全部這樣的後代集不相交。並且,這些集合中的總節點數一定小於或等於。所以,對全部碼字求和,則可得:

,這就是Kraft不等式。

反之,若給定任意一組知足Kraft不等式的碼字長度,總能夠構造出上圖結構相似的編碼樹。將第一個深度爲的節點(依字典序)標位碼字1,同時除去樹中屬於它的全部後代。而後在剩餘的節點中找出第一個深度爲的節點,將其標爲碼字2,同時除去樹中全部屬於它的全部後代,等等,依次方法繼續下去,便可構造出一個碼字長度爲的前綴碼。

Relevant Link: 

《信息論基礎》阮吉壽著 - 第五章

 

4. 最優碼

0x1:最優碼指望長度條件

Kraft不等式解決的是,定義出了前綴碼必須知足的約束條件問題,知足前綴條件的任何一個碼字集均知足Kraft不等式。

接下來考慮求解前綴碼的最小指望長度問題,該問題等價於求解知足Kraft不等式的長度集合,使得它的指望長度不超過其餘任何前綴碼的指望長度。這是一個標準的最優化問題,在全部整數上,最小化

其約束條件爲

利用拉格朗日(Lagrange)乘子法,將帶約束的最小化問題轉化爲下式的最小化問題:

關於求微分,可得

令偏導數爲0,得:

將此式代入約束條件中以求得合適的λ,可得,於是,即最優碼長爲

若能夠取碼字長度爲非整數,則此時的指望碼字長度爲:

隨機變量X的任一D元即時碼的指望長度一定大於或等於熵,即

,當且僅當(即對全部的i,-logDpi爲整數),等號成立。

對於某個n,若是機率分佈的每個機率值均等於D-n,則稱這個機率分佈是D進制的(D-adic),所以,當且僅當X的分佈是D進制的,上述定理等號成立。

0x2:最優碼長的界

1. 最優碼長界形式化定義

上一小節中,咱們討論了最優碼長指望,即最小化,其約束條件爲整數且。咱們已經證實若碼長選取

,有L = H。可是因爲未必爲整數,因此該式只是一個理論值。

爲了能使該式具備實際意義,經過取整運算,就能夠給出整數碼字長度的分配

,其中表示向上取整。這組整數知足kraft不等式,由於

如此選取的碼字長度知足

在上式中乘pi,而且關於 i 求和,可得:

上面討論可總結爲以下定理:

是關於信源分佈p和一個D元字母表的一組最優碼長,L*爲最優碼的相應指望長度(),則

上式代表,實際最優碼長的指望比熵大,但不會超出1比特的附加位。這是因爲最優碼長的理論值並不是老是整數形成的

2. 多字符分組編碼的最優碼指望長度界

前面介紹了對碼字的串聯(編碼的擴展),即經過對多字符進行分組能夠減少信源序列的熵,進而減小最優碼指望長度。

考慮一個序列發送系統,其中的序列都是來自於X的n個字符,假定序列中的字符是i.i.d.,服從p(x),此時可將這n個字符當作是字母表中的超字符。

定義Ln爲每一個輸入字符指望碼字長度,設是與(x1,x2,....,xn)相應的二進制碼字長度,則

將上一小節推導的界應用於此時的編碼,有

因爲X1,X2,...,Xn是i.i.d.,所以

帶入上面不等式,同時兩邊同除以n,得:

所以,經過使用足夠大的分組長度,能夠得到一個編碼,可使其每字符指望碼長任意地接近熵。

即便隨機過程不是i.i.d.的,對來自該隨機過程的字符序列也能夠做一樣的討論,此時仍然有:

將上式兩邊同除以n,且定義Ln爲沒字符指望描述長度,可得:

若是隨機過程是平穩的,則,當n->∞時,每字符指望描述長度趨於該隨機過程熵率H(X)。

該定理從另外一方面說明了熵率概念的必要性,熵率是最簡潔描述隨機過程所需的每字符指望比特數

0x3:非真實分佈的指望碼長和最優碼長之間的距離度量

這裏先解釋一下什麼是真實分佈與非真實分佈。

  • 真實分佈:目標過程的真實機率分佈,是永恆的真值,但也是咱們不可知的,但能夠經過訓練樣本無限逼近(大數定律)。
  • 非真實分佈:基於經過對真實過程的觀測獲得了組觀測結果序列,並基於該觀測結果生成對應的機率估計分佈,這樣獲得的機率估計分佈可能和真實分佈之間存在必定的差距。

舉一個具體的例子,咱們基於有標註訓練樣本訓練一個線性迴歸模型,經過MSE獲得了一個最優擬合模型,可是該線性模型並無徹底擬合,依然存在一個大於0的損失函數值。這個時候,咱們就稱咱們獲得的線性迴歸模型表明了一個非真實分佈,而原始訓練樣本表明了真實分佈(基於大數定律)。

理解了基本概念以後,如今讓咱們拋開具體的算法形式場景,回到抽象思惟領域,思考一個問題。當面對的對象是非真實分佈時,用於描述這個非真實分佈的指望描述長度會變得怎樣。

假定真實分佈的機率密度函數是p(x),而非真實分佈的機率密度函數是q(x),相應的碼長爲

下面將證實,因爲不正確的分佈所引發的指望描述長度的增長值等於相對熵D(p || q)。因而,D(p || q)能夠具體解釋爲因爲使用不正確的信息而引發的描述性複雜度的增長量

將非真實機率分佈的碼字編碼定義爲偏碼(wrong word),碼字長度分配爲

關於p(x)的指望碼長知足以下公式:

證實過程以下:

因而,若真實分佈爲p(x),而編碼使用的是非真實分佈q(x),則會致使指望描述長度增長D(p || q)

這個定理也從碼長指望的角度解釋了線性迴歸模型擬合偏差以及擬合模型和真實分佈之間相關係數的關係等話題,關於這部分的討論,能夠參閱另外一篇文章

0x4:最優碼搜索程序

前面兩小節討論的最優碼指望長度條件的證實過程,其實也間接提供了尋求最優碼的理論步驟:

  • 找到與X的分佈最接近的D進制分佈(在相對熵意義下),由該D進制分佈可提供一組碼字長度。
  • 選取首次達到的節點(按照Kraft不等式證實過程的方法),構造出該編碼
  • 逐次進行,最終獲得一個關於X的最優碼

上述是一個理論上指導方法,要具體實現這個程序並不容易,由於要搜素出與X的分佈最接近的D進制分佈並不容易。

在後面的討論中,咱們會進入到具體算法細節層面的討論,分別介紹尋求最優碼的次優程序,香農-費諾編碼,以及赫夫曼編碼。

Relevant Link: 

《信息論基礎》阮吉壽著 - 第五章

  

5. 赫夫曼碼

關於給定分佈構造最優(最短時間望長度)前綴碼,赫夫曼給出了一個簡單的算法。咱們將證實,對於相同信源字母表的任意其餘編碼,不可能比赫夫曼法所構造出的編碼具備更小的指望長度。

在開始具體的討論前,咱們先經過對20問題遊戲的討論,來切入對赫夫曼碼的討論。 

0x1:赫夫曼碼和20問題遊戲的等價性討論

1. 20問題遊戲說明

假定要設計一套最有效的」是/否問答系統「,以便從目標羣中識別出其中一個目標。假設目標的機率分佈已知,那麼是否能找到最有效的問題序列,保證該序列可以將一個目標從一羣可能的目標中惟一地區分出來。

這類遊戲在平常生活中很是常見,它就是咱們熟悉的決策樹,經過不斷進行二元提問,將輸入逐步分類,最終落到某個具體的類型桶中。

2. 20問題抽象

首先,咱們要找的目標可能不止一種人,咱們將其設爲X={X1,X2,....,Xn},Xi表明了咱們要找的某一種目標人羣。設計整套提問序列,本質上就是尋找一個目標編碼方案,將X中全部Xi都映射爲一個對應的碼字。

在提問過程當中,當前所要提出的問題僅依賴於前面提出的若干問題的答案而定,因爲答案序列惟一肯定該目標,於是全部目標對應着不一樣的答案序列,

而且,若是用0表示」是「,用1表示」否「,那麼可得到目標集的一個二元碼。該編碼的指望長度便是提問方案所需的指望問題數。

反之,若給定目標集的一個二元編碼,能夠求得與該編碼相對應的問題序列,使其指望問題數等於編碼的指望碼長,若是提問方案中的第一個問題是:」目標的對應碼字的第一位是1嗎?「

考慮下面這個虛構的例子:

一個隨機變量X,其取值空間爲X={1,2,3,4,5},對應的機率分別是{0.25,0.25,0.2,0.15,0.15}。

爲得到X的一個最優二元碼,須要將最長的碼字分配給字符4和5。通常地,咱們能夠將該編碼構造稱爲其中的兩個最長碼字僅差最後一位有所不一樣。

對於這樣的編碼,可將字符4和5組合成單個信源字符,其相應的機率值爲0.3。按此思路繼續下去,將兩個最小几率的字符組合成一個字符,直至僅剩下一個字符爲止,而後對字符進行碼字分配,最終咱們獲得以下表格:

對於上面的信源編碼方案,對應的問題序列能夠反推出來。

  • 第一個問題應該是」X等於2或3嗎?「:由於只有2或3的碼字第一位是1,對此問題的回答能夠肯定碼的第一位
  • 假定第一個問題的回答是」對「,那麼下一個問題應該是」X=3嗎?「:這能夠肯定碼的第二位 
  • 同時要注意,對於第二個問題,也能夠是」X等於1或3嗎?「,它獨立於第一個問題:由此可肯定碼的第二位

在最優的提問方案中,指望問題數EQ知足:

,這符合最優碼指望長度界定理。

3. 加權碼字的赫夫曼編碼

最小化的赫夫曼算法其實對任意一組都成立的,而無需考慮的大小。此時,赫夫曼編碼算法最小化的是碼長加權和,而非平均碼長。

4. 赫夫曼編碼與」切片「問題(字母碼)

咱們已經說明了信源編碼與20問題遊戲的等價性。對於給定的隨機變量,最優問題序列對應於一個最優的信源編碼。然而,由赫夫曼編碼肯定的最優問題方案要求對於對於任一問題,存在某個集合,使該問題具備形式」X∈A嗎?「。

接下來考慮一個帶約束的20問題遊戲,具體說就是,假定X={1,2,....,m}中的元素降序排列爲,而且要求全部的提問只能是惟一形式」X>a嗎?「,其中a是某個數。

由赫夫曼算法所構造出的赫夫曼編碼能夠不與切片集(形如{x:x<a}的集合)相對應。若是選取由赫夫曼編碼所獲得的碼字長度(),而且用它們來分配字符到編碼樹上,使得每一個碼長對應着編碼樹的一個層,在對應的層上,將首達節點處標識上對應的字符,由此方法可構造出另外一個最優碼。

然而與赫夫曼編碼不一樣的是,該編碼是一個切片碼(slice code),這是由於與此最優碼等價的最優問題方案中的每一個問題(對應該碼的一位)將該樹分裂成一系列 {x:x>a} 與 {x:x<a} 的集合形式。

上面說的有些抽象,仍是繼續用前面的一個例子來講明一下,對隨機變量的赫夫曼編碼方案以下

可知由赫夫曼編碼程序所構造出的赫夫曼碼並非切片碼,但若使用由赫夫曼編碼程序得到的碼字長度,即{2,2,2,3,3},同時將相應碼字分配給編碼樹中相應層的首達節點,就可獲得隨機變量的以下一組新的編碼:

  • 1 -> 00
  • 2 -> 01
  • 3 -> 10
  • 4 -> 110
  • 5 -> 111

能夠證實上述編碼是個切片碼,因爲碼字是按字母序排列的,故咱們將這類片斷碼稱做字母碼(alphabetic code)。

0x2:赫夫曼碼的最優性討論

1. 赫夫曼碼最優性所具備的性質

利用概括法能夠證實二元赫夫曼碼是最優的,爲了證實赫夫曼碼的最優性,首先來證實特定最優碼所具備的性質。

假定隨機變量的機率分佈依次排列爲,當達到最小時,編碼是最優的。

對任意一個分佈,必然存在知足以下性質的一個最優即時碼:

  • 其長度序列與按機率分佈列排列的次序相反,即,若,則
  • 最長的兩個碼字具備相同長度。
  • 最長的兩個碼字僅在最後一位上有所差異,且對應於兩個最小可能發生的字符。

用歸謬法來證實二元赫夫曼碼的最優性,證實須要的步驟是經過一些列的交換、修剪、重排過程。考慮一個最優碼Cm,以及一個C'm(經過某種交換、修剪、重排)。

  • ,則。此時經過交換碼字便可得此結論。

設C'm爲將Cm中的碼字 j 和 k 交換所獲得的編碼,則

 

由於,且因爲Cm是最優的,可得,故必有。從而最優碼自己Cm一定知足性質1。

  • 最長的兩個碼字具備相同的長度 

經過修建碼字得到該結論,若是兩個最長碼字長度不一樣,那麼將較長碼字的最後一位刪除,它仍可保持前綴形式,但此時具備更短的指望碼字長。所以,最長的兩個碼字長度一定相等。

下圖展現瞭如何從任一編碼方案,經過交換、修剪、重排過程。考慮一個最優碼Cm

 

假定,a)給出可能的即時碼,經過修剪無兄弟的分枝,可將原碼改進爲b),將編碼樹重排成如c)所示,使得從頂部到底部按照碼字長度的遞增排列。最後,交換機率匹配使得編碼樹的指望深度獲得改進,如d)所示。

所以,任何一個最優碼均可以經過重排和交換最終具備如d)所示的典則碼形式。

至此,我已經證實:若,則存在長度列爲的一個最優碼,且碼字僅最後一位有所區別。

綜上,咱們能夠到赫夫曼碼最優定理,即,若是C*爲赫夫曼碼而C'是其餘碼,則 L(C*) <= L(C')。

針對二元字母表的狀況,能夠推廣到D元字母表的情形,赫夫曼碼算法的最優性也是成立的。

2. 最優赫夫曼碼的迭代式構建過程

上一小節咱們討論了赫夫曼碼的性質引理,知足引理的最優碼是存在的,咱們稱這樣的碼爲典則碼(canonical code)。對於m元字母表上的機率密度函數,咱們定義其m-1元字母表上的赫夫曼合併(huffman reduction)爲。用表示p'的最優碼,而用表示p的典則最優碼。

上圖中,令,a)給出一個典則最優碼。合併兩個最小几率獲得b)中的編碼。按照降序方式重排機率值,獲得c)所示的m-1個字符上的典則碼。

通常地,若是從m-1個字符熵的機率分佈p'的一個最優碼出發,經過擴展對應於的碼字,就能夠得到m個字符熵的編碼,且獲得的新碼是最優的。

值得注意的是,在每一步合併兩個最小可能發生的字符時,赫夫曼編碼是一個」貪婪「算法,前面的證實代表這樣的局部最優性能夠保證最終編碼的全局最優性。

Relevant Link: 

《信息論基礎》阮吉壽著 - 第五章

 

6. 赫夫曼碼與香農碼對比異同

0x1:赫夫曼碼和香農碼在單個碼字長度上的長度對比

對於某個特定的字符,使用碼長爲的編碼(稱爲香農碼)可能比最優碼更差。

例如,考慮一個由兩個字符組成的信源,其中一個發生的機率爲0.9999,而另外一個爲0.0001。若使用碼字長度,則意味着他們的碼長分別爲1比特和14比特。然而,用赫夫曼碼程序能夠很容易得出,這兩個字符的最優碼長都是1比特。

於是,在香濃編碼中,不常常發生的字符的碼字長度通常比最優碼的碼字更長。

可是最優碼的碼字長度老是小於等於嗎?答案是否認的,考慮下面這個例子:

設隨機變量X的分佈爲

赫夫曼編碼程序產生的碼字長度爲(2,2,2,2)或(1,2,3,4),這兩個碼的指望碼字長相同。對第二個編碼,其第三個字母的長尾3,比大。

雖然總整體指望平均上,香農碼和赫夫曼碼都是符合上下界定理的,即。可是在單個碼字上,由於機率分佈不均的緣故,香農碼中某個字符的碼字長度可能小於最優(赫夫曼)編碼中的相應字符的碼字長。

同時這裏例子也說明了,最優碼的碼字長集合並不惟一,可能存在1個以上的具備相同指望值的碼長集。

0x2:香農碼的競爭最優性

咱們已經證實了赫夫曼碼是具備最小指望長度的最優碼。可是,對於某個特定的信源序列來講,赫夫曼碼的性能如何呢?對於全部序列來講,赫夫曼碼都優於其餘編碼嗎?

顯然不是的,由於存在某些編碼,它們分配較短的碼字給不常常發生的信源字符,對於這些信源字符,這樣的編碼比赫夫曼碼更好。之因此出現這個現象是由於,指望長度最優並不必定表明局部到處最優,這進一步致使指望長度最優並不必定是全局競爭性最強,由於競爭性是全部局部博弈的綜合結果

在正式敘述競爭最優性問題以前,咱們經過一個具體的例子來引入話題,以便更好地理解這其中的博弈思惟。

1. 從一個即時碼效率競爭零和遊戲提及

有兩個參與一個零和博弈遊戲,給定給一個屬於特定機率分佈的信源字符序列,要求他們各自設計一個即時碼。比賽的規則是:對此信源字符,若是參賽者A設計的碼字比參賽者B設計的短或長,則A相應的得分是1或-1,若平手,則A得分爲0。

從博弈論的角度來看,這是一個田忌賽馬問題,即對於A來講,他可能從總體指望上弱於B,但A能夠充分利用單輪博弈這個優點,在儘可能多的輪次中,分配稍微強於B的碼字上場進行博弈,而在餘下的少許輪次中,用大幅度弱於B的碼字去慘輸,這樣,從總體上看,比賽的最終結果仍是A勝。這種策略的思想是:集中優點力量贏得儘可能多的局部戰役,而在不重要的少許局部戰役中幾乎不投或者投入不多的資源,從而博取全局的整體勝勢。

2. 香農碼單個碼字長度的界

香農碼每一個碼字長度,這裏設表示其餘惟一可譯碼的相應碼字長度,則有:

例如,短5比特或更多的機率不超過1/16。

證實過程以下:

上面證實過程的最後一步,由Kraft不等式獲得

所以,在大多數狀況下,沒有其餘碼可以比香農碼更爲優越。可是上述過程其實是證實了下界,事件成立的機率>= 1/2只是一個下界證實,即證實了最壞狀況下,香農碼也不會壞到哪裏去。

但這是不夠的,在博弈論架構中,人們一般但願證實,下面咱們來證實這個更爲嚴格的判斷準則下,香農碼也是最優的。

若是機率密度函數p(x)是二進制的,則均爲整數。有以下定理:

對二進制機率密度函數p(x),設爲信源的二元香農碼的碼字長度,爲信源任何其餘惟一可譯二元碼的碼字長度,則:

,當且僅當對全部的x,都有時,等號成立。因而,碼長分配惟一競爭最優的

證實過程以下:

定義階躍函數sgn(t)以下:

引入一個新的函數,以下圖所示:

由上圖可知,,對於,即僅對於全部整數成立,但對全部實值不成立。此時能夠獲得:

其中

  • (a)是由sgn(x)的上界獲得
  • (b)是因爲知足Kraft不等式獲得

由此,咱們證實了在某類判別準則下,香農碼是競爭最優的。

Relevant Link: 

《信息論基礎》阮吉壽著 - 第五章

  

7. Shannon-Fano-Elias編碼

0x1:基於累計機率分佈的編碼映射方案形式化定義

在本節中,咱們介紹一個簡單的惟一可譯碼狗仔程序,基本思路是利用累計分佈函數來分配碼字。

不失通常性,假定取,假設對全部的x,有p(x)>0,定義累計分佈函數F(x)爲:

考慮修正的累計分佈函數:

其函數圖以下圖所示:

其中,表示小於x的全部字符的機率和加上字符x機率的一半所獲得的值。因爲隨機變量是離散的(信源是離散的),故累計分佈函數所含的階梯高度爲p(x),函數的值正好是與x對應的那個階梯的中點。

  • 因爲全部的機率值是正的,若,則
  • 若已知,則能夠肯定x。

所以,只需經過觀察累計分佈函數的圖形,就能夠找到相應的x,故能夠做爲x的編碼(本質上就是一種編碼映射函數)。這符合編碼的奇異性和惟一可譯性。

可是,根據離散機率分佈函數的性質,咱們知道,須要無限多的比特才能表示實數,由於不可能徹底相等而只能無限逼近。因此,使用的精確值做爲對x的編碼不可行,轉而必須使用近似值來進行編碼,因此接下來的問題就是,這個近似值須要精確到什麼程度呢?

假定將舍入取位,記爲,因而,取的前位做爲x的碼,由舍入定義,可得:

若:,則

於是,位於對應x的階梯之中,那麼,使用比特足以表示x。

除了證實了碼字與字符一一對應以外,還須要證實碼字集是無前綴的。

考慮每一個碼字,注意到它實際上表明的不是一個點,而是一個機率區間,碼是無前綴的當且僅當碼字對應的區間互不相交。這能夠由累計機率分佈函數的性質來保證。

最後,因爲使用比特來表示x,則編碼的指望長度爲:

所以,該編碼方案的指望碼長不會超過熵值2比特。

0x2:Shannon-Fano-Elias編碼舉例說明

首先考慮下面的例子,其中全部機率值都是二進制的,碼的構造以下表:

在此情形下,指望碼長尾2.75比特,而熵爲1.75比特。

注意表格中的碼字,顯然存在着某些無效性,若是最後兩個碼字的最後一位刪除,那麼獲得的碼就再也不是無前綴的了。

如今看Shannon-Fano-Elias碼的另外一個例子,在該例中,因爲分佈不是二進制的,因此F(x)的二進制表示可能有無窮位數字,用近似值來代替。

上述編碼的平均長度比該信源赫夫曼碼的長度大12比特。

Relevant Link: 

《信息論基礎》阮吉壽著 - 第五章

  

8. 決策樹(ID三、C4.5)算法的赫夫曼編碼本質

0x1:決策樹模型和赫夫曼碼的一一對應關係

決策樹的建樹過程咱們很是熟悉,它是一種層次迭代樹結構模型,從根節點開始,每次根據熵增益選擇一個最優的特徵做爲分裂節點,直到將全部樣本都分配到某個葉節點上。

這裏咱們用信息論中赫夫曼碼的理論框架,來從新看一下決策樹的建樹邏輯。

  • 決策樹面對的樣本特徵,能夠理解爲一組信源信號X,信源信號X的元素個數爲特徵個數。決策樹要創建的樹結構本質,就是須要決定,哪些特徵放前面,哪些特徵放後面,即如何進行序列編碼。
  • 決策樹從根節點開始,逐層遞進,直到將全部樣本分配到某個葉節點上,這是在尋找一個赫夫曼編碼序列,將全部信源信號進行編碼。
  • 決策樹在每層都尋找當前能帶來最大熵增益的特徵屬性,這裏隱含了一個信息,實際上,決策樹是根據各個特徵屬性的機率大小進行了一次從大到小的排序,而後在每一層逐個取當前機率最大的特徵屬性做爲分裂點(split point),這是一種字母碼的赫夫曼碼的構建過程。

0x2:從赫夫曼碼視角看決策樹的優缺點

從上述討論能夠看到,決策樹模型的本質就是一個赫夫曼碼編碼方案,所以,咱們能夠藉助赫夫曼碼的定理和引理來看決策樹的算法優缺點。

1. 決策樹的優勢

由於決策樹的建樹過程,符合赫夫曼碼的貪婪搜索算法,每一次都是局部最優的,且全局也是最優的。因此,決策樹的樹結構表明了對數據特徵的一種最短編碼

怎麼理解這句話呢?簡單來講,決策樹能保證在用最短的步驟將數據映射爲一個具體類型,即從一個信源編碼爲一個序列信號。再通俗一點說就是,將一個數據X映射爲一個具體的Y。在具體的分類或者回歸任務中,Y指的就是離散類型或者回歸值。

2. 決策樹的缺點

成也蕭何敗蕭何,基於赫夫曼碼的堅實理論,決策樹得到了高效的信源信號描述能力的同時,也一樣面臨着赫夫曼碼的缺點,這是熵自己性質帶來的。

這就是咱們前面說的,這就是像香農碼/赫夫曼碼這種熵碼,對大量的小几率事件,不能及時中止,而會不斷地給其分配新的碼字,這樣的後果就是,當數據集特徵中,有大量的小几率特徵,決策樹的深度會變得很深,最終致使過擬合。

這樣說有些抽象,咱們虛構一個例子來講明。

假設如今有一個數據集,咱們已經完成了特徵工程,準備訓練一個決策樹模型,如今數據集各個特徵各自的機率分佈爲,X={1/4,1/4,1/16,1/32,....,1/32}。

能夠看到,前兩個特徵是高几率信源信號,咱們將最短的2個碼字分配給它們,這沒有問題,可是接下來,剩餘的特徵單個的機率都很低,並且數量很大,按照赫夫曼碼的構建過程,會按照機率的順序逐個分配其遞增加度的碼字,能夠很容易想象,若是數據特徵的機率分佈越分散(小几率特徵越多),最後獲得的赫夫曼碼指望長度就會越長。

接下來,還得再說明一個問題,爲何說碼長越長,越容易引發過擬合呢?反正我都是按照赫夫曼編碼理論獲得的最優碼,你管我長仍是短。

問題的根源出在數據上,咱們知道,數據中除了蘊含有用的信息以外,還存在着大量的噪聲數據,包括:

  • 系統噪聲:目標事物自己就存在某種不肯定性,例如該特徵和目標值之間根本就不存在相關關係
  • 採樣噪聲:數據採集過程當中引入的噪聲

這些噪聲的存在,最終致使了樣本特徵中出現大量小几率特徵。這些包含噪聲的小几率特徵,在建模過程當中是須要進行剔除的,不該該被歸入到編碼範疇內。 

從上述討論中咱們還獲得一個工程實踐上的啓發,在作特徵工程的時候,不要一味地貪多,認爲特徵越多越好,反正無論三七二十一,一頓操做,各類想獲得的特徵都給你提出來,讓後一股腦丟給機器學習算法,心想,反正個人工做就是提特徵,至於哪些特徵有用,哪些特徵沒用,是你算法模型要決定的事情,我只管給模型喂海量高質量的數據就能夠了。

這種作法在實踐中固然大機率也不會遇到很大的問題,可是咱們得知道其中緣由,這是由於模型經過剪枝、dropout、正則化等手段進行了提早中止,必定程度上破壞了原始的赫夫曼碼的構建過程,提早終止了樹的繼續增加,這才致使了過擬合的發生。

Relevant Link: 

https://www.cnblogs.com/LittleHann/p/7309511.html#_lab2_4_0

 

9. TODO

目前還沒法完全思考的問題,留待之後繼續深刻研究 

  • 蒙特卡洛搜索中蘊含的熵思想 
  • 怎麼樣從理論上定量分析一個問題域的熵,例如webshell惡意文件檢測,將惡意文件的文本表徵看作隨機變量,怎麼衡量其熵值。
相關文章
相關標籤/搜索