6.信息论(一):信息量、熵和最优编码

article/2025/9/30 10:30:05

前言

信息论是由克劳德·香农发展,用来找出信号处理与通信操作的基本限制,如数据压缩、可靠的存储和数据传输等。自创立以来,已被应用多个领域,例如自然语言处理(NLP)、机器学习等领域。

定长编码(Block Codes)

让我们从一个例子开始。小明酷爱动物,日常谈吐中经常提及各种动物,包括:狗、猫、鱼和鸟。一天,小明见到小红(原谅我这么俗的名字),两个人决定用二进制的方式来交流。为了交流方便,小明和小红决定制定一套编码规则

编码映射

此时,若小明要发出“狗 猫 狗 鸟”的信息,需要完成以下过程:

编码过程

通过以上三个过程,便可以将“狗 猫 狗 鸟”转化为二进制了。

变长编码(Variable Codes)

实际中,通讯往往需要付费,假设通讯按位(bit)收费。为了省钱,小明和小红需要寻找合适的编码策略。在设计编码策略中,小红统计了小明的说话

词分布

此时,若按照上面的定长编码,每个字的平均编码长度

L(x)=2×12+2×14+2×18+2×18=2

若想进一步压缩平均编码长度,变长编码是一种有效的手段。变长编码的基本思想:出现频率高的字符使用短编码,出现频率低的字符使用长编码。(你可能会问,为什么不让所有的编码都使用短编码?嘿嘿,都使用短编码,还能实现一一对应吗?)基于上述思想,小明和小红重新指定了一套新的编码策略:

词分布

此时,每个字的平均编码长度为

L(x)=1×12+2×14+3×18+3×18=1.75

显然,新的策略能够帮小明和小红省很多钱。那么,小明和小红是如何设计的呢?

无损编码(lossless compression)

为了便于接下来的描述,以下图为例介绍几个名称

词分布

其中狗、猫、鱼等称为源符号, 0 01 110 等称为码字,整个映射使用 C(x) 表示。

无损编码

小明和小红的交流中,首先要保证信息的无损性,即保证编码后的信息能够无损的复原。若使用定长编码,复原信息轻而易举便可实现,而变长编码则不同。假如使用上图,此时小明给出的代号为

词分布

根据约定好的码表,小红既可以理解成“狗 狗 鸟 狗”,也可以理解成“狗 猫 鱼”。显然,这是小明和小红不愿意看到的。通过查阅资料,小明和小红发现他们遇到的问题是“无损编码”问题:

无损编码是一类数据压缩算法,其压缩的数据能够无损的复原为原始数据。

C(x) 是无损编码,它需要是:

  • 非奇异编码(Non-singular code): x1x2C(x1)C(x2)

在实际中,我们往往需要一次编码一系列字符,而不是一次编码一个字符,因此它需要满足:

  • 可扩展编码(Extension of a code): C(x1,...,xn)=C(x1)...C(xn)
  • 唯一可译解码(Unique decodability): xnixmjC(xni)C(xmj)

尽管唯一可译解码已经足够强了,但它并不能支撑“收到所有字符以后才进行解码”的情况。例如, C(x)

x 1234
C(x) 100011110

当收到的代号是 110000 ,解码为 322 ,而收到的代号是 1100000 ,解码为422。显然,当收到所有信息再解码时, 11 就表示了不同的字符。对于此种问题,前缀编码是一种有效的解决方案,定义如下:

  • x1x2C(x1)Prefix(C(x2))

即任意符号的编码都不是其他编码的前缀。基于前缀编码, C(x)

x 1234
C(x) 010110111

在上面的介绍中,分别介绍了“非奇异编码”、“唯一编码”、“前缀编码”。这些编码方式的相互关系可以通过下图来描述:

词分布

通过上面的知识,前缀编码是解决编码复原最好的方式,下面就需要考虑如何优化编码长度。

最优编码

需要注意的是,本文讨论的是源符号有限且已知的编码。更多关于最优编码的知识,可以参考Information Processing and Learning。

码树

在介绍最优编码之前,首先介绍一下码树和Karft不等式。对于给定码字的全体集合,可以使用码树来表示。对于 r 进制的码树,如下所示,其中左图为二元码树,右边为三元码树。在码树中R点是树根,从树根伸出树枝,构成 r 元码树。

词分布

Karft不等式

对于r元字母表上的前缀编码,码字长度为 l1,l2,...,lm 必须满足不等式

irli1

反之,若给定满足以上不等式的一组码字长度,则存在一个相应的前缀码,其码字长度就是给定长度。其中 r 可以理解成一个节点最多的孩子节点的个数。

