15.3 剪枝优化

15.3 剪枝优化

  • 规则生成本质上是一个贪心搜索的过程,需要一定的机制缓解过拟合的风险,最常见的做法是剪枝(pruning)。与决策树相似,剪纸可以发生在规则生长过程中,即预剪枝。也可以发生在规则产生后,即后剪枝。通常是基于某种性能度量指标来评估增/删逻辑文字前后的规则性能,或增/删规则前后的规则集性能,从而判断是否要进行剪枝。

  • 剪枝还可以借助统计显著性检验来进行,例如CN2算法在预剪枝的过程时,假设用规则集来进行预测必须显著优于直接基于训练样例集后验概率分布进行预测,为了便于计算。CN2使用了似然率统计量(LRS)。令m+,m-分别表示训练样例集中的正,反例数目,m+,m-分别表示规则(集合——覆盖的正反例数目,则有

在这里插入图片描述

  • 这实际上是一种信息量指标,衡量了规则集覆盖样例的分布和训练集经验分布的差别:LRS越大,说明采用规则集进行预测和直接使用训练集正,反例比率进行猜测的差别越大。LRS越小,说明规则集的效果越可能是偶然现象,在数据量比较大的现实任务中,通常设置为LRS很大(例如0.99)时,CN2算法才停止规则集生长

  • 规则学习中常称为生长集,和剪枝条。

  • 后剪枝最常用的策略是减错剪枝(REP),其基本的做法是:将样例集合划分为训练集和验证集,从训练集上学得规则R后进行多轮剪枝,在每一轮穷举所有可能的剪枝操作,包括删除规则中的某个文字,删除规则中结尾文字,删除规则尾部多个文字,删除整条规则等。然后用验证集对剪枝产生的所有候选规则集进行评估,保留最好的那个规则集进行下一轮的剪枝,如此继续,直到无法通过剪枝提高验证集上的性能为止。

  • REP剪枝通常很有效果,但是他的复杂度是 O(m^4),m为驯良样本的数量。IREP,负责都是m (log m)^2,其做法是:在生成每条规则前,先将当前样例集划分为训练集和验证集,在训练集上生成一条规则R,立即在验证集上对其进行REP剪枝,得到规则 R’,将R‘覆盖的样例去掉,在更新后的样例集合上重复上述的操作。显然,REP是针对规则集进行剪枝,而IREP仅仅对于单挑规则进行剪枝,因此后者比前者更加高效

  • 若将剪枝机制和其他一些后处理手段结合起来对规则集进行优化,则往往可以获得很好的效果,以著名的规则学习算法RIPPER为例,其泛化性能超过很多决策树算法,而且学习速度也比大多数决策树算法更快,奥妙就在于将剪枝和后处理优化相结合

  • RIPPER算法描述如下,它先使用了IREP剪枝机制生成了规则集R,IREP是IREP的改进,主要是以m+和m- 取代了IREP使用的准确率作为规则性能度量指标,在剪枝的时候删除规则尾部的多个文字,并且在最终得到规则集之后再进行一次IREP剪枝。RIPPER中的后处理机制是为了在剪枝的基础上进一步提升性能,对R中的每条规则Ri,RIPPER为它产生两个变体:

在这里插入图片描述

  • R’:基于Ri的覆盖的样例,用IREP*重新生成一条规则R‘,该规则称为替换规则

  • R’’:对Ri增加文字进行特化,然后再用IREP*剪枝生成一条规则Ri’’,该规则称为修订规则

  • 接下来,将R‘i和R’‘i分别与R中除Ri之外的规则放在一起,组成了规则集R’和R’’,然后将他们和R一起进行比较,选择最优的规则集保留下来,这就是第四行算法所作的操作

  • 为什么RIPPER的优化策略有效呢?原因很简单:最初生成R的时候,规则是按序生成的、每条规则都没有对其后产生的规则加以考虑,这样的贪心算法本质常常导致算法陷入局部最优RIPPER的后处理优化过程将R中的所有规则放在一起重新加以优化,恰恰是通过全局的考虑来缓解贪心算法的局部性,从而往往能够得到更好的效果。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在MATLAB中进行RRT剪枝优化,可以使用MATLAB的Robotics System Toolbox来实现。以下是一个简单的示例代码: ```matlab % 创建一个Robotics System Toolbox的Rigid Body Tree对象 robot = robotics.RigidBodyTree; % 定义机器人的链接 body1 = robotics.RigidBody('body1'); joint1 = robotics.Joint('joint1', 'revolute'); setFixedTransform(joint1, trvec2tform([0 0 0])); body1.Joint = joint1; addBody(robot, body1, 'base'); body2 = robotics.RigidBody('body2'); joint2 = robotics.Joint('joint2', 'revolute'); setFixedTransform(joint2, trvec2tform([1 0 0])); body2.Joint = joint2; addBody(robot, body2, 'body1'); % 设置RRT参数 rrt = robotics.RRT(robot); rrt.NumNodes = 1000; rrt.StepLength = 0.2; % 生成RRT树 startConfig = [0, 0]; goalConfig = [pi/2, 0]; path = rrt.plan(startConfig, goalConfig); % 执行RRT剪枝优化 path = rrt.prune(path); % 可视化路径 show(rrt); % 绘制路径 figure; hold on; plot(path(:,1), path(:,2), 'r-', 'LineWidth', 2); scatter(startConfig(1), startConfig(2), 'go', 'filled'); scatter(goalConfig(1), goalConfig(2), 'ro', 'filled'); xlabel('关节1角度'); ylabel('关节2角度'); legend('优化后的路径', '起始点', '目标点'); ``` 在上述代码中,我们首先创建了一个Rigid Body Tree对象来定义机器人的链接和关节。然后,我们使用Robotics System Toolbox提供的RRT类来进行路径规划和剪枝优化。通过设置RRT的参数,如节点数和步长,我们可以生成RRT树并规划路径。接下来,我们使用`prune`函数对生成的路径进行剪枝优化。最后,我们使用`show`函数可视化RRT树,并使用`plot`函数绘制剪枝优化后的路径。 请注意,这只是一个简单的示例代码,实际情况可能会有所不同。你需要根据你的机器人模型和路径规划需求进行相应的修改和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值