原文-wiki

看Kolmogorov复杂性看到云里雾里,于是干脆把wiki上的翻译了一下。

Chaitin complexity, algorithmic entropy, program-size complexity


定义

Kolmogorov 复杂性可被定义到任意数学对象,为简化本文的范围,限制到字符串。必须首先为字符串指定一个描述语言。这种描述语言可以基于任意计算机编程语言。如果\(P\)是一个程序,输出字符串\(x\),则\(P\)是\(x\)的一个__描述__。描述的长度只是\(P\)作为字母串的长度,再乘与每个字母的bit数。

另外,我们可以选择一个图灵机编码,这里__编码__指一个把每个图灵机\(M\)关联到一个bit串\(<M>\)的函数。假如\(M\)是一个图灵机,对于输入\(w\),输出字符串\(x\),则字符串的联合\(<M>w\)则为\(x\)的一个__描述__。为了进行理论上的分析,这个方法更适合于构造详细的正式证明,且通常被研究性文本所采用。本文中,我们讨论一种非正式的方法。

任意串\(s\)至少有一个__描述__,即程序:

function GenerateFixedString()
return s

如果\(s\)的描述,\(d(s)\),长度最小,即使用最少的bit数,即称 \(d(s)\) 为 \(s\) 的__最小描述__。因此,\(d(s)\) 的长度(即,描述中的bit数)即为 \(s\) 的__Kolmogorov__复杂性,记为 \(K(s)\) 。用符号表示,

\(
K(s)=|d(s)|
\)

最小描述的长度取决于所选择的描述语言;但是改变描述语言的效果是有范围的(一个结果称之为_invariance_定理)。


Invariance 定理

非正式方法

从下面这些方面讲,存在一些描述语言是最优的:用某个描述语言得到的对某个对象的描述,可以将其连同一个固定的头信息放到最优描述语言中。头信息只取决于所用的语言,不受对象的描述影响,或者对象本身。

下面是最优描述语言的例子。一个描述由两个部分组成:

  • 描述另一个描述语言的部分
  • 用这种语言描述的对象部分

更技术性的术语中,第一个部分是一个计算机程序,第二个部分是能让程序输出此对象的输入。

Invariance定理如下:任意描述语言\(L\),连同头信息,最优描述语言至少等于\(L\)的效率。

证明:

通过先把 \(L\) 表述成一个计算机程序 \(P\) (第一个部分),然后用原描述D作为程序的输入(第二个部分),可以把\(L\)中的任意一个描述\(D\)转换到最优语言。新的描述\(D\prime\)的长度为(近似地):

\(|D\prime|=|P| + |D|\)

\(P\)的长度固定且不取决于\(D\)。因此,最多有一个固定的开销,且与被描述的对象无关。因此,最优语言一般最多是附加的固定开销。

更正式些的方法

定理

如果 \(K1\) 和 \(K2\) 是对于图灵完备的描述语言 \(L1\) 和 \(L2\) 的复杂性函数,那么有一个常量 \(c\) -- \(c\) 只取决于选择 \(L1\) 还是 \(L2\) -- 使得

$ \forall s. - c \leq K1(s) - K2(s) \leq c. $

证明:

根据对称性,有某个常量\(c\)使得对于所有串\(s\)

$ K1(s) \leq K2(s) + c $

假设有\(L1\)语言的程序作为\(L2\)的解释器:

function InterpretLanguage(string p)

\(p\) 为 \(L2\) 语言的程序。解释器的特征由以下属性决定:

  • 对输入 \(p\) 运行 InterpreLanguage 返回 \(p\) 的执行结果

因此,如果 \(P\) 是一个 \(L2\) 程序,是 \(s\) 的最小描述,那么 \(InterpreteLanguage(P)\) 返回串 \(s\) 。\(s\) 的描述的长度是:

  1. InterpreLanguage程序的长度,即常量 \(c\);

  2. \(P\) 的长度,即 $K2(s) $

