1948 - Shannon 資訊理論(位元與熵的誕生)#
案件摘要#
1948 年,Claude Shannon(1916–2001) 在《貝爾系統技術期刊》 連載《通訊的數學理論》(A Mathematical Theory of Communication):
他定義了資訊熵:
並證明了兩個驚人的定理: 1. 信道編碼定理:任何有雜訊的信道,都存在一個容量 \(C\) —— 只要傳輸率 < C,錯誤率可以任意小; 2. 信源編碼定理:資料可以被壓縮到極限熵—— Huffman 編碼(1952)與 ZIP(1989)的理論基礎。
「位元(bit)」這個詞就是 Shannon 發明的—— 數位時代的基本單位,從這篇論文開始。
前因 -- 為什麼會有這個案子#
- 貝爾實驗室的戰時任務(1941–1945): Shannon 在貝爾實驗室(Bell Labs)工作,二戰期間研究密碼學與通訊:
- 1941 年他的保密系統的數學理論(戰時機密報告)是密碼學的數學化;
- 他發現了一個秘密:加密與壓縮是同一件事的兩面—— 都是「消除冗餘」。
- 通訊工程的混亂(1940s): 當時的通訊工程沒有統一的理論—— 電報、電話、廣播各自為政,工程師憑經驗調整。
- Nyquist 與 Hartley 的先聲(1924/1928):
- Nyquist(1924):電話線的傳輸率上限(取樣定理,1928);
- Hartley(1928): \(I = \log n\) ( \(n\) 個可能訊息的資訊量)—— 但沒有考慮機率。 Shannon 的洞察(1948):機率才是關鍵——
- von Neumann 的建議(1948): Shannon 為 \(H\) 找名字時,von Neumann 建議:
「叫它『熵』吧——第一,統計力學已經用過這個名字; 第二,沒有人真的懂熵,所以辯論時你永遠佔優勢。」
線索與推理 -- 數學式、程式、理論#
第一條線索:資訊熵的定義與性質#
離散隨機變數的熵:
性質: - 均勻分布最大: \(n\) 個等機率事件, \(H = \log_2 n\) (最大不確定性); - 確定事件為零: \(p(x)=1 \Rightarrow H = 0\) (無不確定性); - 條件熵:
- 互資訊:
第二條線索:信道編碼定理(Shannon 的最強結果)#
定理(Shannon, 1948):任何信道的容量:
二進位對稱信道(BSC,翻轉機率 \(p\) ):
驚人的推論:
例: \(p = 0.1\) 的信道, \(C = 1 - H_2(0.1) \approx 0.531\) 位元/次—— 即使 10% 的訊號被翻轉,仍能可靠傳輸 53% 的容量!
第三條線索:信源編碼與壓縮(Huffman 1952)#
定理(Shannon 信源編碼定理):
- Huffman 編碼(1952):最優前綴碼(學生論文!):
- 理論極限:Huffman 編碼的平均長度:
- 現代壓縮:ZIP(1989,LZ77+Huffman)、MP3(1993)、JPEG(1992)、 算術編碼(逼近熵的極限)——全部是 Shannon 理論的工程實現。
Python:資訊熵、信道容量與 Huffman 編碼#
import numpy as np
from collections import Counter
import heapq
# 1) 資訊熵的計算
def entropy(probs):
"""H = -Σ p log₂ p"""
probs = np.array([p for p in probs if p > 0])
return -np.sum(probs * np.log2(probs))
print("資訊熵:")
print(f" 均勻 2 面(公平硬幣):H = {entropy([0.5, 0.5]):.4f} 位元")
print(f" 均勻 6 面(公平骰子):H = {entropy([1/6]*6):.4f} 位元")
print(f" 均勻 256 面(1 byte):H = {entropy([1/256]*256):.4f} 位元(= log₂256 = 8)")
print(f" 偏斜(p=0.9/0.1): H = {entropy([0.9, 0.1]):.4f} 位元")
print(f" 確定事件(p=1): H = {entropy([1.0]):.4f} 位元\n")
# 2) 中文與英文的熵(估計)
text_en = "the quick brown fox jumps over the lazy dog the the the"
text_zh = "資訊科學是研究資訊的科學資訊是消除不確定性的度量"
def text_entropy(text):
cnt = Counter(text)
total = len(text)
probs = [c/total for c in cnt.values()]
return entropy(probs), len(cnt)
H_en, n_en = text_entropy(text_en)
H_zh, n_zh = text_entropy(text_zh)
print(f"英文樣本({n_en} 個字元):H = {H_en:.4f} 位元/字元")
print(f"中文樣本({n_zh} 個字元):H = {H_zh:.4f} 位元/字元\n")
# 3) 信道容量(二進位對稱信道)
def h2(p):
"""二進位熵函數"""
if p == 0 or p == 1:
return 0.0
return -p*np.log2(p) - (1-p)*np.log2(1-p)
def bsc_capacity(p):
"""BSC 容量:C = 1 - H₂(p)"""
return 1 - h2(p)
print("二進位對稱信道容量(C = 1 - H₂(p)):")
for p in [0.0, 0.01, 0.1, 0.25, 0.5]:
C = bsc_capacity(p)
print(f" 錯誤率 p = {p:.2f}: C = {C:.4f} 位元/次")
print(" → 即使 10% 錯誤,仍能可靠傳輸 53% 的容量(Shannon 極限)\n")
# 4) Huffman 編碼(最優前綴碼,1952)
def huffman_codes(text):
"""產生 Huffman 編碼"""
cnt = Counter(text)
heap = [[w, [sym, ""]] for sym, w in cnt.items()]
heapq.heapify(heap)
while len(heap) > 1:
lo = heapq.heappop(heap)
hi = heapq.heappop(heap)
for pair in lo[1:]:
pair[1] = '0' + pair[1]
for pair in hi[1:]:
pair[1] = '1' + pair[1]
heapq.heappush(heap, [lo[0] + hi[0]] + lo[1:] + hi[1:])
return dict(sorted(heapq.heappop(heap)[1:]))
text = "abracadabra"
codes = huffman_codes(text)
cnt = Counter(text)
total = len(text)
print(f"Huffman 編碼('{text}'):")
avg_len = 0
for sym in sorted(cnt):
print(f" '{sym}' (p={cnt[sym]/total:.2f}): {codes[sym]}")
avg_len += cnt[sym]/total * len(codes[sym])
H = text_entropy(text)[0]
print(f" 平均碼長 = {avg_len:.4f} 位元")
print(f" 熵 H = {H:.4f} 位元")
print(f" H ≤ 平均碼長 < H+1:{H:.4f} ≤ {avg_len:.4f} < {H+1:.4f} ✓")
print(f" 壓縮率(vs 固定 4 位元/字元):{(1 - avg_len/4)*100:.1f}%")
資訊熵:
均勻 2 面(公平硬幣):H = 1.0000 位元
均勻 6 面(公平骰子):H = 2.5850 位元
均勻 256 面(1 byte):H = 8.0000 位元(= log₂256 = 8)
偏斜(p=0.9/0.1): H = 0.4690 位元
確定事件(p=1): H = 0.0000 位元
英文樣本(27 個字元):H = 4.1671 位元/字元
中文樣本(16 個字元):H = 3.8554 位元/字元
二進位對稱信道容量(C = 1 - H₂(p)):
錯誤率 p = 0.00: C = 1.0000 位元/次
錯誤率 p = 0.01: C = 0.9192 位元/次
錯誤率 p = 0.10: C = 0.5310 位元/次
錯誤率 p = 0.25: C = 0.1887 位元/次
錯誤率 p = 0.50: C = 0.0000 位元/次
→ 即使 10% 錯誤,仍能可靠傳輸 53% 的容量(Shannon 極限)
Huffman 編碼('abracadabra'):
'a' (p=0.45): 0
'b' (p=0.18): 110
'c' (p=0.09): 1110
'd' (p=0.09): 1111
'r' (p=0.18): 10
平均碼長 = 2.0909 位元
熵 H = 2.0404 位元
H ≤ 平均碼長 < H+1:2.0404 ≤ 2.0909 < 3.0404 ✓
壓縮率(vs 固定 4 位元/字元):47.7%
結案 -- 後果與影響#
- 數位時代的基本單位(1948):
從此,資訊可以被量化—— 電腦的記憶體(KB/MB/GB)、網路的頻寬(Mbps)、資料庫的容量—— 全部用 Shannon 的單位。 - 數位通訊的革命(1948–): - 信道編碼定理 → 錯誤更正碼: - Hamming 碼(1950):Hamming(Richard Hamming,1968 圖靈獎) 在貝爾實驗室發明錯誤更正碼; - Reed–Solomon 碼(1960):CD、DVD、QR 碼的錯誤更正; - Turbo 碼(1993)與 LDPC(1963/1996):逼近 Shannon 極限—— 4G/5G 行動通訊、深空通訊的基礎。
- 資料壓縮的世紀(1952–):
沒有壓縮,就沒有網路影音—— 一部 2 小時的電影(未壓縮)需要 200 GB,壓縮後 2 GB。 - AI 與機器學習的理論基礎(1950s–): - 決策樹(ID3, 1979):用資訊增益(互資訊)選擇分裂特徵; - 最大熵模型(1990s):自然語言處理的核心; - 變分推斷與 VAE(2013):KL 散度(相對熵)是深度學習的損失函數; - 語言模型(GPT, 2018–):cross-entropy loss—— GPT 的訓練目標就是「最小化熵」!
- 密碼學的基礎(1949): Shannon 的《保密系統的數學理論》(1949)定義了完美保密:
一次一密(one-time pad)是唯一被證明完美保密的系統—— 這是密碼學的理論起點(見「2002-RSA公開金鑰.md」)。 - 生物與物理的交匯(1950s–): - DNA(1953):Watson–Crick 的雙螺旋——DNA 是數位資訊(4 個鹼基 = 2 位元); - 資訊與熱力學:Maxwell 惡魔(1867)的除魅—— Landauer(1961)證明抹除一位元需要 \(kT\ln 2\) 的能量—— 資訊是物理的! - 歷史定位:Shannon 是資訊時代的牛頓—— 他把「資訊」從直覺概念變成可量化的數學物件:
一句話:這個世界的一切都可以用位元來衡量。
關鍵人物與文獻#
- C. E. Shannon:A Mathematical Theory of Communication(1948);Communication Theory of Secrecy Systems(1949);位元。
- H. Nyquist:取樣定理(1928)——Shannon 的先聲。
- R. V. L. Hartley:Transmission of Information(1928)—— \(I = \log n\) 。
- D. A. Huffman:A Method for the Construction of Minimum-Redundancy Codes(1952)。
- R. Landauer:Irreversibility and heat generation in the computing process(1961)——資訊是物理的。
- 相關案件:
1936-圖靈機.md、2002-RSA公開金鑰.md、2018-深度學習三巨頭.md、通訊技術/1948-資訊理論.md。