情報エントロピー
確率分布の「乱雑さ・予測不能性」を測るシャノンの公式と、データ圧縮の理論的限界
- 1
- 情報エントロピー は、確率分布がどれだけ「予測しにくく乱雑か」を数値化したものであり、シャノンによって (単位: ビット)と定義された
- 2
- エントロピーは、すべての結果が等確率(一様分布)のときに最大値を取り、逆にどれか1つの結果がほぼ確実(確率1に近い)に偏るほど0に近づく
- 3
- エントロピーは「その情報源を圧縮するのに理論上必要な平均ビット数の下限」を表しており、偏った(予測しやすい)データほど圧縮効率が高くなることをハフマン符号などの圧縮アルゴリズムが実際に裏付けている
なぜこれを学ぶのか? — 現実社会とテクノロジーでの価値
なぜ生まれたのか?
情報エントロピー $H$ は、確率分布がどれだけ「予測しにくく乱雑か」を数値化したものであり、シャノンによって $H = -\sum_i p_i \log_2 p_i$(単位: ビット)と定義された
身につく武器・思考力
エントロピーは、すべての結果が等確率(一様分布)のときに最大値を取り、逆にどれか1つの結果がほぼ確実(確率1に近い)に偏るほど0に近づく
実社会・ITでの活躍現場
- •データ圧縮アルゴリズム(ハフマン符号)における符号長の理論的下限
- •ITシステム・アルゴリズム実装における論理設計
- •データ分析やシミュレーションにおける数理モデリング
Layer 1 — 直感・シミュレーター
いくつかの出来事(例: サイコロの目や偏ったコイン)の確率をスライダーで調整してみよう(自動的に合計が1になるよう正規化される)。確率をすべて均等にするとエントロピー が最大値 に達し、逆にどれか1つの確率を1に近づけるとエントロピーが0に近づいていく様子をリアルタイムのバーグラフで確認できる。「均等化」ボタンで最大エントロピー状態に一発でリセットできる。
情報エントロピー = 1.792 ビット
最大値 = 2.000 ビット(全確率が均等なとき)
↑ どれか1つの確率を大きくして偏らせるとエントロピーが下がり(予測しやすい=圧縮しやすい)、「均等化」ボタンを押すとエントロピーが最大値に達する。
表と裏の出る確率がそれぞれ 0.5 のコインと、表が出る確率 0.99・裏が出る確率 0.01 の偏ったコインを比べたとき、情報エントロピー が大きいのはどちらか?
Layer 2 — 定義・受験・証明
定義
個の互いに排反な結果を持ち、それぞれの結果が確率 (ただし )で起こる確率分布に対して、その「情報エントロピー(シャノンエントロピー)」 を次のように定義する。
(慣例として の項は として扱う。)これは「1回の観測から平均して得られる情報量」を単位ビットで表したものであり、確率分布の不確実性の大きさを表す指標である。
公式・数理モデル
証明・導出
エントロピーが一様分布で最大になることの証明(ラグランジュの未定乗数法): 制約 のもとで を最大化する。ラグランジュ関数を
とおき、各 による偏微分を 0 とおくと( に注意して微分すると)、
これよりすべての について が同じ値()になるため、 でなければならない。制約 と合わせると が唯一の停留点であり、 は上に凸( の凹性による)なのでこれが最大値を与える。代入すると
したがって、エントロピーは確率が完全に均等(一様分布)なときに最大値 を取ることが示された。
押さえておきたいポイント
- エントロピーは常に の範囲にあり、下限0はどれか1つの確率が1(完全に予測可能)のとき、上限は一様分布のときに達成される
- エントロピーが低い(偏った)分布ほど「次に何が起きるか予測しやすい」ため、平均的に少ないビット数で符号化(圧縮)できる
- シャノンの情報源符号化定理は、任意の情報源を可逆圧縮する際の理論的な平均ビット数の下限がエントロピー であることを保証する
- ハフマン符号は、出現確率が高い記号に短い符号、低い記号に長い符号を割り当てることで平均符号長を に近づける具体的な圧縮アルゴリズム
本トピックの内容・数理モデルは、文部科学省学習指導要領(算数・数学・情報)および国際標準カリキュラムに準拠し、エンジニアリング現場の実装事例と照らし合わせてMath World Lab編集部により検証・作成されています。
Layer 3 — 工学応用・現場実装
データ圧縮アルゴリズム(ハフマン符号)における符号長の理論的下限
ZIPやJPEGなどの可逆圧縮の内部で使われるハフマン符号は、出現頻度の高い文字ほど短いビット列を、低い文字ほど長いビット列を割り当てることで平均符号長を最小化する。この平均符号長の理論的な下限こそが情報エントロピー であり、確率分布が偏っている(エントロピーが低い)データほど圧縮率が高くなることを、実際にエントロピーと平均符号長を計算して確認できる。
1// 確率分布からシャノンの情報エントロピー H = -Σ p*log2(p) を計算2function shannonEntropy(probabilities: number[]): number {3 return -probabilities4 .filter((p) => p > 0) // 0*log2(0) = 0 として扱うため除外5 .reduce((sum, p) => sum + p * Math.log2(p), 0);6}78// 簡易ハフマン木のノード9type HuffmanNode = { symbol?: string; freq: number; left?: HuffmanNode; right?: HuffmanNode };1011// 出現頻度から各記号のハフマン符号長を求める(優先度キューの代わりに配列とソートで簡易実装)12function huffmanCodeLengths(freqs: Record<string, number>): Record<string, number> {13 let nodes: HuffmanNode[] = Object.entries(freqs).map(([symbol, freq]) => ({ symbol, freq }));14 const depth: Record<string, number> = {};15 Object.keys(freqs).forEach((s) => (depth[s] = 0));1617 while (nodes.length > 1) {18 nodes.sort((a, b) => a.freq - b.freq);19 const [a, b] = [nodes[0], nodes[1]];20 // aとbの部分木に属する全記号の符号長を+1する21 const markDepth = (node: HuffmanNode) => {22 if (node.symbol) depth[node.symbol]++;23 if (node.left) markDepth(node.left);24 if (node.right) markDepth(node.right);25 };26 markDepth(a);27 markDepth(b);28 const merged: HuffmanNode = { freq: a.freq + b.freq, left: a, right: b };29 nodes = [merged, ...nodes.slice(2)];30 }31 return depth;32}3334// 例: 偏った確率分布(圧縮しやすい)35const probs = [0.5, 0.25, 0.125, 0.125];36console.log(`エントロピー H = ${shannonEntropy(probs).toFixed(3)} ビット/記号`); // 1.75 ビット3738const lengths = huffmanCodeLengths({ A: 50, B: 25, C: 12, D: 13 });39console.log(lengths); // ハフマン符号の平均符号長はHに極めて近くなる
次に学ぶならコレ!おすすめトピック
この単元と深い繋がりを持つ、あわせて学ぶと理解が深まるおすすめ単元