以上二者之和。复杂性的上限得到证明。


历史与环境

算法信息理论是计算机科学的一个领域,研究对于字符串(或其他数据结构)的Kolmogorov复杂性和其他复杂性度量。

Kolmogorov复杂性的概念和理论基于一个关键的定理,此定理首先被Ray Solomonoff发现,于1960年发表,在_"A Preliminary Report on a General Theory of Inductive Inference"中,作为他发明的__算法概率__的一部分得到描述。在1964年出版的_"A Formal Theory of Inductive Inference"__中,他给出了一个更完整的描述,在__Information And Control__的第一部分和第二部分。

Andery Kolmogorov后来在1965,__Proglems Inform. Transmission__上独立发表了这个定理。Gregory Chaitin也在__J.ACM__上提出了他的定理 - Chaitin的论文于1966年10月提交并修改于1968年12月,引用了Solomonoff和Kolmogorov的论文。

定理表述,把字符串从其描述(编码)解码的算法当中,存在一个最优的算法。此算法,对于所有字符串,它可以使得编码可以与其他算法允许的编码一样短,到一个附加的取决于算法但并不取决于字符串自身的常量。Solomonoff用这个算法和其允许的编码长度,定义了一个字符串的_"普遍概率"_,字符串的后续数字的归纳推理可以基于此概率。Kolmogorov使用这个定理定义了几个字符串函数,包括,复杂性,随机性和信息。

Kolmogorov知道Solomonoff的工作时,他知道了Solomonoff 优先。几年来,比起在西方世界,Solomonoff的工作在苏联更多人知道。然而,科学界的一般共识是把这类复杂性归功于Kolmogorov,他关注序列的随机性,而算法概率归功于Solomonoff,Solomonoff 专注于用他发明的普遍优先概率分布去做预测。在更广泛的包含描述复杂性和概率的领域中,这个领域则通常称为Kolmogorov复杂性。

还有几个其他Kolmogorov复杂性或者算法信息的变体。应用最广泛的一个基于self-delimiting program,主要归功于 Leonid Levin。

对Kolmogorov复杂性的一个不证自明的方法基于 Blum 公理,由Mark Burgin在Andrey Kolmogorov发表的论文中引入。(TODO:??)


基本结论

下面的讨论中,\(K(s)\)是字符串\(s\)的复杂性。

不难看出,字符串的最小描述不能比它自身更长 -- 输出s的程序GenerateFixedString是一个固定的大于s的数量。

定理:

存在一个常量\(c\),使得

$ \forall s. K(s) \leq |s| + c $

Kolmogorov复杂性的不可计算

定理:

存在有任意大Kolmogorov复杂性的字符串。形式化表述:对于每个属于自然数的数\(n\), 有一个字符串 \(s\),\(K(s) \geq n\)。

证明:

否则所有无限多的可能的字符串可以由有限多的复杂性低于\(n\) bit的程序产生。

定理:

K不是一个可计算函数。换句话说,没有程序可以接受字符串\(s\)作为输入,产生一个整数\(K(s)\)作为输出。

下面的非直接的证明使用了类似 Pascal 的语言表示程序;为简化证明,假设其描述(即解释器)长度为1,400,000bit。为得到矛盾,假设有这样一个程序,

function KolmogorovComplexity(string s)

接受\(s\)作为输入,返回\(K(s)\);为简化证明,假设长度为7,000,000,000bit。思考长度为1,288bit的程序:

function GenerateComplexString()
for i = 1 to infinity:
for each string s of length exactly i
if KolmogorovComplexity(s) >= 8000000000
return s

使用KolmogorovComplexity作为子程序,尝试每个字符串,由最短的开始,直到返回一个字符串,其Kolmogorov复杂性至少是8,000,000,000bit,即,字符串不能由任意短于8,000,000,000bit的程序产生。但是,上面产生\(s\)的程序长度仅仅是7,001,401,288 bit,得到矛盾。(如果KolmogorovComplexity的代码更短一些,矛盾仍然存在。更长一些的话,则GenerateComplexString的常量可以任意改变。)

