1. 关于数据压缩 0x1:什么是数据压缩?为什么要进行数据压缩? 从信息论的角度来看数据压缩,本质上就是通过寻找一种编码方案,在不损失或者尽量少损失原始信源信号的前提下,将原始信源信号映射到另一个D元码字空间上。 在机器学习中,我们经常讨论到的”模型训练“,其本质上就是在寻找一个”信源映射函数“,例如线性回归的回归参数,就是一种信源映射函数,可以将输入空间X,一一映射到Y空间,所以,得到了一组模型参数,本质上就是得到了一个信源映射函数,此后,就可以由模型参数代替原始的样本数据。 回到信息论数据压缩的话题,信息论数据压缩讨论和定义的是:在信源映射函数中,应该将哪些码字分配给哪些信源,怎么分配是最优的,即节省传输开销的。 本文通过讨论信息压缩的基本临界值(即最短码字长度),从另一个方面来看熵的定义和合理性。通过对数据源中最频繁出现的结果分配较短的描述,而对不经常出现的结果分配较长的描述,可达到压缩数据的目的。 0x2:关于压缩编码的几个例子 1. 信源编码的定义 数据压缩的的本质是找到一种高效的压缩编码方案,这小节我们先定义一下信源编码的一些形式化定义与记号,然后一起来看几个关于压缩编码的例子。 关于随机变量X的信源编码C是从X的取值空间X到D*的一个映射,其中D*表示D元字母表D上有限长度的字符串所构成的集合,用C(x)表示x的码字并用 l(x) 表示C(x)的长度。 设随机变量X的概率密度函数为p(x),定义信源编码C(x)的期望长度L(C)(expected length)为 ,其中l(x)表示对应于x的码字的长度 另外,不是一般性,可以假定D元字母表为D={0,1,....,D-1} 2. 等比例码字编码举例 所谓等比码字编码,就是指对信源里的所有信号都采用相同长度的码字,例如: C(红)=00,C(蓝)=11,是X={红,蓝}关于字母表D={0,1}的一个信源编码。 3. 对非等概随机变量进行非等比例编码举例 设随机变量X的分布及其码字分配如下: 可知X的熵H(X) = 1/2 * 1 + 1/4 * 2 + 1/8 * 3 + 1/8 * 3 = 1.75比特。而期望长度L(C) = El(X) = 1.75比特。 这里,我们看到一个期望长度正好等于其熵值的编码,仔细对比会发现在该编码方案下,熵的计算公式和期望长度的计算公式是完全相同的。 另外,注意到这个编码方案是可逆的,任何一个比特序列都可以唯一地解码成关于X中的字符序列,例如,比特串010111100110解码后为134213。 4. 对等概随机变量机械能给你非等比例编码举例 继续沿着上面那个例子的讨论,假设这次随机变量是一个均匀分布,但这次不像第一个例子采用等比例编码,而是采用变长编码,如下: 正如前面的例子一样,该编码也是唯一可译的,但这种的编码方案的熵为log3 = 1.58比特,而编码的期望长度为1.66比特,即此时。 为什么会这样呢?发生了什么事呢? 简单的解释就是:这个例子中的编码方案不是最优的,之所以期望长度比熵要大,是因为使用了多余的码字来对信源信号进行编码。 5. 莫尔斯码 莫尔斯码是关于英文字母表的一个相当有效的编码方案。 使用四个字符的字母表:点、划、字母间隔、单词间隔 使用短序列表示频繁出现的字母(例如,用单个点表示E),而用长序列表示不经常出现的字母(例如,Q表示为”划,划,点,划”) 需要注意的是,对于四字符的字母表来说,莫斯编码并非最佳表示,因为依此方式,许多可能的码字未被使用(码字空间没有被充分利用,这和前一个例子犯了同样的错误)。 香农在1948年的开创性论文中解决了对英文字母最佳编码方案的搜索问题,该问题也与磁记录的编码问题有联系,其中不允许出现一些长串的0。 # relative links about this topic http://xueshu.baidu.com/usercenter/paper/show?paperid=2c9070b5bd7f5b00847480d94c9cfd7a&site=xueshu_se http://xueshu.baidu.com/usercenter/paper/show?paperid=cac5df4cbee54e31c90ef560bf806712&site=xueshu_se Relevant Link:  《信息论基础》阮吉寿著 - 第五章   2. 信源编码 这一节开始我们讨论信源编码,逐步对编码的条件进行定义,设xn表示信源序列(x1,x2,....,xn)。C(x1)C(x2)....C(xn)表示相应码字的串联,我们称之为编码C的扩展(extension) 0x1:非奇异编码 如果编码将X的取值空间中的每个元素映射为D*中不同的字符串,即 则称这个编码是非奇异的(nonsigular)。 0x2:唯一可译码 如果一个编码的扩展编码是非奇异的,也即整个序列可以一一对应一个信源序列,则称该编码是唯一可译的(uniquely decodable)。 唯一可译码的任一编码字符串只来源于唯一可能的信源字符串。尽管如此,仍然可能需要通观整个编码字符串,才能最终确定信源字符串。有时甚至是第一个码字也同样。 可以看到,非奇异性虽然保证表示X的每个码字值明确性。但是,如果我们需要发送一段序列,就需要在两个码字之间添加一个特殊符号(例如“逗号”),才可以确保其可译性。但如此使用特殊的分割符号会降低编码的效率。 一个很自然的想法是,如果能利用码的自我间断性或即时码的思想,就可以同时兼顾效率与一一对应精确性这两个目的。这就是接下要来讨论的前缀码。 0x3:前缀码(prefix code) 若码中无任何码字是其他码字的前缀,则称该编码为前缀码(prefix code)或即时码(instantaneous code)或自我间断码。 在前缀码中,每一个码字何时结束可以瞬时判断出来,因而无需参考后面的码字就可以译出即时码,每一次bit进行一次码字表查表,当命中某个码字序列时立即停止,因为不可能存在该码字同时由是其他码字的前缀,因此可以100%断定该序列为某个确定的码字。 因此,对即时码来讲,一旦分配给字符xi的码字结束,无需再等待后面的码字,就可以立即译出字符xi。 例如前面例子中的编码方案 这就是一个前缀码,如果得到一个二元串,010111100110,我们可将其译码为,0,10,111,110,10。 0x4:信源编码各种编码之间的关系 关于信源编码的几种编码方式之间的关系图如下: 用一个具体的例子来说明各个信源编码方案的区别,下表分别列举了在码字分配在各个编码方案中的情况。 对于非奇异码,码串010可能对应3个信源序列:2、14、31,因此,该编码不是唯一可译的。 唯一可译码也不一定是要无前缀的。关于码的唯一可译性,Sardinas和Patterson已经设计出一个有效检验的方法,其主要步骤是形成所有码字的可能后缀集,同时系统地删除它们 表中最后一个是即时码,所有码字中无一码字是其他任一码字的前缀 Relevant Link:  《信息论基础》阮吉寿著 - 第五章    3. Kraft不等式 为了描述一个给定的信源,我们的目标是构造期望长度最小的即时码。接下来最大的问题是,显然不可能将短的码字分配给所有的信源字符而扔保持是无前缀的,那应该是按照什么约束条件来寻找所有可能的码字分配方案呢,因为可能满足期望长度最小的码字分配方案并不唯一。Kraft不等式定义了这个约束条件。 0x1:Kraft不等式形式化定义 即时码的一组可能的码字长度满足如下不等式,即kraft不等式。 对于D元字母表上的即时码(前缀码),码字长度必定满足不等式 反之,若给定满足以上不等式的一组码字长度,则存在一个相应的即时码,其码字长度就是给定的长度。 考虑一个每一节点均含D个子节点的D叉树, 树枝代表码字的一个字符,例如,源于根节点的D条树枝代表着码字的第一个字符的D个可能值 树叶代表每个码字,始于根节点的路径可描绘出码字中所有字符 从上图中可以看出,码字的前缀条件表明树中无一码字是其他任一码字的祖先。因而,在这样的编码树中,每一码字都去除了它的可能成为码字的所有后代。从建树过程上看,有点启发式优化的影子,后面我们会讨论到,我们最熟悉的决策树的建树过程,本质上就是一个前缀码的寻优与构建过程。 令为码字集中最长码字长度,考虑在树中层的所有节点,可知其中有些是码字,有些是码字的后代,而另外的节点既不是码字,也不是码字的后代。 在树中层的码字拥有层中的个后代,所有这样的后代集不相交。而且,这些集合中的总节点数必定小于或等于。因此,对所有码字求和,则可得: 或,这就是Kraft不等式。 反之,若给定任意一组满足Kraft不等式的码字长度,总可以构造出上图结构类似的编码树。将第一个深度为的节点(依字典序)标位码字1,同时除去树中属于它的所有后代。然后在剩余的节点中找出第一个深度为的节点,将其标为码字2,同时除去树中所有属于它的所有后代,等等,依次方法继续下去,即可构造出一个码字长度为的前缀码。 Relevant Link:  《信息论基础》阮吉寿著 - 第五章   4. 最优码 0x1:最优码期望长度条件 Kraft不等式解决的是,定义出了前缀码必须满足的约束条件问题,满足前缀条件的任何一个码字集均满足Kraft不等式。 接下来考虑求解前缀码的最小期望长度问题,该问题等价于求解满足Kraft不等式的长度集合,使得它的期望长度不超过其他任何前缀码的期望长度。这是一个标准的最优化问题,在所有整数上,最小化 其约束条件为 利用拉格朗日(Lagrange)乘子法,将带约束的最小化问题转化为下式的最小化问题: 关于求微分,可得 令偏导数为0,得: 将此式代入约束条件中以求得合适的λ,可得,因而,即最优码长为。 若可以取码字长度为非整数,则此时的期望码字长度为: 随机变量X的任一D元即时码的期望长度必定大于或等于熵,即 ,当且仅当(即对所有的i,-logDpi为整数),等号成立。 对于某个n,如果概率分布的每一个概率值均等于D-n,则称这个概率分布是D进制的(D-adic),因此,当且仅当X的分布是D进制的,上述定理等号成立。 0x2:最优码长的界 1. 最优码长界形式化定义 上一小节中,我们讨论了最优码长期望,即最小化,其约束条件为整数且。我们已经证明若码长选取 ,有L = H。但是由于未必为整数,所以该式只是一个理论值。 为了能使该式具有实际意义,通过取整运算,就可以给出整数码字长度的分配 ,其中表示向上取整。这组整数满足kraft不等式,因为 如此选取的码字长度满足 在上式中乘pi,并且关于 i 求和,可得: 上面讨论可总结为如下定理: 设是关于信源分布p和一个D元字母表的一组最优码长,L*为最优码的相应期望长度(),则 上式表明,实际最优码长的期望比熵大,但不会超出1比特的附加位。这是由于最优码长的理论值并非总是整数造成的。 2. 多字符分组编码的最优码期望长度界 前面介绍了对码字的串联(编码的扩展),即通过对多字符进行分组可以减小信源序列的熵,进而减少最优码期望长度。 考虑一个序列发送系统,其中的序列都是来自于X的n个字符,假定序列中的字符是i.i.d.,服从p(x),此时可将这n个字符看成是字母表中的超字符。 定义Ln为每个输入字符期望码字长度,设是与(x1,x2,....,xn)相应的二进制码字长度,则 将上一小节推导的界应用于此时的编码,有 由于X1,X2,...,Xn是i.i.d.,因此 带入上面不等式,同时两边同除以n,得: 因此,通过使用足够大的分组长度,可以获得一个编码,可以使其每字符期望码长任意地接近熵。 即使随机过程不是i.i.d.的,对来自该随机过程的字符序列也可以作同样的讨论,此时仍然有: 将上式两边同除以n,且定义Ln为没字符期望描述长度,可得: 如果随机过程是平稳的,则,当n->∞时,每字符期望描述长度趋于该随机过程熵率H(X)。 该定理从另一方面说明了熵率概念的必要性,熵率是最简洁描述随机过程所需的每字符期望比特数。 0x3:非真实分布的期望码长和最优码长之间的距离度量 这里先解释一下什么是真实分布与非真实分布。 真实分布:目标过程的真实概率分布,是永恒的真值,但也是我们不可知的,但可以通过训练样本无限逼近(大数定律)。 非真实分布:基于通过对真实过程的观测得到了组观测结果序列,并基于该观测结果生成对应的概率估计分布,这样得到的概率估计分布可能和真实分布之间存在一定的差距。 举一个具体的例子,我们基于有标注训练样本训练一个线性回归模型,通过MSE得到了一个最优拟合模型,但是该线性模型并没有完全拟合,依然存在一个大于0的损失函数值。这个时候,我们就称我们得到的线性回归模型代表了一个非真实分布,而原始训练样本代表了真实分布(基于大数定律)。 理解了基本概念之后,现在让我们抛开具体的算法形式场景,回到抽象思维领域,思考一个问题。当面对的对象是非真实分布时,用于描述这个非真实分布的期望描述长度会变得怎样。 假定真实分布的概率密度函数是p(x),而非真实分布的概率密度函数是q(x),相应的码长为 下面将证明,由于不正确的分布所引起的期望描述长度的增加值等于相对熵D(p || q)。于是,D(p || q)可以具体解释为由于使用不正确的信息而引起的描述性复杂度的增加量。 将非真实概率分布的码字编码定义为偏码(wrong word),码字长度分配为 关于p(x)的期望码长满足如下公式: 证明过程如下: 于是,若真实分布为p(x),而编码使用的是非真实分布q(x),则会导致期望描述长度增加D(p || q)。 这个定理也从码长期望的角度解释了线性回归模型拟合误差以及拟合模型和真实分布之间相关系数的关系等话题,关于这部分的讨论,可以参阅另一篇文章。 0x4:最优码搜索程序 前面两小节讨论的最优码期望长度条件的证明过程,其实也间接提供了寻求最优码的理论步骤: 找到与X的分布最接近的D进制分布(在相对熵意义下),由该D进制分布可提供一组码字长度。 选取首次达到的节点(按照Kraft不等式证明过程的方法),构造出该编码 逐次进行,最终得到一个关于X的最优码 上述是一个理论上指导方法,要具体实现这个程序并不容易,因为要搜素出与X的分布最接近的D进制分布并不容易。 在后面的讨论中,我们会进入到具体算法细节层面的讨论,分别介绍寻求最优码的次优程序,香农-费诺编码,以及赫夫曼编码。 Relevant Link:  《信息论基础》阮吉寿著 - 第五章    5. 赫夫曼码 关于给定分布构造最优(最短期望长度)前缀码,赫夫曼给出了一个简单的算法。我们将证明,对于相同信源字母表的任意其他编码,不可能比赫夫曼法所构造出的编码具有更小的期望长度。 在开始具体的讨论前,我们先通过对20问题游戏的讨论,来切入对赫夫曼码的讨论。  0x1:赫夫曼码和20问题游戏的等价性讨论 1. 20问题游戏说明 假定要设计一套最有效的”是/否问答系统“,以便从目标群中识别出其中一个目标。假设目标的概率分布已知,那么是否能找到最有效的问题序列,保证该序列能够将一个目标从一群可能的目标中唯一地区分出来。 这类游戏在日常生活中非常常见,它就是我们熟悉的决策树,通过不断进行二元提问,将输入逐步分类,最终落到某个具体的类型桶中。 2. 20问题抽象 首先,我们要找的目标可能不止一种人,我们将其设为X={X1,X2,....,Xn},Xi代表了我们要找的某一种目标人群。设计整套提问序列,本质上就是寻找一个目标编码方案,将X中所有Xi都映射为一个对应的码字。 在提问过程中,当前所要提出的问题仅依赖于前面提出的若干问题的答案而定,由于答案序列唯一确定该目标,因而所有目标对应着不同的答案序列, 并且,如果用0表示”是“,用1表示”否“,那么可获得目标集的一个二元码。该编码的期望长度即是提问方案所需的期望问题数。 反之,若给定目标集的一个二元编码,可以求得与该编码相对应的问题序列,使其期望问题数等于编码的期望码长,如果提问方案中的第一个问题是:”目标的对应码字的第一位是1吗?“ 考虑下面这个虚构的例子: 一个随机变量X,其取值空间为X={1,2,3,4,5},对应的概率分别是{0.25,0.25,0.2,0.15,0.15}。 为获得X的一个最优二元码,需要将最长的码字分配给字符4和5。一般地,我们可以将该编码构造称为其中的两个最长码字仅差最后一位有所不同。 对于这样的编码,可将字符4和5组合成单个信源字符,其相应的概率值为0.3。按此思路继续下去,将两个最小概率的字符组合成一个字符,直至仅剩下一个字符为止,然后对字符进行码字分配,最终我们得到如下表格: 对于上面的信源编码方案,对应的问题序列可以反推出来。 第一个问题应该是”X等于2或3吗?“:因为只有2或3的码字第一位是1,对此问题的回答可以确定码的第一位 假定第一个问题的回答是”对“,那么下一个问题应该是”X=3吗?“:这可以确定码的第二位  同时要注意,对于第二个问题,也可以是”X等于1或3吗?“,它独立于第一个问题:由此可确定码的第二位 在最优的提问方案中,期望问题数EQ满足: ,这符合最优码期望长度界定理。 3. 加权码字的赫夫曼编码 最小化的赫夫曼算法其实对任意一组都成立的,而无需考虑的大小。此时,赫夫曼编码算法最小化的是码长加权和,而非平均码长。 4. 赫夫曼编码与”切片“问题(字母码) 我们已经说明了信源编码与20问题游戏的等价性。对于给定的随机变量,最优问题序列对应于一个最优的信源编码。然而,由赫夫曼编码确定的最优问题方案要求对于对于任一问题,存在某个集合,使该问题具有形式”X∈A吗?“。 接下来考虑一个带约束的20问题游戏,具体说就是,假定X={1,2,....,m}中的元素降序排列为,并且要求所有的提问只能是唯一形式”X>a吗?“,其中a是某个数。 由赫夫曼算法所构造出的赫夫曼编码可以不与切片集(形如{x:x<a}的集合)相对应。如果选取由赫夫曼编码所得到的码字长度(),并且用它们来分配字符到编码树上,使得每个码长对应着编码树的一个层,在对应的层上,将首达节点处标识上对应的字符,由此方法可构造出另一个最优码。 然而与赫夫曼编码不同的是,该编码是一个切片码(slice code),这是因为与此最优码等价的最优问题方案中的每个问题(对应该码的一位)将该树分裂成一系列 {x:x>a} 与 {x:x<a} 的集合形式。 上面说的有些抽象,还是继续用前面的一个例子来说明一下,对随机变量的赫夫曼编码方案如下 可知由赫夫曼编码程序所构造出的赫夫曼码并不是切片码,但若使用由赫夫曼编码程序获得的码字长度,即{2,2,2,3,3},同时将相应码字分配给编码树中相应层的首达节点,就可得到随机变量的如下一组新的编码: 1 -> 00 2 -> 01 3 -> 10 4 -> 110 5 -> 111 可以证明上述编码是个切片码,由于码字是按字母序排列的,故我们将这类片段码称作字母码(alphabetic code)。 0x2:赫夫曼码的最优性讨论 1. 赫夫曼码最优性所具有的性质 利用归纳法可以证明二元赫夫曼码是最优的,为了证明赫夫曼码的最优性,首先来证明特定最优码所具有的性质。 假定随机变量的概率分布依次排列为,当达到最小时,编码是最优的。 对任意一个分布,必然存在满足如下性质的一个最优即时码: 其长度序列与按概率分布列排列的次序相反,即,若,则。 最长的两个码字具有相同长度。 最长的两个码字仅在最后一位上有所差别,且对应于两个最小可能发生的字符。 用归谬法来证明二元赫夫曼码的最优性,证明需要的步骤是通过一些列的交换、修剪、重排过程。考虑一个最优码Cm,以及一个C'm(通过某种交换、修剪、重排)。 若,则。此时通过交换码字即可得此结论。 设C'm为将Cm中的码字 j 和 k 交换所得到的编码,则   因为,且由于Cm是最优的,可得,故必有。从而最优码本身Cm必定满足性质1。 最长的两个码字具有相同的长度  通过修建码字获得该结论,如果两个最长码字长度不同,那么将较长码字的最后一位删除,它仍可保持前缀形式,但此时具有更短的期望码字长。因此,最长的两个码字长度必定相等。 下图展示了如何从任一编码方案,通过交换、修剪、重排过程。考虑一个最优码Cm。   假定,a)给出可能的即时码,通过修剪无兄弟的分枝,可将原码改进为b),将编码树重排成如c)所示,使得从顶部到底部按照码字长度的递增排列。最后,交换概率匹配使得编码树的期望深度得到改进,如d)所示。 因此,任何一个最优码都可以通过重排和交换最终具有如d)所示的典则码形式。 至此,我已经证明:若,则存在长度列为的一个最优码,且码字和仅最后一位有所区别。 综上,我们可以到赫夫曼码最优定理,即,如果C*为赫夫曼码而C'是其他码,则 L(C*) <= L(C')。 针对二元字母表的情况,可以推广到D元字母表的情形,赫夫曼码算法的最优性也是成立的。 2. 最优赫夫曼码的迭代式构建过程 上一小节我们讨论了赫夫曼码的性质引理,满足引理的最优码是存在的,我们称这样的码为典则码(canonical code)。对于m元字母表上的概率密度函数,我们定义其m-1元字母表上的赫夫曼合并(huffman reduction)为。用表示p'的最优码,而用表示p的典则最优码。 上图中,令,a)给出一个典则最优码。合并两个最小概率得到b)中的编码。按照降序方式重排概率值,得到c)所示的m-1个字符上的典则码。 一般地,如果从m-1个字符熵的概率分布p'的一个最优码出发,通过扩展对应于的码字,就可以获得m个字符熵的编码,且得到的新码是最优的。 值得注意的是,在每一步合并两个最小可能发生的字符时,赫夫曼编码是一个”贪婪“算法,前面的证明表明这样的局部最优性可以保证最终编码的全局最优性。 Relevant Link:  《信息论基础》阮吉寿著 - 第五章   6. 赫夫曼码与香农码对比异同 0x1:赫夫曼码和香农码在单个码字长度上的长度对比 对于某个特定的字符,使用码长为的编码(称为香农码)可能比最优码更差。 例如,考虑一个由两个字符组成的信源,其中一个发生的概率为0.9999,而另一个为0.0001。若使用码字长度,则意味着他们的码长分别为1比特和14比特。然而,用赫夫曼码程序可以很容易得出,这两个字符的最优码长都是1比特。 因而,在香浓编码中,不经常发生的字符的码字长度一般比最优码的码字更长。 但是最优码的码字长度总是小于等于吗?答案是否定的,考虑下面这个例子: 设随机变量X的分布为 赫夫曼编码程序产生的码字长度为(2,2,2,2)或(1,2,3,4),这两个码的期望码字长相同。对第二个编码,其第三个字母的长尾3,比大。 虽然总总体期望平均上,香农码和赫夫曼码都是符合上下界定理的,即。但是在单个码字上,因为概率分布不均的缘故,香农码中某个字符的码字长度可能小于最优(赫夫曼)编码中的相应字符的码字长。 同时这里例子也说明了,最优码的码字长集合并不唯一,可能存在1个以上的具有相同期望值的码长集。 0x2:香农码的竞争最优性 我们已经证明了赫夫曼码是具有最小期望长度的最优码。但是,对于某个特定的信源序列来说,赫夫曼码的性能如何呢?对于所有序列来说,赫夫曼码都优于其他编码吗? 显然不是的,因为存在某些编码,它们分配较短的码字给不经常发生的信源字符,对于这些信源字符,这样的编码比赫夫曼码更好。之所以出现这个现象是因为,期望长度最优并不一定代表局部处处最优,这进一步导致期望长度最优并不一定是全局竞争性最强,因为竞争性是所有局部博弈的综合结果。 在正式叙述竞争最优性问题之前,我们通过一个具体的例子来引入话题,以便更好地理解这其中的博弈思维。 1. 从一个即时码效率竞争零和游戏说起 有两个参与一个零和博弈游戏,给定给一个属于特定概率分布的信源字符序列,要求他们各自设计一个即时码。比赛的规则是:对此信源字符,如果参赛者A设计的码字比参赛者B设计的短或长,则A相应的得分是1或-1,若平手,则A得分为0。 从博弈论的角度来看,这是一个田忌赛马问题,即对于A来说,他可能从整体期望上弱于B,但A可以充分利用单轮博弈这个优势,在尽量多的轮次中,分配稍微强于B的码字上场进行博弈,而在余下的少量轮次中,用大幅度弱于B的码字去惨输,这样,从整体上看,比赛的最终结果还是A胜。这种策略的思想是:集中优势力量赢得尽量多的局部战役,而在不重要的少量局部战役中几乎不投或者投入很少的资源,从而博取全局的总体胜势。 2. 香农码单个码字长度的界 香农码每个码字长度,这里设表示其他唯一可译码的相应码字长度,则有: 例如,比短5比特或更多的概率不超过1/16。 证明过程如下: 上面证明过程的最后一步,由Kraft不等式得到。 因此,在大多数情况下,没有其他码能够比香农码更为优越。但是上述过程实际上是证明了下界,事件成立的概率>= 1/2只是一个下界证明,即证明了最坏情况下,香农码也不会坏到哪里去。 但这是不够的,在博弈论架构中,人们通常希望证明,下面我们来证明这个更为严格的判断准则下,香农码也是最优的。 如果概率密度函数p(x)是二进制的,则均为整数。有如下定理: 对二进制概率密度函数p(x),设为信源的二元香农码的码字长度,为信源任何其他唯一可译二元码的码字长度,则: ,当且仅当对所有的x,都有时,等号成立。于是,码长分配是唯一竞争最优的。 证明过程如下: 定义阶跃函数sgn(t)如下: 引入一个新的函数,如下图所示: 由上图可知,,对于,即仅对于所有整数成立,但对所有实值不成立。此时可以得到: 其中 (a)是由sgn(x)的上界得到 (b)是由于满足Kraft不等式得到 由此,我们证明了在某类判别准则下,香农码是竞争最优的。 Relevant Link:  《信息论基础》阮吉寿著 - 第五章    7. Shannon-Fano-Elias编码 0x1:基于累计概率分布的编码映射方案形式化定义 在本节中,我们介绍一个简单的唯一可译码狗仔程序,基本思路是利用累计分布函数来分配码字。 不失一般性,假定取,假设对所有的x,有p(x)>0,定义累计分布函数F(x)为: 考虑修正的累计分布函数: 其函数图如下图所示: 其中,表示小于x的所有字符的概率和加上字符x概率的一半所得到的值。由于随机变量是离散的(信源是离散的),故累计分布函数所含的阶梯高度为p(x),函数的值正好是与x对应的那个阶梯的中点。 由于所有的概率值是正的,若,则。 若已知,则可以确定x。 因此,只需通过观察累计分布函数的图形,就可以找到相应的x,故可以作为x的编码(本质上就是一种编码映射函数)。这符合编码的奇异性和唯一可译性。 但是,根据离散概率分布函数的性质,我们知道,需要无限多的比特才能表示实数,因为不可能完全相等而只能无限逼近。所以,使用的精确值作为对x的编码不可行,转而必须使用近似值来进行编码,所以接下来的问题就是,这个近似值需要精确到什么程度呢? 假定将舍入取位,记为,于是,取的前位作为x的码,由舍入定义,可得: 若:,则。 因而,位于对应x的阶梯之中,那么,使用比特足以表示x。 除了证明了码字与字符一一对应之外,还需要证明码字集是无前缀的。 考虑每个码字,注意到它实际上代表的不是一个点,而是一个概率区间,码是无前缀的当且仅当码字对应的区间互不相交。这可以由累计概率分布函数的性质来保证。 最后,由于使用比特来表示x,则编码的期望长度为: 因此,该编码方案的期望码长不会超过熵值2比特。 0x2:Shannon-Fano-Elias编码举例说明 首先考虑下面的例子,其中所有概率值都是二进制的,码的构造如下表: 在此情形下,期望码长尾2.75比特,而熵为1.75比特。 注意表格中的码字,显然存在着某些无效性,如果最后两个码字的最后一位删除,那么得到的码就不再是无前缀的了。 现在看Shannon-Fano-Elias码的另一个例子,在该例中,由于分布不是二进制的,所以F(x)的二进制表示可能有无穷位数字,用近似值来代替。 上述编码的平均长度比该信源赫夫曼码的长度大12比特。 Relevant Link:  《信息论基础》阮吉寿著 - 第五章    8. 决策树(ID3、C4.5)算法的赫夫曼编码本质 0x1:决策树模型和赫夫曼码的一一对应关系 决策树的建树过程我们非常熟悉,它是一种层次迭代树结构模型,从根节点开始,每次根据熵增益选择一个最优的特征作为分裂节点,直到将所有样本都分配到某个叶节点上。 这里我们用信息论中赫夫曼码的理论框架,来重新看一下决策树的建树逻辑。 决策树面对的样本特征,可以理解为一组信源信号X,信源信号X的元素个数为特征个数。决策树要建立的树结构本质,就是需要决定,哪些特征放前面,哪些特征放后面,即如何进行序列编码。 决策树从根节点开始,逐层递进,直到将所有样本分配到某个叶节点上,这是在寻找一个赫夫曼编码序列,将所有信源信号进行编码。 决策树在每层都寻找当前能带来最大熵增益的特征属性,这里隐含了一个信息,实际上,决策树是根据各个特征属性的概率大小进行了一次从大到小的排序,然后在每一层逐个取当前概率最大的特征属性作为分裂点(split point),这是一种字母码的赫夫曼码的构建过程。 0x2:从赫夫曼码视角看决策树的优缺点 从上述讨论可以看到,决策树模型的本质就是一个赫夫曼码编码方案,因此,我们可以借助赫夫曼码的定理和引理来看决策树的算法优缺点。 1. 决策树的优点 因为决策树的建树过程,符合赫夫曼码的贪婪搜索算法,每一次都是局部最优的,且全局也是最优的。所以,决策树的树结构代表了对数据特征的一种最短编码。 怎么理解这句话呢?简单来说,决策树能保证在用最短的步骤将数据映射为一个具体类型,即从一个信源编码为一个序列信号。再通俗一点说就是,将一个数据X映射为一个具体的Y。在具体的分类或者回归任务中,Y指的就是离散类型或者回归值。 2. 决策树的缺点 成也萧何败萧何,基于赫夫曼码的坚实理论,决策树获得了高效的信源信号描述能力的同时,也同样面临着赫夫曼码的缺点,这是熵本身性质带来的。 这就是我们前面说的,这就是像香农码/赫夫曼码这种熵码,对大量的小概率事件,不能及时停止,而会不断地给其分配新的码字,这样的后果就是,当数据集特征中,有大量的小概率特征,决策树的深度会变得很深,最终导致过拟合。 这样说有些抽象,我们虚构一个例子来说明。 假设现在有一个数据集,我们已经完成了特征工程,准备训练一个决策树模型,现在数据集各个特征各自的概率分布为,X={1/4,1/4,1/16,1/32,....,1/32}。 可以看到,前两个特征是高概率信源信号,我们将最短的2个码字分配给它们,这没有问题,但是接下来,剩余的特征单个的概率都很低,而且数量很大,按照赫夫曼码的构建过程,会按照概率的顺序逐个分配其递增长度的码字,可以很容易想象,如果数据特征的概率分布越分散(小概率特征越多),最后得到的赫夫曼码期望长度就会越长。 接下来,还得再说明一个问题,为什么说码长越长,越容易引起过拟合呢?反正我都是按照赫夫曼编码理论得到的最优码,你管我长还是短。 问题的根源出在数据上,我们知道,数据中除了蕴含有用的信息之外,还存在着大量的噪声数据,包括: 系统噪声:目标事物本身就存在某种不确定性,例如该特征和目标值之间根本就不存在相关关系 采样噪声:数据采集过程中引入的噪声 这些噪声的存在,最终导致了样本特征中出现大量小概率特征。这些包含噪声的小概率特征,在建模过程中是需要进行剔除的,不应该被纳入到编码范畴内。  从上述讨论中我们还得到一个工程实践上的启发,在做特征工程的时候,不要一味地贪多,认为特征越多越好,反正不管三七二十一,一顿操作,各种想得到的特征都给你提出来,让后一股脑丢给机器学习算法,心想,反正我的工作就是提特征,至于哪些特征有用,哪些特征没用,是你算法模型要决定的事情,我只管给模型喂海量高质量的数据就可以了。 这种做法在实践中当然大概率也不会遇到很大的问题,但是我们得知道其中原因,这是因为模型通过剪枝、dropout、正则化等手段进行了提前停止,一定程度上破坏了原始的赫夫曼码的构建过程,提前终止了树的继续增长,这才导致了过拟合的发生。 Relevant Link:  //www.cnblogs.com/LittleHann/p/7309511.html#_lab2_4_0   9. TODO 目前还无法彻底思考的问题,留待以后继续深入研究  蒙特卡洛搜索中蕴含的熵思想  怎么样从理论上定量分析一个问题域的熵,例如webshell恶意文件检测,将恶意文件的文本表征看做随机变量,怎么衡量其熵值。  
转载自://www.cnblogs.com/LittleHann/p/11330543.html