问题 Kolmogorov复杂性近似算法


我正在寻找一种算法,可以计算给定输入字符串的Kolmogorov复杂度的近似值。因此,如果K是字符串S的Kolmogorov复杂度,并且t表示时间,那么函数将表现得像这样...... limit(t-> inf)[K_approx(t,S)] = K.


6998
2017-08-19 14:41


起源

对于那些不熟悉该主题的人来说,字符串的Kolmogorov复杂性本质上是“生成字符串的最短程序的长度”。例如,一个9x9乘法表可以产生8个字符( */~1+i.9 )使用J编程语言( 看这里 )。由此可以看出,相对于J编程语言,9x9乘法表的Kolmogorov复杂度为8或更小。 - Joey Adams
如果您正在尝试正式证明某些内容,则必须独立于(完全忽略)用于逼近它的方法来编写证明。如果你只是在寻找乐趣,那么试试数据压缩算法怎么样? - rwong
不,我不是在寻找证据。我正在寻找满足上述属性的算法。我找不到一个,我想知道是否有人已经这样做了。我不知道任何数据压缩算法原则上可以在足够的时间内找到确切的Kolmogorov复杂度。我乍一看,因为你总是使用有限字符串,所有可能的图灵机器的枚举搜索可能会起作用......但问题可能是不可判定的。我正在为机器学习应用程序寻找这样的算法。 - Tony
如今机器学习应用专注于压缩感知,模型简化算法等.KC过于理论化。 - rwong
似乎是家庭作业......但乔伊亚当斯是对的。你有答案。 - PeterAllenWebb


答案:


理论上,当运行时间接近无穷大时,程序可以收敛其输入字符串的Kolmogorov复杂性。它可以通过并行运行每个可能的程序来工作,即输入字符串的长度或更短。当找到给定长度的程序时,该长度被识别为现在已知的最小长度,被打印,并且不再有程序> =该长度被尝试。该算法(很可能)将永远运行,打印更短和更短的长度,在无限时间内收敛于精确的Kolmogorov复杂度。

当然,运行指数数量的程序是非常难以控制的。一个更有效的算法是发布一个 在StackOverflow上编码高尔夫。一些缺点:

  • 可能需要几天才能找到好的结果。
  • 它使用了大量我们最宝贵的计算资源,耗费了数千美元的生产力损失。
  • 随着资源的转移,结果的产生频率越来越低 其他  计算
  • 算法 终止  过早 对于许多输入,意味着它一般不起作用。

13
2017-08-19 15:07



或者你很快会遇到一个永远运行的程序,你无法决定是停止它还是让它运行几秒钟(几十年)。 - rwong
@rwong:是的,这就是你并行运行它们的原因。对于似乎永远运行的许多程序,允许它们继续运行,直到找到更短的解决方案(如果有的话)。 - Joey Adams
我想在函数中添加另一个参数来指定图灵机的最大长度是合理的。所以我们可以有一个像这样的属性的函数??? limit(t-> inf)[limit(T_max-> inf)[K_approx(t,S,T_max)]] = K - Tony
我想到了蠕虫...(对于不熟悉代码高尔夫的人: meta.stackexchange.com/questions/20736/...) - rwong
@Tony:在空间限制或程序长度限制中?你只需要有限的时间来找到给定运行时间的最短程序(因为它们都终止了,呃)。不太明显,您只需要有限的时间来使用有限的空间找到最短的程序。后者是正确的,因为暂停问题对于在有限空间中运行的程序是可判定的(想一想)。因此,您可以限制为运行时间 - >无穷大或空间 - >无穷大。你不需要两者都做。 - Joey Adams


维基百科页面 对于Kolmogorov,复杂性在“基本结果”部分下有一个标题为“Kolmogorov复杂性的不可复制性”的小节。这不是一个可以计算甚至有效近似的基本衡量标准。

