我正在研究使用压缩来衡量文档与文档语料库的关系。这样做时我发现使用bzip2时会出现奇怪的结果; len(compress(corpus))> len(compress(corpus + new_document))。这应该是实际压缩算法的情况吗?从理论上来看,这在查看Kolmogorov数据的复杂性时是否可行? (想法是使用压缩算法来估计数据的复杂性)
答案 0 :(得分:4)
是的,应该是实际压缩算法的情况,理论上可以使用Kolmogorov complexity。解释原因的最简单方法是举个例子。
假设以下内容:
,
|
后面的重复计数(这是run-length encoding的变体)然后:
因此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复杂性的描述语言。)