1. 程式人生 > >6.資訊理論(一):資訊量、熵和最優編碼

6.資訊理論(一):資訊量、熵和最優編碼

前言

資訊理論是由克勞德·夏農發展,用來找出訊號處理與通訊操作的基本限制,如資料壓縮、可靠的儲存和資料傳輸等。自創立以來,已被應用多個領域,例如自然語言處理(NLP)、機器學習等領域。

定長編碼(Block Codes)

讓我們從一個例子開始。小明酷愛動物,日常談吐中經常提及各種動物,包括:狗、貓、魚和鳥。一天,小明見到小紅(原諒我這麼俗的名字),兩個人決定用二進位制的方式來交流。為了交流方便,小明和小紅決定製定一套編碼規則

編碼對映

此時,若小明要發出“狗 貓 狗 鳥”的資訊,需要完成以下過程:

編碼過程

通過以上三個過程,便可以將“狗 貓 狗 鳥”轉化為二進位制了。

變長編碼(Variable Codes)

實際中,通訊往往需要付費,假設通訊按位(bit)收費。為了省錢,小明和小紅需要尋找合適的編碼策略。在設計編碼策略中,小紅統計了小明的說話

詞分佈

此時,若按照上面的定長編碼,每個字的平均編碼長度

L(x)=2×12+2×14+2×18+2×18=2

若想進一步壓縮平均編碼長度,變長編碼是一種有效的手段。變長編碼的基本思想:出現頻率高的字元使用短編碼,出現頻率低的字元使用長編碼。(你可能會問,為什麼不讓所有的編碼都使用短編碼?嘿嘿,都使用短編碼,還能實現一一對應嗎?)基於上述思想,小明和小紅重新指定了一套新的編碼策略:

詞分佈

此時,每個字的平均編碼長度為

L(x)=1×12+2×14+3
×18+3×18=1.75

顯然,新的策略能夠幫小明和小紅省很多錢。那麼,小明和小紅是如何設計的呢?

無損編碼(lossless compression)

為了便於接下來的描述,以下圖為例介紹幾個名稱

詞分佈

其中狗、貓、魚等稱為源符號,001110等稱為碼字,整個對映使用C(x)表示。

無損編碼

小明和小紅的交流中,首先要保證資訊的無損性,即保證編碼後的資訊能夠無損的復原。若使用定長編碼,復原資訊輕而易舉便可實現,而變長編碼則不同。假如使用上圖,此時小明給出的代號為

詞分佈

根據約定好的碼錶,小紅既可以理解成“狗 狗 鳥 狗”,也可以理解成“狗 貓 魚”。顯然,這是小明和小紅不願意看到的。通過查閱資料,小明和小紅髮現他們遇到的問題是“無損編碼”問題:

無損編碼是一類資料壓縮演算法,其壓縮的資料能夠無損的復原為原始資料。

C(x)是無損編碼,它需要是:

  • 非奇異編碼(Non-singular code):x1x2C(x1)C(x2)

在實際中,我們往往需要一次編碼一系列字元,而不是一次編碼一個字元,因此它需要滿足:

  • 可擴充套件編碼(Extension of a code):C(x1,...,xn)=C(x1)...C(xn)
  • 唯一可譯解碼(Unique decodability):xnixmjC(xni)C(xmj)

儘管唯一可譯解碼已經足夠強了,但它並不能支撐“收到所有字元以後才進行解碼”的情況。例如,C(x)

x 1 2 3 4
C(x) 10 00 11 110

當收到的代號是110000,解碼為322,而收到的代號是1100000,解碼為422。顯然,當收到所有資訊再解碼時,11就表示了不同的字元。對於此種問題,字首編碼是一種有效的解決方案,定義如下:

  • x1x2C(x1)Prefix(C(x2))

即任意符號的編碼都不是其他編碼的字首。基於字首編碼,C(x)

x 1 2 3 4
C(x) 0 10 110 111

在上面的介紹中,分別介紹了“非奇異編碼”、“唯一編碼”、“字首編碼”。這些編碼方式的相互關係可以通過下圖來描述:

詞分佈

通過上面的知識,字首編碼是解決編碼復原最好的方式,下面就需要考慮如何優化編碼長度。

