1. 基本性质
1.1 考虑一个 D D D-ary的信源编码,它是由一个随机变量 X X X通过某种映射得到的集合 D ∗ D^{*} D∗,集合 D ∗ D^{*} D∗中包含的元素是码字,每个码字的符号是 D D D进制的。
例如,考虑一个
2
2
2-ary的信源编码,其对应的随机变量
X
X
X的字母表为
χ
=
{
A
,
B
,
C
,
D
}
\chi=\{A,B,C,D\}
χ={A,B,C,D}(先不关心每个字母对应的概率
p
i
(
x
)
p_i(x)
pi(x))。随机变量到码字的映射关系如下:
A
→
0
B
→
1
C
→
01
D
→
10.
\begin{aligned} &A\rightarrow 0\\ &B\rightarrow 1\\ &C\rightarrow 01\\ &D\rightarrow 10. \end{aligned}
A→0B→1C→01D→10.显然,这个信源编码的码字码长为
l
1
,
l
2
,
l
3
,
l
4
=
1
,
1
,
2
,
2
l_1,l_2,l_3,l_4=1,1,2,2
l1,l2,l3,l4=1,1,2,2。码字的每个符号是2进制的比特。
■
\blacksquare
■
1.2. 唯一可解信源编码。
考虑**1.**中的编码,会发现当接收到某些码字组合时,无法译出原随机变量
X
X
X的值。比如接收端接收到码字组合010时,可能是
A
B
A
ABA
ABA,也可能是
A
D
AD
AD。像这种存在无法唯一译码
X
X
X的情况的信源编码称为非唯一译码信源编码。反之,唯一译码(uniquely decodable)信源编码不存在上述情况。
例如,考虑一个
2
2
2-ary的信源编码,其对应的随机变量
X
X
X的字母表为
χ
=
{
A
,
B
,
C
,
D
}
\chi=\{A,B,C,D\}
χ={A,B,C,D}(先不关心每个字母对应的概率
p
i
(
x
)
p_i(x)
pi(x))。随机变量到码字的映射关系如下:
A
→
00
B
→
01
C
→
10
D
→
11.
\begin{aligned} &A\rightarrow 00\\ &B\rightarrow 01\\ &C\rightarrow 10\\ &D\rightarrow 11. \end{aligned}
A→00B→01C→10D→11.显然,这个信源编码的码字码长为
l
1
,
l
2
,
l
3
,
l
4
=
2
,
2
,
2
,
2
l_1,l_2,l_3,l_4=2,2,2,2
l1,l2,l3,l4=2,2,2,2。码字的每个符号是2进制的比特。它是一个唯一可译码的信源编码。
■
\blacksquare
■
1.3. Kraft不等式:
对于一个
D
D
D-ary的唯一可解信源,其码字长度为
l
i
l_i
li,则Kraft不等式为
∑
i
D
−
l
i
≤
1.
\sum_{i}D^{-l_i}\leq 1.
i∑D−li≤1.
证明:
考虑一个正整数
N
N
N,于是
(
∑
i
D
−
l
i
)
N
=
(
D
−
l
1
+
D
−
l
1
+
⋯
)
N
(\sum_{i}D^{-l_i})^N=(D^{-l_1}+D^{-l_1}+\cdots)^N
(i∑D−li)N=(D−l1+D−l1+⋯)N利用乘法分配律将括号展开,可以得到
(
∑
i
D
−
l
i
)
N
=
∑
i
=
1
N
l
m
a
x
A
i
D
−
i
.
(\sum_{i}D^{-l_i})^N=\sum^{Nl_{max}}_{i=1}A_iD^{-i}.
(i∑D−li)N=i=1∑NlmaxAiD−i.其中
l
m
a
x
=
m
a
x
{
l
i
}
l_{max}=max\{l_i\}
lmax=max{li},
A
i
A_i
Ai是展开括号后
D
−
i
D^{-i}
D−i的系数。
注意这里虽然求和项从 i = 1 i=1 i=1考虑到 N l m a x Nl_{max} Nlmax,但实际上有的值不一定能取到。例如对所有的 i i i都有 l i = 2 l_i=2 li=2的话,显然无法取到 D − 1 D^{-1} D−1。
再来看看展开括号这一步。对于某个特定的 D − i 0 D^{-i_0} D−i0,需要从 N N N个 ∑ i D − l i \sum_{i}D^{-l_i} ∑iD−li中分别挑选一个因式,使得挑选出来的 N N N个因式的乘积等于 D − i 0 D^{-i_0} D−i0。显然挑选方式很多,而 A i 0 A_{i_0} Ai0则等于所有挑选方法的总和。
从另一个角度看,上面展开括号的过程,类似于组成一个包含 N N N个码字的且长度为 i 0 i_0 i0码字序列。对于这个长度为 N N N个码字的码字序列,我们每次挑选一个码字,一共挑选 N N N次。这个长度为 N N N个码字的码字序列的组成方法有很多种,其总数等于 A i 0 A_{i_0} Ai0。此外,这 A i 0 A_{i_0} Ai0个码字序列都是不同的,这是因为这个信源是唯一可解的(假如有相同的就不是唯一可解了)。
另一个方面,如果我们一个符号一个符号地构造一个长度为
i
0
i_0
i0的码字,可以构造出
D
i
0
D^{i_0}
Di0个不同的码字。所以,我们有
A
i
0
≤
D
i
0
A_{i_0}\leq D^{i_0}
Ai0≤Di0。所以前面的式子满足
(
∑
i
D
−
l
i
)
N
=
∑
i
=
1
N
l
m
a
x
A
i
D
−
i
≤
N
l
m
a
x
.
(\sum_{i}D^{-l_i})^N=\sum^{Nl_{max}}_{i=1}A_iD^{-i}\leq Nl_{max}.
(i∑D−li)N=i=1∑NlmaxAiD−i≤Nlmax.
∑
i
D
l
i
≤
(
N
l
m
a
x
)
1
/
N
\sum_{i}D^{l_i}\leq (Nl_{max})^{1/N}
i∑Dli≤(Nlmax)1/N
我们取一个无穷大的
N
N
N,于是
lim
N
→
∞
≤
(
N
l
m
a
x
)
1
/
N
=
1.
\lim \limits_{N\rightarrow\infty} \leq (Nl_{max})^{1/N}=1.
N→∞lim≤(Nlmax)1/N=1.进一步有
∑
i
D
l
i
≤
1.
\sum_{i}D^{l_i}\leq 1.
i∑Dli≤1.
■
\blacksquare
■
1.4. Kraft不等式取等号的一个例子。
考虑一个唯一可解信源编码,其所有码字等长,均为
l
l
l。并且随机变量
X
X
X也是均匀分布的,其字母表大小为
∣
χ
∣
=
D
l
|\chi|=D^l
∣χ∣=Dl。显然有
∑
i
D
l
i
=
D
l
D
−
l
=
1
\sum_{i}D^{l_i}=D^{l}D^{-l}=1
∑iDli=DlD−l=1。
例如考虑
χ
=
{
A
,
B
,
C
,
D
}
\chi=\{A,B,C,D\}
χ={A,B,C,D},
p
(
X
=
A
)
=
p
(
X
=
B
)
=
p
X
=
c
)
=
p
(
X
=
D
)
=
1
/
4
p(X=A)=p(X=B)=pX=c)=p(X=D)=1/4
p(X=A)=p(X=B)=pX=c)=p(X=D)=1/4。随机变量到码字的映射为
A
→
00
B
→
01
C
→
10
D
→
11.
\begin{aligned} &A\rightarrow 00\\ &B\rightarrow 01\\ &C\rightarrow 10\\ &D\rightarrow 11. \end{aligned}
A→00B→01C→10D→11.显然,
D
=
2
D=2
D=2。Kraft不等式变为下列等式
2
−
2
+
2
−
2
+
2
−
2
+
2
−
2
=
1.
2^{-2}+2^{-2}+2^{-2}+2^{-2}=1.
2−2+2−2+2−2+2−2=1.
■
\blacksquare
■
1.5. 信源编码平均长度下界。
一个唯一可解的信源编码基于随机变量
X
X
X,对于
X
=
x
i
X=x_i
X=xi映射的码字长度记为
l
i
l_i
li,该信源编码的平均码字长度为
L
=
∑
i
p
i
(
x
)
l
i
L=\sum_{i}p_i(x)l_i
L=∑ipi(x)li。该信源编码的平均码字长度满足
L
≥
H
D
(
X
)
.
L\geq H_D(X).
L≥HD(X).当且仅当对所有
i
i
i均有
p
i
=
D
−
l
i
p_i=D^{-l_i}
pi=D−li时取等号。
证明:
L
−
H
D
(
X
)
=
∑
i
p
i
l
i
+
∑
i
p
i
log
D
p
i
=
∑
i
p
i
log
D
D
l
i
+
∑
i
p
i
log
D
p
i
=
∑
i
p
i
log
D
p
i
D
l
i
=
(
ln
D
)
−
1
∑
i
p
i
ln
p
i
D
−
l
i
≥
(
ln
D
)
−
1
∑
i
p
i
(
1
−
D
−
l
i
p
i
)
=
(
ln
D
)
−
1
∑
i
(
p
i
−
D
−
l
i
)
=
(
ln
D
)
−
1
(
1
−
∑
i
D
−
l
i
)
≥
0
\begin{aligned} &L-H_D(X)\\ &=\sum_ip_il_i+\sum_ip_i\log_D p_i\\ &=\sum_ip_i\log_D D^{l_i}+\sum_ip_i\log_D p_i\\ &=\sum_ip_i\log_D p_iD^{l_i}\\ &= (\ln D)^{-1} \sum_ip_i \ln \frac{p_i}{D^{-l_i}}\\ &\geq (\ln D)^{-1} \sum_ip_i (1-\frac{D^{-l_i}}{p_i})\\ &=(\ln D)^{-1} \sum_i(p_i -D^{-l_i})\\ &=(\ln D)^{-1} (1-\sum_{i}D^{-l_i})\\ &\geq 0 \end{aligned}
L−HD(X)=i∑pili+i∑pilogDpi=i∑pilogDDli+i∑pilogDpi=i∑pilogDpiDli=(lnD)−1i∑pilnD−lipi≥(lnD)−1i∑pi(1−piD−li)=(lnD)−1i∑(pi−D−li)=(lnD)−1(1−i∑D−li)≥0
上式第一个不等式关系用到了fundamental不等式,第二个不等式关系用到了Kraft不等式。
当第一个不等式取等号时,有
p
i
=
D
−
l
i
p_i=D^{-l_i}
pi=D−li。在这个情况下,Kraft不等式也取等号,所以整个不等式取等号。
■
\blacksquare
■
1.6. 因为唯一可解信源编码的平均长度有下界,所以定义redundancy为
L
−
H
D
(
X
)
.
L-H_D(X).
L−HD(X).
显然当
p
i
=
D
−
l
i
p_i=D^{-l_i}
pi=D−li时redundancy为0。
■
\blacksquare
■
1.7. Prefix码。
如果一个信源编码的任意一个码字都不是另外某个码字的前缀,则称该码字为prefix-free码,简称prefix码。
显然prefix码是唯一可解码。
■
\blacksquare
■
1.8.
存在一个信源编码是prefix码,当且仅当其满足Kraft不等式。
(显然,存在一个信源编码是唯一可解码,当且仅当其满足Kraft不等式)
证明:
prefix码就是唯一可解码,满足Kraft不等式。
我们需要证的是如果一个信源编码满足Kraft不等式,则存在一个将之构造成prefix码的构造方法。
记这个信源编码是 D D D进制的,并且有 l 1 ≤ l 2 ≤ ⋯ ≤ l m l_1\leq l_2\leq \cdots \leq l_m l1≤l2≤⋯≤lm。考虑一个 D D D-ary的满树,其深度为 l m l_m lm。显然,这个树的order为 l k l_k lk的叶子结点有 D l k D^{l_k} Dlk个,这意味着长度为 l k l_k lk的码字最多对应 D l k D^{l_k} Dlk个。
首先考虑第一个码字,长度为 l 1 l_1 l1。显然可以将这个码字对应到order为 l 1 l_1 l1的第一个叶子结点。下面利用归纳法。假设我们对于 l 1 , l 2 , ⋯ , l i l_1,l_2,\cdots,l_i l1,l2,⋯,li均可以按照从左往右的顺序将他们对应的码字对应到相应order的叶子结点,并且这些对应的叶子节点里面,不存在父子节点的关系,即这些码字是prefix码。下面证明仍然可以将长度为 l i + 1 l_{i+1} li+1的码字对应到一个还没有被用过的order为 l i + 1 l_{i+1} li+1的叶子结点,并且该节点不是已用过节点的子节点。
在这个深度为
l
m
l_m
lm的
D
D
D-ary满树中,order为
l
i
+
1
l_{i+1}
li+1的节点的总数为
D
l
i
+
1
D^{l_{i+1}}
Dli+1。在前面
l
1
,
⋯
,
l
i
l_1,\cdots,l_i
l1,⋯,li的使用过程中,使用了一些节点。对于
1
≤
k
≤
i
1\leq k\leq i
1≤k≤i,考虑其中某个order为
k
k
k的节点。这个节点会生成
D
l
i
+
1
−
l
k
D^{l_{i+1}-l_k}
Dli+1−lk个order为
l
i
+
1
l_{i+1}
li+1的子节点,这些子节点是不能再用于当前长度为
l
i
+
1
l_{i+1}
li+1的码字的(否则就违反了prefix码的定义)。因此,在前面的生成中,order为
l
i
+
1
l_{i+1}
li+1的叶子节点被使用了
D
l
i
+
1
−
l
1
+
D
l
i
+
1
−
l
2
+
⋯
+
D
l
i
+
1
−
l
i
D^{l_{i+1}-l_1}+D^{l_{i+1}-l_2}+\cdots+D^{l_{i+1}-l_i}
Dli+1−l1+Dli+1−l2+⋯+Dli+1−li个。那么剩下的order为
l
i
+
1
l_{i+1}
li+1的叶子节点数目为
D
l
i
+
1
−
(
D
l
i
+
1
−
l
1
+
D
l
i
+
1
−
l
2
+
⋯
+
D
l
i
+
1
−
l
i
)
=
D
l
i
+
1
(
1
−
∑
k
=
1
i
D
−
l
k
)
≥
D
l
i
+
1
∑
k
=
i
+
1
m
D
−
l
k
≥
D
l
i
+
1
D
−
l
i
+
1
=
1.
\begin{aligned} &D^{l_{i+1}}-(D^{l_{i+1}-l_1}+D^{l_{i+1}-l_2}+\cdots+D^{l_{i+1}-l_i})\\ =&D^{l_{i+1}}(1-\sum^{i}_{k=1}D^{-l_k})\\ \geq & D^{l_{i+1}}\sum^{m}_{k=i+1}D^{-l_k}\\ \geq & D^{l_{i+1}}D^{-l_{i+1}}\\ =&1. \end{aligned}
=≥≥=Dli+1−(Dli+1−l1+Dli+1−l2+⋯+Dli+1−li)Dli+1(1−k=1∑iD−lk)Dli+1k=i+1∑mD−lkDli+1D−li+11.以上证明过程用到了Kraft不等式。剩下的order为
l
i
+
1
l_{i+1}
li+1的叶子节点数目大于等于1,说明当前
i
i
i个码字以对应好了之后,总是能将第
i
+
1
i+1
i+1个码字对应好,并且这前
i
+
1
i+1
i+1个码字不违反prefix码的规则。以此类推,一直到
l
m
l_m
lm,构造成一个prefix码。
■
\blacksquare
■
前面关于平均长度下界的讨论给出,当对于所有
i
i
i都有
p
i
=
D
−
l
i
p_i=D^{-l_i}
pi=D−li时(
l
i
=
−
log
D
p
i
l_i=-\log_{D} p_i
li=−logDpi),平均长度取下界
H
D
(
X
)
H_D(X)
HD(X)。关于这个entropy bound,我们可以定义一个D-adic分部。
1.9. 如果一个概率分布
{
p
i
}
\{p_i\}
{pi}满足
p
i
=
D
−
t
i
p_i=D^{-t_i}
pi=D−ti,其中
t
i
t_i
ti是一个正整数我们称该概率分布满足
D
D
D-adic。当
D
=
2
D=2
D=2,称之为dyadic分布。
■
\blacksquare
■
以上
D
D
D-adic分布的定义是为了引出关于平均长度达到entropy bound 的情况。
1.10. 存在一个达到entropy bound的prefix code(即
L
=
H
D
(
X
)
L=H_D(X)
L=HD(X)),当且仅当概率分布是
D
D
D-adic的。
证明:
必要条件很好证明,如果存在一个达到entropy bound 的prefix code,显然有
p
i
=
D
−
l
i
p_i=D^{-l_i}
pi=D−li,令
t
i
=
l
I
t_i=l_I
ti=lI,即可证明该概率分布是
D
D
D-adic的。
现在证明充分条件。假设
X
X
X的概率分布是
D
D
D-adic的,则有
p
i
=
D
−
t
i
p_i=D^{-t_i}
pi=D−ti。那么
1
=
∑
i
p
i
=
∑
i
D
−
t
i
.
1=\sum_{i}p_i=\sum_{i}D^{-t_i}.
1=i∑pi=i∑D−ti.如果我们令
l
i
=
t
i
l_i=t_i
li=ti,显然entropy bound取到了等号。此外,Kraft不等式也满足,因此总是能构造出一个prefix code。综上,存在一个prefix code,并且该code达到entropy bound。
■
\blacksquare
■
2. Huffman码
2.1. Huffman code的构造。
考虑
D
D
D-ary的Huffman code,用
D
D
D-ary树来构造Huffman code。每次选取概率最小的两个节点进行合并,合并后的节点概率为这两个子节点的概率和。重复该合并过程直到仅剩下
D
D
D个节点以上过程得到一颗
D
D
D-ary的树,从根节点出发,每个叶子结点的深度就是对应的codeword的长度。
对于
D
=
2
D=2
D=2的随机变量,总是能直接构造出一个Huffman code。而对于
D
>
2
D>2
D>2的情况,我们每次合并
D
D
D个节点,再生成1个合并后的节点,因此每次操作相当于在总的节点数上减去
D
−
1
D-1
D−1。假设一共有
k
+
1
k+1
k+1次合并操作,于是经过前
k
k
k次合并,总的节点数减少了
k
(
D
−
1
)
k(D-1)
k(D−1)。此时,我们需要剩下的节点数为
D
D
D,因此,原始的总节点数需要为
D
+
k
(
D
−
1
)
D+k(D-1)
D+k(D−1)。
D
>
2
D>2
D>2时的Huffman编码与
D
=
2
D=2
D=2的编码本质区别在这儿,我们需要在原始总结点数不满足
D
+
k
(
D
−
1
)
D+k(D-1)
D+k(D−1)时,补一些概率为0的节点,来满足这个要求。
■
\blacksquare
■
在提出了Huffman码的构造方式之后,我们需要证明他是一种最优(optimal)编码。在给出证明之前,我们先给出两个关于最优码的引理。
2.2. 在一个最优码中,概率小的码字的长度大于等于概率大的码字长度。即,如果
p
i
<
p
j
p_i<p_j
pi<pj,则
l
i
≥
l
j
l_i\geq l_j
li≥lj。
证明:
反正,我们假设对于一个最优码,如果
p
i
<
p
j
p_i<p_j
pi<pj,有
l
i
<
l
j
l_i<l_j
li<lj。显然,我们可以交换这两个码字的码长,交换后的平均码长与交换前的平均码长的差为
(
p
i
l
j
+
p
j
l
i
)
−
(
p
i
l
i
+
p
j
l
j
)
=
(
p
i
−
p
j
)
(
l
j
−
l
i
)
<
0.
(p_il_j+p_jl_i)-(p_il_i+p_jl_j)=(p_i-p_j)(l_j-l_i)<0.
(pilj+pjli)−(pili+pjlj)=(pi−pj)(lj−li)<0.这说明交换长度后平均码长变小了,这说明交换前并不是最优码。因此我们的假设矛盾,必然有
l
i
≥
l
j
l_i\geq l_j
li≥lj。
■
\blacksquare
■
2.3. 存在一个最优码,他的概率最小的两个码字只有最后一个符号不同,前面的符号完全相同。用树的概念来讲就是,一定存在一个最优码,他的概率最小的两个码字对应的叶子结点是相邻的姊妹节点。
证明:
我们从构造性的角度来证明。假设概率最小的一个码字对应的叶子结点没有姊妹节点,那么该节点完全可以被其父节点替代,因为被父节点替代后,仍然是prefix code,且平均长度减小了。平均长度可以进一步减小,说明此码不是最优码,矛盾。
假设概率最小的一个码字对应的叶子结点有姊妹节点。假如这个姊妹节点不是概率第二小的码字对应的姊妹节点,而是概率为
p
i
p_i
pi的码字对应的叶子结点。我们记最小和第二小的概率为
p
m
i
n
1
p_{min1}
pmin1和
p
m
i
n
2
p_{min2}
pmin2。根据12.,显然有
l
m
i
n
1
≥
l
m
i
n
2
l_{min1}\geq l_{min2}
lmin1≥lmin2。又因为
p
i
>
p
m
i
n
2
p_i>p_{min2}
pi>pmin2,又有
l
i
≤
l
m
i
n
2
l_i\leq l_{min2}
li≤lmin2。因为
i
i
i和
m
i
n
1
min1
min1是姊妹节点,于是
l
i
=
l
m
i
n
1
l_i=l_{min1}
li=lmin1,那么我们有
l
m
i
n
1
≥
l
m
i
n
2
l
m
i
n
1
≤
l
m
i
n
2
\begin{aligned} & l_{min1}\geq l_{min2}\\ & l_{min1}\leq l_{min2} \end{aligned}
lmin1≥lmin2lmin1≤lmin2于是
l
m
i
n
1
=
l
m
i
n
2
=
l
i
l_{min1}=l_{min2}=l_i
lmin1=lmin2=li,意味着我们交换
i
i
i和
m
i
n
2
min2
min2的位置并不影响平均长度,即交换他们的位置仍然是一个最优码。
■
\blacksquare
■
2.4. 证明Huffman code是一个最优码。
考虑两个姊妹叶子节点,其对应的概率分别为
p
i
p_i
pi和
p
j
p_j
pj。假设我们将这两个叶子结点合并,只考虑其父节点,那这个新的树构成了一个新的码,新码贺旧码的平均长度分别记为
L
′
L^{'}
L′和
L
L
L,于是
L
−
L
′
=
(
p
i
+
p
j
)
l
−
(
p
i
+
p
j
)
(
l
−
1
)
=
p
i
+
p
j
.
L-L^{'}=(p_i+p_j)l-(p_i+p_j)(l-1)=p_i+p_j.
L−L′=(pi+pj)l−(pi+pj)(l−1)=pi+pj.这意味着如果旧码是最优码,新码也是最优码。很容易反证,如果新码不是最优码,那么找一个最优的新码,将概率为
p
i
+
p
j
p_i+p_j
pi+pj的这个父节点分裂成概率分别为
p
i
p_i
pi和
p
j
p_j
pj的两个叶子结点,则生成的旧码的平均码长要比我们的
L
L
L要小,与我们的旧码是最优码的假设矛盾。
实际上,有了以上的新旧码之间平均码长的关系,我们得到:如果旧码是一个最优码,当且仅当新码也是一个最优码。
有了这个规律,Huffman的证明就很简单,只要从根节点往下,一直遵循码的分裂,就可以证明到分裂后的码一定是最优码。
■
\blacksquare
■
2.5. Huffman code的上下界。
对于一个Huffman码,他的平均长度满足
H
D
(
X
)
≤
L
≤
H
D
(
X
)
+
1.
H_D(X)\leq L\leq H_D(X)+1.
HD(X)≤L≤HD(X)+1.
证明:
前面我们已经证明过Huffman码是最优码,这意味着无论我们构造一个什么码,他的平均长度都是大于等于Huffman码的平均长度的。于是,证明思路是,先证明我们可以构造一个prefix码,他的平均长度小于
H
D
(
X
)
+
1
H_D(X)+1
HD(X)+1。于是因为Huffman码是最优码,Huffman码的平均长度小于等于我们构造的这个码,因此也小于
H
D
(
X
)
+
1
H_D(X)+1
HD(X)+1。至于下界本来就是entropy bound,无需再证明。
下面这种构造的平均长度小于
H
D
(
X
)
+
1
H_D(X)+1
HD(X)+1的码也称为Shannon code。首先,我们之前的entropy bound告诉我们,当我们对所有
i
i
i都有
l
i
=
−
log
D
(
p
i
)
l_i=-\log_D(p_i)
li=−logD(pi)时,
L
=
H
D
(
X
)
L=H_D(X)
L=HD(X)。于是考虑将
l
i
l_i
li设置为下列整数
l
i
=
⌈
−
log
D
(
p
i
)
⌉
.
l_i=\lceil -\log_D(p_i) \rceil.
li=⌈−logD(pi)⌉.这样取整的方法导致了下列不等式
−
log
D
(
p
i
)
≤
l
i
<
−
log
D
(
p
i
)
+
1.
-\log_D(p_i)\leq l_i< -\log_D(p_i)+1.
−logD(pi)≤li<−logD(pi)+1.
左边的部分进行变换得到
p
i
≥
D
−
l
i
.
p_i\geq D^{-l_i}.
pi≥D−li.于是求和有
∑
i
D
−
l
i
≤
∑
i
p
i
=
1.
\sum_{i}D^{-l_i}\leq \sum_{i}p_i=1.
i∑D−li≤i∑pi=1.显然,这个不等式说明我们的构造方法满足Kraft不等式,因此我们一定能按照这样的长度分配构造出一个prefix码。
另一方面,我们利用右边部分,得到
L
=
∑
i
p
i
l
i
<
∑
i
(
−
p
i
log
D
(
p
i
)
+
1
)
=
H
D
(
X
)
+
1.
\begin{aligned} L&=\sum_ip_il_i\\ &<\sum_i(-p_i\log_D(p_i)+1)\\ &=H_D(X)+1. \end{aligned}
L=i∑pili<i∑(−pilogD(pi)+1)=HD(X)+1.至此,我们证明到Huffman码的上界是
H
D
(
X
)
+
1
H_D(X)+1
HD(X)+1。
实际上,Huffman的这个上界是紧的(tight),即这个上界在某些情况下是可以达到的(无限接近)。因此,下面我们给出一个例子,使得Huffman码的平均码长在这个例子中无限接近上界 H D ( X ) + 1 H_D(X)+1 HD(X)+1。
考虑一个
D
D
D-ary的编码,假设概率分布为
P
k
=
{
1
−
D
−
1
k
,
1
k
,
⋯
,
1
k
⏟
D
−
1
}
.
P_k=\{1-\frac{D-1}{k},\underbrace{\frac{1}{k},\cdots,\frac{1}{k}}_{D-1}\}.
Pk={1−kD−1,D−1
k1,⋯,k1}.显然对这个概率分布使用Huffman编码,一步就足够,所有码字长度为1,平均码长也为1。其熵计算为
H
D
(
X
)
=
−
∑
i
p
i
log
D
p
i
=
−
(
1
−
D
−
1
k
)
log
D
(
1
−
D
−
1
k
)
−
D
−
1
k
log
D
(
1
k
)
\begin{aligned} H_D(X)&=-\sum_ip_i\log_D p_i\\ &=-(1-\frac{D-1}{k})\log_D (1-\frac{D-1}{k})-\frac{D-1}{k}\log_D(\frac{1}{k}) \end{aligned}
HD(X)=−i∑pilogDpi=−(1−kD−1)logD(1−kD−1)−kD−1logD(k1)当
k
→
∞
k\rightarrow \infty
k→∞时,有
H
D
(
X
)
→
0
H_D(X)\rightarrow 0
HD(X)→0,于是当
k
→
∞
k\rightarrow \infty
k→∞时,有
L
→
H
D
(
X
)
+
1
L\rightarrow H_D(X)+1
L→HD(X)+1。
■
\blacksquare
■
2.6. 多个连续随机变量的Huffman编码。
前面的讨论可以看出,Huffman编码虽然是最优码,但还是不能保证编码后的平均码长一定取到下界entropy,事实上,如果我们对多个连续的随机变量一起使用H付付满编码,则能无限接近下界entropy。
考虑
n
n
n个独立同分布的随机变量
{
X
1
,
X
2
,
⋯
,
X
n
}
.
\{X_1,X_2,\cdots,X_n\}.
{X1,X2,⋯,Xn}.记他们均满足
X
X
X的分布。
将这
n
n
n个变量进行Huffman编码,得到的码字的平均长度满足
n
H
D
(
X
)
≤
L
≤
n
H
D
(
X
)
+
1.
nH_D(X)\leq L\leq nH_D(X)+1.
nHD(X)≤L≤nHD(X)+1.这里entropy前面取
n
n
n倍是因为熵的定义使得这
n
n
n个随机变量的熵可以累加。
这里的长度针对
n
n
n个随机变量,假如取平均长度,那么每个随机变量的平均码长为
L
/
n
L/n
L/n,满足
H
D
(
X
)
≤
L
/
n
≤
H
D
(
X
)
+
1
/
n
.
H_D(X)\leq L/n \leq H_D(X)+1/n.
HD(X)≤L/n≤HD(X)+1/n.当
n
→
∞
n\rightarrow \infty
n→∞时,上式右边趋近于
H
D
(
X
)
H_D(X)
HD(X).
■ \blacksquare ■
3. Shannon-Fano-Elias码
3.1. Shannon-Fano-Elias码的构造。
考虑概率分布
{
p
i
}
\{p_i\}
{pi},考虑其累积分布函数(cumulative distribution function)
F
i
F_i
Fi:
F
i
=
∑
j
=
1
i
p
j
.
F_i=\sum^{i}_{j=1}p_j.
Fi=j=1∑ipj.我们定义一个新的类似于累积分布函数的函数
F
ˉ
i
\bar{F}_i
Fˉi:
F
ˉ
i
=
∑
j
=
1
i
−
1
p
j
+
1
2
p
i
.
\bar{F}_i=\sum^{i-1}_{j=1}p_j+\frac{1}{2}p_i.
Fˉi=j=1∑i−1pj+21pi.注意以上的定义都基于概率分部
p
i
p_i
pi的下标已经排好序的基础上。
对于每个概率
p
i
p_i
pi,取码字长度为
l
i
=
⌈
−
log
D
(
p
i
)
⌉
+
1
l_i=\lceil -\log_D(p_i)\rceil+1
li=⌈−logD(pi)⌉+1。对
F
ˉ
i
\bar{F}_i
Fˉi的前
l
i
l_i
li位取四舍五入,得到长度为
l
i
l_i
li的码字。
■
\blacksquare
■
3.2. 构造举例。
假设概率分布为
[
p
1
,
p
2
,
p
3
,
p
4
]
=
[
1
4
,
1
2
,
1
8
,
1
8
]
.
[p_1,p_2,p_3,p_4]=[\frac{1}{4},\frac{1}{2},\frac{1}{8},\frac{1}{8}].
[p1,p2,p3,p4]=[41,21,81,81].我们得到修改的累积概率分布函数为
[
F
ˉ
1
,
F
ˉ
2
,
F
ˉ
3
,
F
ˉ
4
]
=
[
1
8
,
1
2
,
13
16
,
15
16
]
=
[
0.125
,
0.5
,
0.8125
,
0.9375
]
.
\begin{aligned} [\bar{F}_1,\bar{F}_2,\bar{F}_3,\bar{F}_4]&=[\frac{1}{8},\frac{1}{2},\frac{13}{16},\frac{15}{16}]\\ &=[0.125,0.5,0.8125,0.9375]. \end{aligned}
[Fˉ1,Fˉ2,Fˉ3,Fˉ4]=[81,21,1613,1615]=[0.125,0.5,0.8125,0.9375].采用二进制表示为
[
F
ˉ
1
,
F
ˉ
2
,
F
ˉ
3
,
F
ˉ
4
]
=
[
0.001
,
0.1
,
0.1101
,
0.1111
]
.
[\bar{F}_1,\bar{F}_2,\bar{F}_3,\bar{F}_4]=[0.001,0.1,0.1101,0.1111].
[Fˉ1,Fˉ2,Fˉ3,Fˉ4]=[0.001,0.1,0.1101,0.1111].
我们对这4个概率选取码字长度为
[
l
1
,
l
2
,
l
3
,
l
4
]
=
[
⌈
−
log
2
1
4
⌉
+
1
,
⌈
−
log
2
1
2
⌉
+
1
,
⌈
−
log
2
1
8
⌉
+
1
,
⌈
−
log
2
1
8
⌉
+
1
]
=
[
3
,
2
,
4
,
4
]
.
\begin{aligned} [l_1,l_2,l_3,l_4]&=[\lceil-\log_2 \frac{1}{4}\rceil +1,\lceil-\log_2 \frac{1}{2}\rceil +1,\lceil-\log_2 \frac{1}{8}\rceil +1,\lceil-\log_2 \frac{1}{8}\rceil +1]\\ &=[3,2,4,4]. \end{aligned}
[l1,l2,l3,l4]=[⌈−log241⌉+1,⌈−log221⌉+1,⌈−log281⌉+1,⌈−log281⌉+1]=[3,2,4,4].于是我们对
[
F
ˉ
1
,
F
ˉ
2
,
F
ˉ
3
,
F
ˉ
4
]
[\bar{F}_1,\bar{F}_2,\bar{F}_3,\bar{F}_4]
[Fˉ1,Fˉ2,Fˉ3,Fˉ4]的二进制分别取前
[
3
,
2
,
4
,
4
]
[3,2,4,4]
[3,2,4,4]位,得到编码后的码字
[
0.001
,
0.10
,
0.1101
,
0.1111
]
.
[0.001,0.10,0.1101,0.1111].
[0.001,0.10,0.1101,0.1111].
■
\blacksquare
■
3.3. 为什么Shannon-Fano-Elias码是一个唯一可解码?
根据前面所述编码方法,假如我们采用浮点数表示,则每个码字直接由对应的修改后的累计概率分布函数表示,因为累积概率分布函数是独一无二的,因此这样的浮点数可以唯一译码。下面需要证明的是,即使我们采用有限长度精度去表示这个浮点数,仍然是可以唯一译码的。
有限长度近似会导致数值相较于原浮点数增加或者减小。我们记取
l
i
l_i
li长度的
F
ˉ
i
\bar{F}_i
Fˉi为
F
ˉ
i
′
\bar{F}^{'}_i
Fˉi′。我们有
F
ˉ
i
−
F
ˉ
i
′
<
2
−
l
i
.
\bar{F}_i-\bar{F}^{'}_i<2^{-l_i}.
Fˉi−Fˉi′<2−li.因为
l
i
=
⌈
−
log
D
p
i
⌉
+
1
l_i=\lceil -\log_Dp_i \rceil +1
li=⌈−logDpi⌉+1,所以有
−
log
D
p
i
+
1
≤
l
i
≤
log
D
p
i
+
2.
-\log_Dp_i+1\leq l_i\leq \log_Dp_i+2.
−logDpi+1≤li≤logDpi+2.进一步
p
i
/
4
≤
2
−
l
i
≤
p
i
/
2.
p_i/4\leq 2^{-l_i}\leq p_i/2.
pi/4≤2−li≤pi/2.其中我们需要用到等式右边的上界,有
F
ˉ
i
−
F
ˉ
i
′
<
2
−
l
i
≤
p
i
/
2.
\bar{F}_i-\bar{F}^{'}_i< 2^{-l_i}\leq p_i/2.
Fˉi−Fˉi′<2−li≤pi/2.
可见,有限长度量化引入的误差小于等于 p i / 2 p_i/2 pi/2,这个误差如果使得量化后的 F ˉ i ′ \bar{F}^{'}_i Fˉi′的值变小到 F ˉ i − 1 ′ \bar{F}^{'}_{i-1} Fˉi−1′,则导致量化后的码不能唯一译码。比如 F ˉ i \bar{F}_i Fˉi经过量化后变小为 F ˉ i ′ = x \bar{F}^{'}_i=x Fˉi′=x, F ˉ i − 1 \bar{F}_{i-1} Fˉi−1经过量化后变小为 F ˉ i − 1 ′ = x \bar{F}^{'}_{i-1}=x Fˉi−1′=x,此时 F ˉ i ′ = F ˉ i − 1 ′ \bar{F}^{'}_i=\bar{F}^{'}_{i-1} Fˉi′=Fˉi−1′,两个码字用同一个值编码,不能唯一译码。
现在关注
F
ˉ
i
\bar{F}_{i}
Fˉi和
F
ˉ
i
−
1
\bar{F}_{i-1}
Fˉi−1之间的差。
F
ˉ
i
−
F
ˉ
i
−
1
=
p
i
/
2
+
p
i
−
1
/
2
\bar{F}_{i}-\bar{F}_{i-1}=p_{i}/2+p_{i-1}/2
Fˉi−Fˉi−1=pi/2+pi−1/2有了上面的式子,我们知道,量化最多将
F
ˉ
i
\bar{F}_i
Fˉi变小不到
2
−
l
i
2^{-l_i}
2−li,而
F
ˉ
i
\bar{F}_{i}
Fˉi和
F
ˉ
i
−
1
\bar{F}_{i-1}
Fˉi−1之间的差大于这个量,所以
F
ˉ
i
′
\bar{F}^{'}_i
Fˉi′不可能等于
F
ˉ
i
−
1
\bar{F}_{i-1}
Fˉi−1,自然更不可能等于
F
ˉ
i
−
1
′
\bar{F}^{'}_{i-1}
Fˉi−1′。
■
\blacksquare
■
3.4. Shannon-Fano-Elias码的平均码长上界为
L
≤
H
D
(
X
)
+
2.
L\leq H_D(X)+2.
L≤HD(X)+2.
证明:
前面Shannon码的构造是令
l
i
=
⌈
−
log
D
p
i
⌉
l_i=\lceil-\log_Dp_i\rceil
li=⌈−logDpi⌉,其上界是
H
D
(
X
)
+
1
H_D(X)+1
HD(X)+1。Shannon-Fano-Elias码的构造是令
l
i
=
⌈
−
log
D
p
i
⌉
+
1
l_i=\lceil-\log_Dp_i\rceil+1
li=⌈−logDpi⌉+1,其上界是
H
D
(
X
)
+
2
H_D(X)+2
HD(X)+2。这样很好记忆。证明如下。由
l
i
=
⌈
−
log
D
p
i
⌉
+
1
l_i=\lceil-\log_Dp_i\rceil+1
li=⌈−logDpi⌉+1得
l
i
≤
−
log
D
p
i
+
2
\begin{aligned} l_i\leq -\log_Dp_i+2 \end{aligned}
li≤−logDpi+2于是
L
=
∑
i
p
i
l
i
≤
∑
i
p
i
(
−
log
D
p
i
+
2
)
≤
H
D
(
X
)
+
2.
\begin{aligned} L&=\sum_{i}p_il_i\\ &\leq \sum_{i}p_i(-\log_Dp_i+2)\\ &\leq H_D(X)+2. \end{aligned}
L=i∑pili≤i∑pi(−logDpi+2)≤HD(X)+2.
■ \blacksquare ■
4. 其他信源编码方法
Arithmetic code、Lempel-Ziv code和run-length参考参考文献[2]。注意Lampel-Ziv code的理解。
5. prefix码的redundancy
5.1. 到达概率、分支概率、节点条件熵的定义。
对于一个
D
D
D-ary的prefix码,我们可以用一个
D
D
D-ary的树来表示,这个树的每个叶子结点对应一个码字,每个叶子结点的深度就是这个码字的长度。
到达概率定义为一个节点的概率,叶子结点的概率就是对应的随机变量
X
X
X的概率
p
i
p_i
pi。
分支概率定义为一个节点传向其父节点的概率。
显然一个节点
k
k
k,其到达概率
q
k
q_k
qk等于其所有子节点
j
j
j的分支概率的和:
q
k
=
∑
j
=
1
D
p
k
,
j
.
q_k=\sum^{D}_{j=1}p_{k,j}.
qk=j=1∑Dpk,j.
节点条件熵定义为
h
k
=
H
D
(
{
p
k
,
1
q
k
,
p
k
,
2
q
k
,
⋯
,
p
k
,
D
q
k
}
)
h_k=H_D(\{\frac{p_{k,1}}{q_k},\frac{p_{k,2}}{q_k},\cdots,\frac{p_{k,D}}{q_k}\})
hk=HD({qkpk,1,qkpk,2,⋯,qkpk,D})
■
\blacksquare
■
5.2. 一个prefix码的熵等于所有内部节点(非叶子结点)的条件熵的加权和。
H
D
(
X
)
=
∑
k
q
k
h
k
H_D(X)=\sum_{k}q_kh_k
HD(X)=k∑qkhk
证明:
对于每个节点,我们引入一个辅助变量
a
k
a_k
ak:
a
k
=
−
q
k
log
D
q
k
.
a_k=-q_k\log_D q_k.
ak=−qklogDqk.不难发现
q
k
h
k
=
−
q
k
∑
j
=
1
D
p
k
,
j
q
k
log
D
p
k
,
j
q
k
=
−
∑
j
=
1
D
p
k
,
j
log
D
p
k
,
j
q
k
=
∑
k
′
a
k
′
−
a
k
\begin{aligned} q_kh_k&=-q_k\sum^{D}_{j=1}\frac{p_{k,j}}{q_k}\log_D \frac{p_{k,j}}{q_k}\\ &=-\sum^{D}_{j=1}p_{k,j}\log_D \frac{p_{k,j}}{q_k}\\ &=\sum_{k^{'}}a_{k^{'}}-a_k \end{aligned}
qkhk=−qkj=1∑Dqkpk,jlogDqkpk,j=−j=1∑Dpk,jlogDqkpk,j=k′∑ak′−ak其中
a
k
′
a_{k^{'}}
ak′是节点
k
k
k的子节点的辅助变量。于是,每个内部节点的
q
k
h
k
q_kh_k
qkhk均可以表示成他的所有子节点的辅助变量的和减去自己的辅助变量。因此,对所有内部节点的
q
k
h
k
q_kh_k
qkhk求和得到
∑
k
q
k
h
k
=
H
D
(
X
)
−
a
0
,
\sum_{k}q_kh_k=H_D(X)-a_0,
k∑qkhk=HD(X)−a0,其中
a
0
a_0
a0是根节点的辅助变量,显根节点有
q
0
=
0
q_0=0
q0=0,因此
a
0
=
0
a_0=0
a0=0,于是我们得到
H
D
(
X
)
=
∑
k
q
k
h
k
.
H_D(X)=\sum_{k}q_kh_k.
HD(X)=k∑qkhk.
■
\blacksquare
■
上可以根据内部节点求和得到,平均长度也可以。
**5.3.**一个prefix码的平均长度满足
L
=
∑
k
q
k
.
L=\sum_k q_k.
L=k∑qk.
证明:
引入一个辅助变量
a
k
,
i
a_{k,i}
ak,i,如果内部节点
k
k
k是叶子结点
i
i
i的前驱,则
a
k
,
i
=
1
a_{k,i}=1
ak,i=1,否则
a
k
,
i
=
0
a_{k,i}=0
ak,i=0。于是
l
i
=
∑
k
a
k
,
i
.
l_i=\sum_k a_{k,i}.
li=k∑ak,i.进一步
L
=
∑
i
p
i
l
i
=
∑
i
p
i
∑
k
a
k
,
i
=
∑
k
∑
i
p
i
a
k
,
i
=
∑
k
q
k
.
\begin{aligned} L&=\sum_i p_il_i\\ &=\sum_i p_i \sum_k a_{k,i}\\ &=\sum_k \sum_i p_ia_{k,i}\\ &=\sum_k q_k. \end{aligned}
L=i∑pili=i∑pik∑ak,i=k∑i∑piak,i=k∑qk.
■
\blacksquare
■
5.4. 内部节点的redundancy的定义。对于内部节点
k
k
k,他的redundancy定义为
r
k
=
q
k
(
1
−
h
k
)
.
r_k=q_k(1-h_k).
rk=qk(1−hk).
前面的熵的上界告诉我们
h
k
≤
1
h_k\leq 1
hk≤1,当且仅当
q
k
,
1
=
q
k
,
2
=
⋯
=
q
k
,
D
=
1
/
D
q_{k,1}=q_{k,2}=\cdots=q_{k,D}=1/D
qk,1=qk,2=⋯=qk,D=1/D时取等号,此时
r
k
=
0
r_k=0
rk=0。换句话说,只有当当前节点是balanced的时候,他的redundancy为0。
■
\blacksquare
■
5.5. prefix码的总redundancy可以表示成所有内部节点的redundancy之和:
R
=
∑
k
r
k
.
R=\sum_k r_k.
R=k∑rk.
证明:
R
=
L
−
H
D
(
X
)
=
∑
k
q
k
−
∑
k
q
k
h
k
=
∑
k
q
k
(
1
−
h
k
)
=
∑
k
r
k
.
\begin{aligned} R&=L-H_D(X)\\ &=\sum_k q_k-\sum_kq_kh_k\\ &=\sum_kq_k(1-h_k)\\ &=\sum_kr_k. \end{aligned}
R=L−HD(X)=k∑qk−k∑qkhk=k∑qk(1−hk)=k∑rk.
■
\blacksquare
■
参考文献
[1] Raymond W. Yeung,Information Theory and Network Coding,2008。
[2] Ranjan Bose,Information Theory, Coding and Cryptography,2008。