假设我想在R中创建一个间隔为(0,1)、最大深度为3的二叉树,方法如下:

首先,我们有一个树t=c(0.1,0.2,0.3,0.4,0.5,0.6,0.7)的潜在截止值池,截止值意味着如果我们随机 Select 值0.4,那么我们将区间(0,1)拆分为(0,0.4)(0.4,1).

我想做的步骤是:

1) 从整个间隔(0,1)开始

2) 从t中随机 Select 一个截止值,表示为t_1

3) 根据 Select 的截止线,将间隔(0,1)拆分为子间隔(0,t_1)(t_1,1)

4) 然后随机 Select (0,t_1)(t_1,1)之间的间隔

5) 对于所选间隔,从截止点随机抽取一个有意义的点t_2,即不在间隔之外的点

6) 继续这个过程直到达到最大深度.

我完全不知道从哪里开始.这是发布这样一个问题的合适论坛吗?

推荐答案

创建这样的树 struct 需要一个递归函数(即调用自身的函数).下面的函数创建一个 node 列表,其中每个分支 node 包含一个split值,以及两个子 node leftright.叶 node 包含叶中包含的最终范围.

make_node <- function(min = 0, max = 1, desired_depth = 3, depth = 0) {
  
  if (depth < desired_depth) {
    split <- runif(1, min, max)
  list(split = split, 
       left = make_node(min, split, desired_depth, depth + 1),
       right = make_node(split, max, desired_depth, depth + 1))
  } else {
    list(range = c(min, max))
  }
}

它是这样工作的.让我们创建一个可复制的树:

set.seed(1)

tree <- make_node()

要获得初始拆分值,我们需要:

tree$split
#> [1] 0.2655087

所以右边的分支处理0.2655087到1之间的所有值.要想知道它把这个范围分成了什么样,我们需要

tree$right$split
#> [1] 0.4136423

所以这个分支分裂成左边[0.2655087,0.4136423]和右边[0.4136423,1]之间的值.让我们判断一下左侧 node :

tree$right$left$split
#> [1] 0.3985904

这将[0.2655087,0.4136423]分支拆分为左[0.2655087,0.3985904]分支和右[0.3985904,0.4136423]分支.

如果我们取这根右边的 twig ,现在已经达到深度3,所以我们得到这片叶子的最终范围,并确认它的范围:

tree$right$left$right
#> $range
#> [1] 0.3985904 0.4136423

当然,为了让这一切变得更容易,你可能需要某种函数来遍历树,对特定的数字进行分类.

walk_tree <- function(value, tree) {
  result <- paste("Value:", value, "\n")
  while(is.null(tree$range)) {
    if(value >= tree$split) {
      result <- paste(result, "\nGreater than split of", tree$split)
      tree <- tree$right
    } else {
      result <- paste(result, "\nLess than split of", tree$split)
      tree <- tree$left
    }
  }
  result <- paste0(result, "\nValue falls into leaf node with range [",
                  tree$range[1], ",", tree$range[2], "]\n")
  cat(result)
}

例如,我们得到

walk_tree(value = 0.4, tree)
#> Value: 0.4 
#>  
#> Greater than split of 0.2655086631421 
#> Less than split of 0.413642294289884 
#> Greater than split of 0.398590389362078
#> Value falls into leaf node with range [0.398590389362078,0.413642294289884]

你可能更喜欢这个函数返回0和1的向量,或者你可能正在寻找它来绘制树,这是比较棘手的事情,但也是可能的.

reprex package(v2.0.1)于2022-03-09创建

R相关问答推荐

想要创建一个可以存储四个多元正态总体的多元偏度的载体

如何使用行政边界形状文件中的人口普查数据调整格栅数据集中的人口数据

如何以编程方式将X轴勾号上的希腊符号合并到R图中?

通过绘图 Select 线串几何体并为其着色

如何根据包含相同值的某些列获取总额

混淆矩阵,其中每列和等于1

将模拟变量乘以多个观测结果中的模拟变量

MCMC和零事件二元逻辑回归

R:连接值,而不是变量?

在发布到PowerBI Service时,是否可以使用R脚本作为PowerBI的数据源?

如果第一个列表中的元素等于第二个列表的元素,则替换为第三个列表的元素

在另存为PNG之前隐藏htmlwidget绘图元素

计算满足R中条件的连续列

R中边际效应包中Logistic回归的交互作用风险比

在纵向数据集中创建新行

创建列并对大型数据集中的特定条件进行成对比较的更高效程序

数据集上的R循环和存储模型系数

随机将数据帧中特定列上的某些行设置为NA

ArrangeGrob()和类似的替代方法不接受Grob列表.在Grid.Draw,返回:glist中的错误(...):仅允许在glist";中使用Grobs;

使用&Fill&Quot;在gglot中创建 colored颜色 渐变