最優編碼

碼樹

在介紹最優編碼之前,首先介紹一下碼樹和Karft不等式。對於給定碼字的全體集合,可以使用碼樹來表示。對於r進位制的碼樹,如下所示,其中左圖為二元碼樹,右邊為三元碼樹。在碼樹中R點是樹根,從樹根伸出樹枝,構成r元碼樹。

詞分佈

Karft不等式

對於r元字母表上的字首編碼,碼字長度為l1,l2,...,lm必須滿足不等式

irli1

反之,若給定滿足以上不等式的一組碼字長度,則存在一個相應的字首碼,其碼字長度就是給定長度。其中r可以理解成一個節點最多的孩子節點的個數。

正向證明
假設l1l2...lnA表示r進位制、深度為ln的碼樹。對於使用r進製表示的lln的任意字元,均能在碼樹A找到對應位置,進而第i個字首編碼在樹A中對應節點是vi。假設Ai表示以節點vi為根的子樹,此樹的深度為

相關推薦

6.資訊理論資訊量編碼

前言 資訊理論是由克勞德·夏農發展,用來找出訊號處理與通訊操作的基本限制,如資料壓縮、可靠的儲存和資料傳輸等。自創立以來,已被應用多個領域,例如自然語言處理(NLP)、機器學習等領域。 定長編碼(Block Codes) 讓我們從一個例子開始。小明酷愛

模式識別與機器學習概率論決策論資訊理論

本系列是經典書籍《Pattern Recognition and Machine Learning》的讀書筆記,正在研讀中,歡迎交流討論。 基本概念 1. 模式識別(Pattern Recognition):是指通過演算法自動發現數據的規律,並進行資料分類等任務。

Nginx實用教程啟動停止重載配置

style 負載 繼續 local con doc lin 配置文件的修改 tex Nginx是一個功能強大的web服務器和負載均衡軟件,由俄羅斯人開發。Nginx包括一個master進程和數個worker進程,master進程用於讀取、解析配置文件和管理worker進程,

【opencv入門之七】形態學圖像處理膨脹腐蝕

tar struct show 函數 使用 運算 腐蝕和膨脹 依賴 版本 參考網站: http://blog.csdn.net/poem_qianmo/article/details/23710721 1、形態學(morphology)概述   數學形態學(Mathem

Java泛型入門原理使用

core clas set out keyword getclass code 避免 post 遠在 JDK 1.4 版本的時候,那時候是沒有泛型的概念的。當時 Java 程序員們寫集合類的代碼都是類似於下面這樣: List list = new ArrayList();

java集合ListIteratorArrayArrayListLinkList

整體 http 是否 簡潔 畢業 一個 位置 數據 reac 畢業這麽久,java 標準庫中的集合都沒怎麽仔細了解過,準備好好學習學習。 集合(Collection):由一個或多個確定的元素所構成的整體叫做 集合--百度百科的解釋。換言之,就是裝元素的容器,元素可以是任何類

ElasticSearch筆記整理簡介REST與安裝配置

大數據 ElasticSearch ELK [TOC] ElasticSearch簡介 ElasticSearch是一款基於Apache Lucene構建的開源搜索引擎,它采用Java編寫並使用Lucene構建索引、提供搜索功能,ElasticSearch的目標是讓全文搜索變得簡單,開發者可以通

java多執行緒系列ThreadRunnableCallable實現多執行緒的區別

