原文-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\) 的描述的长度是:
-
InterpreLanguage程序的长度,即常量 \(c\);
-
\(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随机性
【略】
与熵的关系
【略】