毫无疑问,有更好的方法可以达到你想要的效果。如果你想要一个随机度量,你可以尝试二进制熵函数。其中一种标准算法的可压缩性也可能符合要求。


1
2017-08-19 16:41



维基文章甚至没有在任何地方提到“近似有效”的短语。没有问到计算字符串的KC的问题。这是不可判定的......故事的结尾。我正在寻找的是一个功能,通过为它提供更多的时间和空间资源,将导致更好和更好的近似。 - Tony
@Tony:您的算法未完全指定。我不确定你打算如何使用每个可能的输入字符串测试每个可能的图灵机到某种尺寸,但即使你可以用一些有意义的方式做到这一点,时间成本将是输入的指数。无论理论看起来多么好看,它都不是在实践中对你有用的东西。 - Rob Lachlan
@Rob,该函数只需要1个字符串作为输入“S:String”,并且只测试大小为TMax的图灵机。所以我们没有测试所有的图灵机,因此无法获得输入字符串的确切KC。 - Tony
@Tony - 我认为很多人认为小型随机生成的图灵机不是绝大多数输入字符串的解决方案(即有效的压缩器)。 - Stephen C
@Stephen。车削机器不是随机生成的。它们将被列举。只有在决定算法时,才能考虑任何优化概念。 - Tony


我觉得这可能有用吗?如果有人看到错误,请指出。

function KApprox(S:string,t:integer,TapeSizeMax:integer) : Turing Machine of size k
  begin

    // An abstract data type that represents a turing machine of size k
    var TM(k:integer) : Turing Machine of size k;
    var TMSmallest(k:integer) : Turing Machine of size k;  

    var j : integer;
    var i : integer;

    for (j = t to 0 step -1) // reduce the time counter by 1
      begin
       for (i = TMax to 1 step -1) // go to the next smaller size of TM
         begin
          foreach (TM(i)) // enumerate each TM of size i
             begin 
               if (TM(i).halt(TapeSizeMax) == true) and (TM(i).output() == S) then
                 begin
                   if (sizeof(TM(i)) < sizeof(TMSmallest(i))) then
                      TMSmallest(i): = TM(i);
                 end;
             end;
         end;
      end;      
    return TMSmallest;
 end;

1
2017-08-19 15:56



我认为致命的缺陷是 TM[i].output() 可能永远不会回来 - Gabe
@Gabe ..好点..需要重新考虑一下。 - Tony
我认为这将解决暂停问题。 - Tony
现在的问题是没有这样的东西 halts() 功能。你可以编写一个适用于某些机器的机器,但不是全部机器。 - Gabe
但你不能写一个 halts() TMax的功能> 4.参见 mathworld.wolfram.com/HaltingProblem.html - Gabe


看起来Ray Solomonoff在这个领域做了很多工作。

Ray Solomonoff的出版物 

归纳推理理论 - 模式识别与人工智能问题的统一解。

算法概率是否解决了归纳问题?


1
2017-08-19 21:28





我注意到的第一个问题是“Kolmogorov复杂性”没有明确定义。它在某种程度上取决于如何表示程序的选择。因此,您需要做的第一件事就是修复一些程序编码(例如,Joey Adams的规范,程序用J编写)。

一旦进行了编码,您正在寻找的算法非常简单。看到乔伊的答案。

但情况甚至比必须运行指数多的程序还要糟糕。每个程序都可以运行,只要你可以想象(技术上:运行时作为函数输入大小可以比任何递归函数增长更快)。更重要的是,可能是一些最短的程序是运行时间最长的程序。因此,当时间变为无穷大时,并行方法将接近正确的值,但它将以难以想象的速度缓慢地进行。

您可以提前停止程序,确定该点的近似值足够好。但是,你一般不知道这种近似有多好。事实上,有些定理表明你永远不会知道。

所以简短的回答是“简单,只需使用Joey的算法”,但无论如何,实际上,答案是“你没有机会”。正如rwong所推荐的那样,你最好只使用重型压缩算法。


0
2017-11-12 22:36