上面的证明用了和Berry悖论一样的矛盾:"The smallest positive integer that can not be defined in fewer than twenty English words"。通过从停机问题 \(H\)归约,同样可以用来显示\(K\)的不可计算性,因为\(K\)和\(H\)是图灵等价的。

有一个引理,在编程语言社区叫做"全雇佣定理",说的是没有完美的对长度进行优化的编译器。

Kolmogorov复杂性的链式法则

Klmogorov复杂性的链式法则:

\(
K(X,Y) = K(X)+K(Y|X) + O(log(K(X,Y)))
\)

表述产生\(X\)和\(Y\)的最短程序,比产生\(X\)的程序加上对给定的\(X\)产生\(Y\)的程序,不会多于对它所取的对数。


压缩

计算K(s)的上限是很直接的 - 只要用某个方法压缩字符串\(s\),用特定语言实现相应的解压缩程序,然后把解压缩程序与压缩后的字符串连接起来,再测量其长度即可。

\(c\)是一个整数,如果对字符串\(s\),存在一个描述,其长度不超过\(|s|-c\)bit,则\(s\)对于\(c\)是__可压缩__的。否则,\(s\)对于\(c\)是不可压缩的。不能被1压缩的字符串简单地称为不可压缩 - 根据鸽巢原理,鸽巢原理所以适用是因为每个被压缩串只映射到一个未压缩串,不可压缩串一定存在,因为长度为\(n\)的,\(2^n\)bit的串只有\(2^n-1\)个更短的串存在,即,长度(0,1,...,n-1)小于\(n\)的串。

同样原因,从不能对他们高度压缩这个方面看来,很多串是复杂的 -- 比起|s|,他们的\(K(s)\)不是很小。要更精确的的话,则固定一个n的值。有长度为\(n\)的\(2^n\)个bit串。此空间上的bit串的一致概率分布准确地分派相等的权重\(2^{-n}\)到每个长度为\(n\)的字符串。

定理:

长度为n的bit串的空间上的一致概率分布,使得字符串对于\(c\)不可压缩的概率至少是\(1-2^{-c+1}+2^{-m}\)。

要证明这个定理,注意长度不超过\(n-c\)的描述的数量由以下几何级数指定:

\(
1+2+2^n+ ... +2^{n-c}=2^{n-c+1}-1
\)

有至少\(2^n-2^{n-c+1}+1\)个长度为n的bit串对于\(c\)是不可压缩的。要得到此概率,则用它除与\(2^n\).


Chaitin的不完备定理

【略】


最小消息长度

【略】


Kolmogorov随机性

【略】


与熵的关系

【略】

