构造二元决策树的功能

时间:2014-01-13 02:57:10

标签: f#

假设我有以下树结构:

type Tree =
  | Branch of (string*string) * (Tree*Tree)
  | Leaf of float

例如,它看起来像这样:

Branch (("X1",">4.5"), (Branch (("X2",">4.5"), (Leaf 3.4, Leaf 5.5)), Branch (("X3",">4.5"), (Leaf 6.5, Leaf 4.5))))

创建这样的树(来自数据,随机或其他)的函数的基本部分是什么? 我知道我的问题类似于how to make a tree from a given data with F#,但我正在努力翻译到我的树上。

编辑:我正在尝试构建一个决策树,我从树here开始,看起来像这样:

type DecisionTreeNode = 
  // Attribute name and value / child node list 
  | DecisionNode of string * (string * DecisionTreeNode) seq 
  // Decision and corresponding evidence 
  | Leaf of bool * Record seq

然而,我的是一个回归树,所以它应该有float的叶子,我只想要二进制分割,所以我想我可以使用元组而不是seq来表示节点。 在再次看到那棵树之后,我想知道我的是否应该是这样的:

type Tree = 
  | Branch of string*((string*Tree)*(string*Tree))
  | Leaf of float

2 个答案:

答案 0 :(得分:2)

我没有使用decision trees,但在阅读了您的要求之后

  
      
  1. 二进制拆分
  2.   
  3. 漂浮的叶子
  4.   

查看link中的示例,并使用Google搜索查看一些图片示例

我会用:

  

输入树=
    |字符串分支*(字符串*树)*(字符串*树)
    |浮叶

并使用

匹配节点
  

匹配节点与
  |分支(决定,(v1,l),(v2,r)) - > //做点什么   |叶值 - > //做点什么

您可以与值v1v2进行比较,然后选择相应的分支,lr

注意:我删除了()周围的((string*Tree)*(string*Tree)),以便您可以使用

Branch (decision, (v1,l), (v2,r))而不是
Branch (decision, ((v1,l), (v2,r)))

另请注意,我尚未测试或编译此代码,但它应该让您入门。

答案 1 :(得分:0)

我弄明白我原来的样子。像这样的函数(“i> 0”逻辑替换为你创建树的任何东西),这是基于@GuyCoder答案中给出的树结构:

type Tree =
| Branch of string*(string*Tree)*(string*Tree)
| Leaf of float

let rec buildTree i =
    if i<1 then Leaf 1.
    else Branch ("Branch", ("Condition1", (buildTree (i-1))), ("Condition1", (buildTree (i-1))))