剪枝一词引自对树木的修剪,即修剪掉不必要的枝叶以调整树冠结构或更新枝叶等。而在算法中,剪枝思想则是避免不必要的操作和搜索,或在结果中修剪不必要的部分以获得更好的效果。

这里举三个不同类型算法的例子,以更好的理解剪枝思想的应用:

质数
  • 剪枝一:最简单的判断n是否为质数的方法是根据其定义判断从2到n-1是否存在其约数,时间复杂度O(n);最常用的判断则是判断从2到sqrt(n)是否存在其约数,时间复杂度O(sqrt(n))

    • 剪枝操作:从2到(n-1)剪枝为2到sqrt(n)
  • 剪枝二:判断2之后,就可以判断从3到sqrt(n)之间的奇数了,无需再判断之间的偶数,时间复杂度O(sqrt(n)/2)

    • 剪枝操作:从2到sqrt(n)剪枝为3到sqrt(n)之间的奇数
  • 剪枝三:首先看一个关于质数分布的规律:大于等于5的质数一定和6的倍数相邻。例如5和7,11和13,17和19等等;注意反过来是不对的,即和6的倍数相邻的数是质数,如35

    证明:令x≥1,将大于等于5的自然数表示如下:

    ··· 6x-1,6x,6x+1,6x+2,6x+3,6x+4,6x+5,6(x+1),6(x+1)+1 ···

    可以看到,不在6的倍数两侧,即6x两侧的数为6x+2,6x+3,6x+4,由于2(3x+1),3(2x+1),2(3x+2),所以它们一定不是素数,再除去6x本身,显然,素数要出现只可能出现在6x的相邻两侧。因此在5到sqrt(n)中每6个数只判断2个,时间复杂度O(sqrt(n)/3)。

  • 剪枝操作:从3到sqrt(n)之间的奇数剪枝为5到sqrt(n)中和6的倍数相邻的数

以上都是一个剪枝的思想,剪枝一裁剪了sqrt(n)之后不必要的数,剪枝二中裁剪了不必要的偶数,剪枝三中裁剪了不和6的倍数相邻的数,虽然都没有降低时间复杂度的阶数(除了剪枝一),但都一定程度上加快了判断的速度。

RRT(快速搜索随机树)

RRT是一种多维空间中有效率的规划方法。它以一个初始点作为根节点,通过随机采样增加叶子节点的方式,生成一个随机扩展树,当随机树中的叶子节点包含了目标点或进入了目标区域,便可以在随机树中找到一条由从初始点到目标点的路径。

由上图可以看出,因为RRT采样的随机性,其得到的路径有很多冗余的节点,增加了路径的长度。最常用也是最简单的优化方法就是剪枝,裁剪掉不必要的节点。如下图所示,a,b两段就可以用c来替换,由三角不等式可知,替换后的路径更短且Zparent这个冗余的节点就被裁剪掉了。

剪枝在RRT上的应用,这个想法很简单,简单到觉得这不就是一个三角不等式嘛,但是对于RRT这个随机性很强的路径规划算法,非常实用,虽然已经有很多对RRT的改进方法,但在实时性上,这个简单的优化方法无疑是最快的,这里给出一个示意图。

决策树


剪枝处理(pruning)是决策树学习算法中对付“过拟合”的主要手段, 在决策树学习中, 为了尽可能正确分类训练样本, 节点划分过程不断重复, 有时候会造成决策树分支过多, 以至于将训练样本集自身特点当作泛化特点, 而导致过拟合。 因此可以采用剪枝处理来去掉一些分支来降低过拟合的风险。

Reference: 机器学习 - 周志华 清华大学出版社

代码:

这里给出RRT剪枝的代码,质数和决策树剪枝相关的博文和代码较多,可自行查找和学习。

代码托管在:RRT_and_Pruning