关于实际压缩和Kolmogorov复杂性的界限

时间:2011-01-13 10:48:54

标签: algorithm compression complexity-theory

我正在研究使用压缩来衡量文档与文档语料库的关系。这样做时我发现使用bzip2时会出现奇怪的结果; len(compress(corpus))> len(compress(corpus + new_document))。这应该是实际压缩算法的情况吗?从理论上来看,这在查看Kolmogorov数据的复杂性时是否可行? (想法是使用压缩算法来估计数据的复杂性)

2 个答案:

答案 0 :(得分:4)

是的,应该是实际压缩算法的情况,理论上可以使用Kolmogorov complexity。解释原因的最简单方法是举个例子。

假设以下内容:

  • 您的文档分隔符是,
  • 语料库是文件abc,def,abc,def,abc,def,abc,
  • 新文件是def
  • 您的压缩算法(或kolmogorov描述语言)只允许重复,前缀为|后面的重复计数(这是run-length encoding的变体)

然后:

  • compress(corpus)=“3 | abc,def,1 | abc”
  • compress(corpus + new_document)=“4 | abc,def,”

因此compress(corpus)compress(corpus+new_document)长。这有点人为,但希望能解释一下这个结果在理论上如何用一个简单的方案出现。我不是说这就是bzip2所发生的事情,只是说明它在理论上是如何可能的。

修改的 在另一个答案中已经提到,游程编码不是图灵完整的,因此不能用于Kolmogorov复杂性。虽然这是事实,但使用图灵语言,您可以以您选择使用的任何描述语言实现运行长度编码,结果相同,因此该示例仍然有效。

答案 1 :(得分:1)

现实压缩算法有这样的怪癖,但它们只提供了非常粗略的近似值。

至于它是否可能在理论上发生,可能,但差异并不显着。

假设你有两个字符串,x和y,其中x是y的前缀。比方说吧

x =“asdfasdfasdfasdfasdfasdfasdfasdfasdf”

y =“asdfasdfasdfasdfasdfasdfasdfasdfasdf23452345234523452344523452452345234524345234”

让我们进一步假设D是y的最短描述。 (即,K(y)= | D |)

在这种情况下,x可以被描述为|“由D描述的数字减去46个字符”|,它比D长,但只有一个小的常数和一个对数因子(其余部分的字符数)说明基本上。)

甚至可能有更短的x描述,但我们知道最坏的情况是,K(x)<= K(y)+ log(| y | - | x |)

但是,你必须要记住,理论上的Kolmogorov复杂性是无法计算的,而且这个领域中的常数差异毫无意义。

(N.b。:上面的RLE示例无效,因为RLE不是图灵完整语言,因此它不能用作Kolmogorov复杂性的描述语言。)