WARNING
🧪 Beta公测版本提示:教程主体已完成,正在优化细节,欢迎大家提Issue反馈问题或建议。
香农信息论 — demo.py 代码详解
运行方式
bash
cd docs/information/shannon/code
python demo.pyCPU、NumPy 即可。一张图 bsc_capacity.png:左是二元熵 np.log(那是自然对数,会差
本章算的是信道,不是分类损失。信息论精简 的 demo 扫的是交叉熵与 KL 不对称。
代码逐段详解
第1步:h2 — 二元熵
python
def h2(p, eps=1e-12):
p = np.clip(np.asarray(p, dtype=float), eps, 1.0 - eps)
return -(p * np.log2(p) + (1.0 - p) * np.log2(1.0 - p))np.asarray:既吃标量0.5也吃数组ps。向量化后左图一条曲线一次算完。clip(..., eps, 1-eps):时 。物理上 ,数值上要躲开。 eps=1e-12对曲线两端够接近 0。np.log2:底为 2。写成-p*np.log(p)/np.log(2)等价,更丑。- 前面的负号:熵公式自带。漏掉会得到负「容量」。
- 语法
1.0 - p:写成1-p也对;1.0强调浮点。
练习 binary_entropy(0.5) 应精确到
第2步:BSC 容量
python
def bsc_capacity(p):
return 1.0 - h2(p)一次使用信道最多送
第3步:mutual_info_bsc
BSC 上
python
def mutual_info_bsc(p_flip, p_x=0.5):
py = p_x * (1 - p_flip) + (1 - p_x) * p_flip
return h2(py) - h2(p_flip)p_x:,默认公平。 py:。公平输入时 py=0.5,与无关,于是 ,即容量。 - 偏置输入:
, 低于容量。右图绿线在 处应碰到虚线 。
没有对 px 只为把「容量是互信息的上包络上的一点」画出来。
第4步:作图与打印
python
ps = np.linspace(0.0, 1.0, 201)
print(f'公平比特 H2(0.5)={h2(0.5):.4f} bit')
print(f'BSC p=0.11 容量 C={bsc_capacity(0.11):.4f} bit/use')- 201 点:含端点。clip 后两端
接近 0,看起来像触轴。 :.4f:四位小数。应显示 1.0000。
python
axes[0].plot(ps, h2(ps), color='#2E86AB', lw=2)
axes[0].axvline(0.5, color='k', ls='--', alpha=0.3)竖线标峰值位置。左轴标签用 raw 字符串 r'$h_2(p)$ (bit)',否则 \b 会被当成转义。
python
axes[1].plot(ps, bsc_capacity(ps), color='#C1666B', lw=2, label='C=1-h2(p)')
px = np.linspace(0.01, 0.99, 40)
i_vals = [mutual_info_bsc(0.11, p) for p in px]
axes[1].plot(px, i_vals, color='#27AE60', lw=2, label='I(X;Y), p_flip=0.11')
axes[1].axhline(bsc_capacity(0.11), color='#27AE60', ls=':', alpha=0.7)- 横轴两用:红线的
是翻转概率 ;绿线的 是 。标题写成「p 或 P(X=1)」就是承认这点。不要把绿线理解成「容量随输入噪声变」。 - 绿线避开
和 : 0.01..0.99,极端偏置下也几乎确定, 。 - 列表推导:
p_flip固定,只扫 p_x。四十个点够光滑。
0.11 没有特殊公式含义,是一个让
关键概念速查表
| 概念 | 数学 / 直觉 | 代码 |
|---|---|---|
| 二元熵 | h2 | |
log2 | 单位 bit | np.log2 |
clip | 躲开 | eps=1e-12 |
| 向量化 | 整条 | h2(ps) |
| BSC 容量 | bsc_capacity | |
| 即 | h2(p_flip) | |
py = ... | ||
mutual_info_bsc | ||
| 公平输入 | 达到 | 默认 p_x=0.5 |
axvline / axhline | 标 | 左竖右横 |
源码位置
clone 后打开(相对仓库根目录):
docs/information/shannon/code/demo.py