python - 决策树中的递归编程

标签 python recursion decision-tree

我正在用 python 编写决策树。 tree 是一个具有真分支tb 和假分支fb 的对象。只有根节点具有属性results

results 是一个字典,包含节点上每个目标变量(即因变量)的计数。我正在研究二元分类问题,因此字典 {0: 25, 1: 9} 就是一个例子。

我想创建一个函数findrootnodes(tree),它遍历树,一直到根节点。它应该返回列表根节点。列表的每个元素都应包含一个字典。因此,具有四个根节点的决策树示例为 [{0: 25, 1: 9}, {0: 2, 1: 65}, {0: 2, 1: 7}, {0: 52, 1: 4}].

我该怎么做?我当前的代码如下,但问题是它总是返回一个空列表。如果我将 rootnodes 从函数中取出,Python 会提示局部变量 rootnodes 在实例化之前被引用。

def findrootnodes(tree):   
    rootnodes = []
    if tree.results != None:
        rootnodes += tree.results
    else: 
        findrootnodes(tree.tb)
        findrootnodes(tree.fb)
    return rootnodes

最佳答案

findrootnodes 函数中,您永远不会更改非结果节点的 rootnodes 值。也就是说,当您调用 findrootnodes 时,您首先设置:

rootnodes = []

假设初始节点没有结果,则运行:

    findrootnodes(tree.tb)
    findrootnodes(tree.fb)

...两者都不会改变rootnodes的值。然后返回 rootnodes,它仍然是一个空列表。

我认为你真正想要的是:

def findrootnodes(tree):   
    rootnodes = []
    if tree.results != None:
        rootnodes.append(tree.results)
    else: 
        rootnodes.extend(findrootnodes(tree.tb))
        rootnodes.extend(findrootnodes(tree.fb))
    return rootnodes

请注意,我已将此处的 += 更改为 .append(...),因为:

>>> x = []
>>> x += {'key': 'value'}
>>> x
['key']

尝试通过 += 将字典添加到列表中会将字典视为可迭代对象,Python 将仅迭代键

关于python - 决策树中的递归编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40434121/

相关文章:

c++ - 有限状态机与 ID3 决策树

c# - 如何在c#项目中集成python库

python - 自动装饰类中的每个实例方法

python - Tweepy rate_limit_status-如何获取剩余的推文

algorithm - 使用递归在二叉树中根和节点之间的距离

javascript - 检查二维数组的递归函数

c++ - 递归分区(数论)函数的问题

c# - 从表达式树中提取所有可能的路径并评估它们是否成立

c++ - 编写决策树并将其加载到文件 C++

python - 同一命名空间中的包: can't import module in setup script