假设我有以下树结构:
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
答案 0 :(得分:2)
我没有使用decision trees,但在阅读了您的要求之后
- 二进制拆分
- 漂浮的叶子
醇>
查看link中的示例,并使用Google搜索查看一些图片示例
我会用:
输入树=
|字符串分支*(字符串*树)*(字符串*树)
|浮叶
并使用
匹配节点匹配节点与
|分支(决定,(v1,l),(v2,r)) - > //做点什么 |叶值 - > //做点什么
您可以与值v1
或v2
进行比较,然后选择相应的分支,l
或r
。
注意:我删除了()
周围的((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))))