【问题标题】:Generate a decision tree given a set of rules给定一组规则生成决策树
【发布时间】:2011-10-04 06:48:26
【问题描述】:

在过去的几天里,我一直在思考这个问题,但没有找到最佳解决方案,因此提出了这个问题。

假设我们有一组 N 个变量,用户可以组合这些变量来创建规则列表和以下操作,例如:

variables V_1,V_2,V_3
V_1 > 5 -> "Turn left"
V_2 < 6 -> "Turn right"
1 < V_1 < 4 -> "Continue straight"
V_1 = 0 AND V_2 > 6 AND V3 > 5 -> "Go backwards"
default -> "Stay"

变量不一定是整数,并且假设规则全部由 AND 子句列表和一个动作组成。

我想做的是建立一个决策树,让我能够快速处理像 (0,7,9) 这样的输入并返回正确的操作。 到目前为止,我唯一的想法是划分变量空间并查看输入状态适合的位置,但这似乎是一个缓慢的解决方案:有人知道可能更快的方法吗?

【问题讨论】:

  • 问题定义似乎不太清楚。例如,如果 V_1 == 3 它符合两条规则,Turn leftContinue straight,这两个规则似乎相互矛盾。
  • 对不起,我写的很快,我搞砸了那个规则。我会在一秒钟内更正它。
  • 变量空间有多大?
  • 这主要取决于用户,但我认为 10 个变量是一个很好的近似值。 “最小”变量可以取 5 个值, 52x52 空间的随机子集越宽。
  • 规则是否总是对单个变量不等式或对多个变量等式,或者您可以有任意线性约束?甚至是非线性的?

标签: algorithm decision-tree


【解决方案1】:

是什么让它变慢了?很多规则?长规则?变量多?规则处理速度慢?

如果您没有太多变量 规则,我显然会选择哈希表。

这是您所说的问题的树(不一定是最佳的)示例。

variables V_1,V_2,V_3
V_1 > 5 -> "Turn left"
V_2 < 6 -> "Turn right"
1 < V_1 < 4 -> "Continue straight"
V_1 = 0 AND V_2 > 6 AND V3 > 5 -> "Go backwards"
default -> "Stay"

   V1         V2      V3
   <0 ------- <6 --------------- Right
              >=6 -------------- Stay

   0 -------- <6 --------------- Right
               6 --------------- Stay
              >6 ---- <=5 ------ Stay
                      >5 ------- Backwards

   ]0-1] ---- <6 --------------- Right
              >=6 -------------- Stay

   ]1-4[ ----------------------- Straight

   [4-5] ---- <6 --------------- Right
              >=6 -------------- Stay

   >5 ------- <6 --------------- Right
              >=6 -------------- Stay

【讨论】:

  • 不会有很多变量,但更广泛的变量可以假设大量的值。关键是,大多数输入将导致默认操作,(将其视为稀疏矩阵),我不知道如何使用它:决策树似乎是个好主意,但使用用户定义的间隔构建它们是一团糟
  • 您可以使用范围树来有效地跨区间搜索。决策树非常有效,但正如您在我的示例中看到的那样,存在某种冗余。
  • 规则不能少于400,我担心哈希表会占用太多内存。
猜你喜欢
  • 2019-03-04
  • 2017-10-25
  • 2013-04-07
  • 2011-06-20
  • 2018-03-27
  • 2019-01-28
  • 2017-02-12
  • 2021-12-16
  • 2013-12-12
相关资源
最近更新 更多