Kolmogorov复杂性的更多相关文章

  1. 读<<领域驱动设计-软件核心复杂性应对之道>>有感

    道可道,非常道. 名可名,非常名. 无名天地之始,有名万物之母. ---老子 关于标题 好久没写东西了,动笔的动机是看完了一本书,想写点总结性的东西,一是为了回顾一下梳理知识点,二是为了日后遗忘时能有 ...

  2. Kolmogorov 的数学观与业绩

    https://www.douban.com/group/topic/11395706/ 作者:伊藤清 当我得知苏联伟大的数学家,84岁的 Andreyii Nikolaevich Kolmogoro ...

  3. On One Side Kolmogorov Type Inequalities

    Let \(X_1,X_2,\ldots,X_n\) be independent random variables. Denote \[S_n=\sum_{i=1}^n X_i.\] The  we ...

  4. 柯尔莫可洛夫-斯米洛夫检验(Kolmogorov–Smirnov test,K-S test)

    柯尔莫哥洛夫-斯米尔诺夫检验(Колмогоров-Смирнов检验)基于累计分布函数,用以检验两个经验分布是否不同或一个经验分布与另一个理想分布是否不同. 在进行cumulative probab ...

  5. Windows Server 2008 R2 域控修改域用户密码复杂性

    1.进入”本地安全策略”进行管理时,发现密码策略已经被锁定,无法更改: 2.在此情况下要改密码策略的过程如下, 进入组策略管理: 3.右键点击/编辑Default Domain Policy: 4.在 ...

  6. 关于Yuri Boykov and Vladimir Kolmogorov 于2004年提出的max flow / min cut的算法的详解

    出处:http://blog.csdn.net/euler1983/article/details/5959622 算法优化algorithmgraphtree任务 这篇文章说的是Yuri Boyko ...

  7. 【译】最大限度地降低多线程 C# 代码的复杂性

    分支或多线程编程是编程时最难最对的事情之一.这是由于它们的并行性质所致,即要求采用与使用单线程的线性编程完全不同的思维模式.对于这个问题,恰当类比就是抛接杂耍表演者,必须在空中抛接多个球,而不要让它们 ...

  8. 解构领域驱动设计(一):为什么DDD能够解决软件复杂性

    1 为什么我要研究领域驱动设计 1.1 设计方法各样且代码无法反映设计 我大概从2017年10月份开始研究DDD,当时在一家物流信息化的公司任职架构师,研究DDD的初衷在于为团队寻找一种软件设计的方法 ...

  9. 【系统架构】软件核心复杂性应对之道-领域驱动DDD(Domain-Driven Design)

    前言 领域驱动设计是一个开放的设计方法体系,目的是对软件所涉及到的领域进行建模,以应对系统规模过大时引起的软件复杂性的问题,本文将介绍领域驱动的相关概念. 一.软件复杂度的根源 1.业务复杂度(软件的 ...

随机推荐

  1. 仿新浪微博短网址PHP实现方案

    微博限制140字,但是我们知道有时需要分享一个类似淘宝商品的链接,很长,为了避免这个问题,所有了短网址的概念,废话不多说,直接把我的实现方案分享一下: 1)将长网址md5生成32位签名串,分为4段, ...

  2. python手记(45)

    python 声音编辑,减少音量 #!/usr/bin/env python # -*- coding: utf-8 -*- #http://blog.csdn.net/myhaspl #code:m ...

  3. UESTC_树上的距离 2015 UESTC Training for Graph Theory<Problem E>

    E - 树上的距离 Time Limit: 2000/1000MS (Java/Others)     Memory Limit: 262143/262143KB (Java/Others) Subm ...

  4. UESTC_秋实大哥打游戏 2015 UESTC Training for Data Structures<Problem H>

    H - 秋实大哥打游戏 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Subm ...

  5. Impala 2、Impala Shell 和 Impala SQL

    1.Impala 外部 Shell Impala外部Shell 就是不进入Impala内部,直接执行的ImpalaShell 例如通过外部Shell查看Impala帮助可以使用: $ impala-s ...

  6. Riak VClock

    Riak VClock 关于向量时钟的概念.在这里就多讲了,大家能够參照一下Dynamo的论文了解一下,向量时钟在分布式主要用于解决一致性性问题.能够和CRDTs一起看. 以下的源码是參照riak中的 ...

  7. struts2复习(五)拦截器总结

    1. 拦截器(Interceptor): 拦截器是Struts2的核心,Struts2的众多功能都是通过拦截器来实现的. 2. 拦截器的配置 1)编写实现Interceptor 接口的类.  2)在s ...

  8. Android应用程序与SurfaceFlinger服务之间的共享UI元数据(SharedClient)的创建过程分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/7867340 在前面一篇文章中,我们分析了And ...

  9. 在IIS上Office Word下载失败,检索 COM 类工厂中 CLSID 为000209FF的组件失败,80070005 拒绝访问。

    最近在做一个网站时,有一个下载word文档功能,在本地直接调试是可以下载的,但部署到IIS上就出现问题了. 出现问题如下:Error:下载简历方法出错:检索 COM 类工厂中 CLSID 为 {000 ...

  10. JQ 复制节点

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...