正向证明
假设l1l2...ln A 表示r进制、深度为 ln 的码树。对于使用 r 进制表示的lln的任意字符,均能在码树 A 找到对应位置,进而第i个前缀编码在树 A 中对应节点是vi。假设 Ai 表示以节点 vi 为根的子树,此树的深度为 lnli 。根据树的性质可知, Ai 叶节点的数量为

|Ai|=rlnli

考虑到前缀编码的特性,子树之间不存在叶节点交叉,即:

AiAj=,ij

因此

|i=1nAi|=|i=1nAi|=i=1nrlnlirln

其中 rln 是所有也节点的数量。

反向证明
假设 l1l2...ln 。从整个树的第 l1 随机选择一个节点,使其对应第一个字符的编码。因为需要构建前缀编码,因此以该节点为根的子树所有节点都不再使用。这里假设整个这棵树的深度为 ln 。因此不再考虑的节点个数为 rlnl1 。依次类推,不再考虑的节点个数为

i=1nrlnli

这时问题就转化为:不再考虑的节点个数是否比总的节点个数( rln )多。由于满足Kraft不等式,因此可以构建前缀编码。

至此正向、反向证明均已完成。

最优编码

随机变量 X 的任一r元前缀码的期望长度

LHr(X)

当且仅当 rli=pi ,等式成立。

proof:
上面的问题可以转化为

minliipili  subject to:irli1

上面的问题可以转化为不等式约束下的拉格朗日数乘法,即

L(li,λ,u)=ipili+λ(irli1u2)

根据极值满足的条件得:

piλrlilnr=0irli1u2=02λu=0

显然 λ0 ,则 u=0 。从公式一可知:

rli=piλlnr

从公式二可知:

irli=1=ipiλlnr=1λlnr

λ=1lnr 。进而 li=logr1pi 。此时最优编码的长度便是熵!

经过上面的证明可知,小明只需要用前缀编码,且码长满足 logr1pi 便可获得最优的编码长度。

总结

通过上面的讨论,我们找到了小明和小红信息交流的理论依据。在后面的博客中,我会带来更多知识!


http://chatgpt.dhexx.cn/article/T7BOw6NV.shtml

相关文章

信息熵与编码

文章目录 一、信息熵的概念二、利用编码求压缩率1.香农-凡诺编码2.霍夫曼编码 三、实验证明图像字节四、文献参考 一、信息熵的概念 信息是个很抽象的概念。人们常常说信息很多,或者信息较少,但却很难说清楚信息到底有多少。比如一本五十万字的中文书到…

熵编码原理

熵编码原理 一.熵编码原理1.原理介绍2.常见方案3.整数位元法4.熵编码模型二.熵编码CABAC介绍1.二进制化2.上下文建模3.二进制算术编码常规编码区间重归一化旁路编码 一.熵编码原理 1.原理介绍 熵编码即编码过程中按熵原理不丢失任何信息的编码。信息熵为信源的平均信息量&…

熵编码:CABAC

基于上下文的二进制算术编码(Context-Based Adaptive Binary Arithmetic Coding,CABAC)将自适应二进制算术编码和上下文模型相结合。是H.265/HEVC的主要熵编码方案。 主要包括三个步骤: 二进制化; 上下文建模; 二进…

熵编码:算术编码

算术编码不是简单的将每个信源符号映射成一个码字,而是对整个输入序列分配一个码字,所以平均意义上可以为每个信源符号分配长度小于1的码字。 算术编码操作简单,下面以一个实例讲解算术编码的原理: 设信源有a,b,c,d四种符号&…

GitLab-CI基础使用总结

思路梳理 下图是GitLab-ci的实现结构图: (实际结构会有出入,画成这样只是便于理解) GitLab:是一个基于 Git 的代码托管平台,提供了代码仓库管理、问题跟踪、CI/CD 等功能。它可以用于团队协作开发、版本控制、代码审查等场景。GitLab-runne…

Git --- Git Gui

目录 1. 创建和删除分支(了解即可) 2. Git Gui 3. 什么是ssh key 4. git/gitee生成密钥并通过 第一步:本地电脑配置 第二步:远程gitee仓库配置 第三步:修改你本地的ssh remote url. 不用https协议,改用git 协议 第四步&#x…

git与gerrit基础概念

序 本文记录了 git 与 gerrit 学习所得 重点关注于当前所用到的实际操作部分,其余理论部分以及更复杂用法留待将来用到时继续补充 1 Git 与 Gerrit Git 是当前全世界流行的分布式版本控制工具,但是只适用于纯文本文件,包括markdown、网页、…