實現多執行緒 java實現多執行緒的方法有三種,分別是繼承thread類,實現runnable介面,實現callable介面(call方法有返回值) /** * 繼承Thread */ public class MyThread extends Thread{ int a = 0;

jmeter教程urluri及協議初識

jmeter是用純java語言實現的一個,用於介面、及效能測試的工具。關於jmeter的誕生,純屬歪打正著,就像當初unix系統的誕生,也是屬於歪打正著。有關的故事,可以自己去網上查。jmeter教程,原先在公司也寫過一些,不過,原先也只是用於公司內部分享用的,教程裡面的例子,也是用的公司的專案。現

Ajax簡介原理

Ajax(一):簡介、原理 一、簡介 Ajax:非同步的javascript和xml Ajax 的核心是XMLHttpRequest物件,該物件為向伺服器傳送請求和解析伺服器響應提供了流暢的介面。能夠以非同步方式從伺服器取得更多資訊,使用者不需要重新整理頁面也能取得資料。

JPA基礎知識簡介基本註解

JPA基礎知識(一):簡介、基本註解 一、簡介 JPA全稱Java Persistence API,用於物件持久化。 JPA通過JDK 5.0註解或XML描述物件-關係表的對映關係,並將執行期的實體物件持久化到資料庫中。 sun公司定義了JDBC介面,程式設計師可以通過介面來訪問資

Scala基礎教程簡介環境安裝

Scala基礎語法 如果有很好的瞭解Java語言,那麼將很容易學習Scala。 Scala和Java間的最大語法的區別在於;行結束符是可選的。考慮Scala程式它可以被定義為通過呼叫彼此方法進行通訊的物件的集合。現在,簡要地看看什麼叫做類,物件,方法和臨時變數。 ·    

Spring起源歷史背景等

 Spring 1.0的出現徹底改變了我們開發企業級Java應用程式的方式。 Spring的依賴注入與宣告式事務意味著元件之間再也不存在緊耦合,再也不用重量級的EJB了。這玩意兒不能更好了。 到了Spring 2.0,我們可以在配置裡使用自定義的XML名稱空間,更小、更簡單易懂的配置檔案讓Spring本身

淺析RxJava 1.x&2.x版本使用區別及原理ObservableFlowable等基本元素原始碼解析

RxJava開源框架的風靡程度在Github上無需多言,它帶來的響應式程式設計模式和執行緒隨意切換、巢狀請求、背壓等功能給了開發者耳目一新的體驗,更是成為了大多數APP中常用的RxJava+Okhttp/Retrofit+MVP/MVVM/Clean黃金組合中的

多執行緒——暫停恢復停止執行緒較好的方式,sleep/wait/yield區別

不推薦的 大家都知道:suspend()、resume()、stop()這些方法已經被廢棄了。suspend()、resume()如果使用不當,容易造成公共的同步物件資源的獨佔以及導致資料不同步。用官網的話說: This method has

C++11 併發程式設計基礎併發並行與C++多執行緒

正文 C++11標準在標準庫中為多執行緒提供了元件,這意味著使用C++編寫與平臺無關的多執行緒程式成為可能,而C++程式的可移植性也得到了有力的保證。另外,併發程式設計可提高應用的效能,這對對效能錙銖必較的C++程式設計師來說是值得關注的。 回到頂部 1. 何為併發 併發指的是兩個或多個獨立的活動在同

ActiveAndroid 下載配置與建立

專案地址:https://github.com/pardom/ActiveAndroid ActiveAndroid是一個輕量級的ORM框架,用ActiveAndroid能夠更快速地對資料庫進行增刪改查的操作(不用寫SQL語句),每一個數據記錄都可以通過save()和de

Java NIO總結ChannelBufferSelector

0. 概述 NIO的全稱是NoneBlocking IO,非阻塞IO,區別於BIO,BIO的全稱是Blocking IO,阻塞IO。那這個阻塞是什麼意思呢?例如傳統的多執行緒伺服器是BlockingIO模式的,從頭到尾所有的執行緒都是阻塞的,接收請求和處

影象配準】基於灰度的模板匹配演算法MADSADSSDMSDNCCSSDASATD演算法

簡介:        本文主要介紹幾種基於灰度的影象匹配演算法:平均絕對差演算法(MAD)、絕對誤差和演算法(SAD)、誤差平方和演算法(SSD)、平均誤差平方和演算法(MSD)、歸一化積相關演算法(NCC)、序貫相似性檢測演算法(SSDA)、hadamard變換演算法(

Android 圖片特效色相飽和度與亮度

    平時的圖片在使用了美圖秀秀之後就會呈現不一樣的效果,就像上面的圖片展示的那樣(上圖是一張美圖秀秀的使用截圖)。實際上上面的效果離不開色彩的三要素——色相、飽和度和亮度。人眼看到的任一彩色光都是這三個特性的綜合效果。其中色調與光波的波長有直接關係,亮度