Git入门|Git的基本用法(一)

1. Git的安装 首先在安装之前确认一下系统有没有安装Git。在Terminal中输入: git --version若确认系统没有安装git,可通过以下指南安装: Getting Started - Installing Git 2. 创建本地Git库 每次进行新项目时,都需要创建一个…

Gitlab-CI入门配置

Gitlab-CI使用及.gitlab-ci.yml配置 Gitlab-CI/CD 持续集成测试篇 Gitlab-CI/CD使用场景在这里插入代码片 首先,公司使用Gitlab作为工作仓库进行代码发布及版本控制,Gitlab内置了CI/CD的工具,这些工具可以用于代码提交的同时完成镜像构建、…

Gitlab CI/CD:入门指南

功能概览 CI/CD工作流 上图是基本的CI/CD工作流,与之对应的,gitlab几乎提供了上述流程节点所需的所有相关功能: 阶段功能 1. Verify 通过持续集成自动构建和测试你的应用程序 使用GitLab代码质量(GitLab Code Quality&#xff09…

GitLab-CI 基础介绍

转载自 kubeclub GitLab-CI 工作原理 将代码托管到 git 仓库在项目的根目录下创建 .gitlab-ci.yml 文件,在文件中包含了构建、测试以及部署等脚本,这些脚本被分组为 stage,共同组成了 pipelineGitLab 检测到 ci.yml 文件,使用 G…

GitLab CI Pipeline

GitLab 不单单只是作为一个代码版本控制的仓库,很多场景下使用 GitLab 作为整合 CI 持续集成就 CD 持续发布的工作平台,那么就是 GitLab 的 CI Pipeline 功能了。 CI Pipeline 试想一下,如果开发人员只需要编写代码,而编译、打包…

CICD之 gitlab和gtilab runner

gitlab官网地址 官网文档地址 https://docs.gitlab.com/runner/install/docker.html 一。gitlab 1。gitlab安装 方式一:rpm包安装(centos)1,下载rpm包清华源软件镜像站https://mirrors.tuna.tsinghua.edu.cn/linux命令wget https://mirror…

gitlab-CI入门

gitlab-CI 代码管理自动化部署及消息推送 (1) 通过在项目根目录下配置**.gitlab-ci.yml**文件,可以控制ci流程的不同阶段,gitlab平台会扫描.gitlab-ci.yml文件,并据此处理ci流程。 (2) ci流程在每次团队成员push/merge后之后触发。每当你pu…

Gerrit介绍

谷歌 Android 开源项目在 Git 的使用上有两个重要的创新,一个是为多版本库协同而引入的 repo,这在之前我们已经详细讨论过。另外一个重要的创新就是 Gerrit —— 代码审核服务器。Gerrit 为 Git 引入的代码审核是强制性的,就是说除非特别的授…

Git--GUI

前言 上一篇文章简单的分享了Git 的 Bash Here的使用,以及一些Git常用的命令等。本篇文章要分享的内容为Git GUI Here 的使用。 一、GUI GIT官方网站为了解决部分用户通过命令行对git工具使用时的怨声载道的现象,因此推出了一个GIT的可视化工具Git Gui …

GitLab CI介绍——入门篇

本文将会对Gitlab CI进行简要介绍,包括Gitlab Runner,Gitlab CI中的相关概念以及.gitlab-ci.yml的常用配置。 那么,GitLab CI 是什么? GitLab CI 是GitLab内置的进行持续集成的工具,只需要在仓库根目录下创建.gitlab-ci.yml 文件,并配置GitLab Runner;每次提交的时候,…

Gerrit

开发、提交、push、入库流程: repo init -u ssh://gerrit帐号[ip:port/platform/manifest -b 分支名 repo sync -c -f --no-tags -j1 git commit git push origin HEAD:refs/for/分支名 有的可能是这样push的: git push ssh://usernameip:port/path…

CICD详解(八)——gitlab安装与配置

今天继续给大家介绍Linux运维相关知识,本文主要内容是gitlab的安装与配置。 一、安装环境准备 首先,我们先来安装一下Gitlab的依赖包,执行命令: yum install curl policycoreutils openssh-server openssh-clients postfix -y然…

CICD详解(九)——gitlab简单使用

今天继续给大家介绍Linux运维相关知识,本文主要内容是Gitlab简单使用。 一、Gitlab关闭自动注册 在企业生产环境中,我们一般由项目负责人负责创建用户并分配权限,一般禁止员工私自注册用户,以防给项目开发工作带来安全性上的风险…