Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 递归树生成器中的无限递归_Python_Algorithm_Recursion_Data Mining_Decision Tree - Fatal编程技术网

Python 递归树生成器中的无限递归

Python 递归树生成器中的无限递归,python,algorithm,recursion,data-mining,decision-tree,Python,Algorithm,Recursion,Data Mining,Decision Tree,我的递归python函数有一个有趣的问题。我一定错过了一些微妙的基本情况或什么!下面代码的目标是构建决策树(用于确定数据趋势的结构)。它是通过嵌套python列表实现的,返回值和结果列表就是这样做的。结构本身并没有那么重要(至少看起来如此) attr_列表(或与attr_列表有关的内容)似乎是最可能的嫌疑犯(请参阅下面我的投诉和错误消息)。attr_list包含一个属性索引列表,我将通过一次从列表中选择一个来逐个“使用”它,而不进行替换 递归函数的三种基本情况如下所示: 1(同一级别): dat

我的递归python函数有一个有趣的问题。我一定错过了一些微妙的基本情况或什么!下面代码的目标是构建决策树(用于确定数据趋势的结构)。它是通过嵌套python列表实现的,返回值和结果列表就是这样做的。结构本身并没有那么重要(至少看起来如此)

attr_列表(或与attr_列表有关的内容)似乎是最可能的嫌疑犯(请参阅下面我的投诉和错误消息)。attr_list包含一个属性索引列表,我将通过一次从列表中选择一个来逐个“使用”它,而不进行替换

递归函数的三种基本情况如下所示:

1(同一级别): dataset(行列表)中的每一行(属性列表)都共享一个由class_索引索引的行中的公共值

2(无其他属性): 参数attr_列表为空。这应该是最活跃的基本情况,发生频率最高

3(分区为空): 数据是按分区分区分区的,其中一个分区(行列表)为空,无法继续

递归调用是最长的一行(导致水平滚动条的那一行),其中函数tdidt()作为附加列表的一个组件被调用。分配给removed_attr_list的列表理解的目的是使属性列表不包含我们刚刚从attr_list中选择的属性

好的,至于我得到的错误,它是巨大的。我达到了递归极限,原因很奇怪。我会在函数调用时立即打印attr_列表,每当出现空列表时都会打印。这是输出

[0, 1, 2]
[0, 1]
[1]
[]
i see and empty list!!!
[] 
i see and empty list!!!
[1]
[]
i see and empty list!!!
[]
[1]
[1]
[1]
[1] 
[1]
[1]
.
.
.
强调省略。[1]的错误会一直出现,直到递归最大输出错误

运行时错误:cmp中超过最大递归深度

开始的行为正是我所预期的;attr_列表用完了,在递归调用上从for循环创建的几个分支被看到了,然后基本用例发出“我看到了一个空列表!”,然后[1]开始流动

我是否遗漏了一个递归案例?属性列表如何再次永久地设置回[1]?非常感谢您的帮助,感谢您将本书写到最后

------------------------------------更新日期:2014年10月24日--------------------

在每次递归调用上打印dataset变量时,我看到与attr_list参数类似的行为。事情按预期进行,然后dataset参数一次又一次变成这一行

第三名、成年名、男性名、否、第三名、成年名、男性名、否、第三名、成年名、男性名、否、第三名、成年名、男性名、否、第三名、成年名、男性名、否、第三名、成年名、男性名、否、第三名、成年名、男性名、否、第三名、成年名、男性名、否、第三名、成年名、男性名、男性名、否、无,[“第三”、“成年”、“男性”、“是的”]、[“第三”、“成年”、“男性”、“否”]、[“第三”、“成年”、“男性”、“男性”、“否”]、[“第三”、“成年”、“男性”、“否”]、[“第三”、“成年”、“男性”、“否”]、[“第三”、“成年”、“男性”、“否”]、[“第三”、“成年”、“男性”、“否”]、[“第三”、“成年”、“男性”、“是的”、[“第三”、“成年”、“男性”、“否”]、[第三”、“成年”、“男性”、“否”],['third','成人','男性','否',['third','成人','男性','否',['third','成人','男性','否']]

这仅仅是一行!(并且偷看了一些数据的奇怪的混乱)

这到底是怎么发生的呢?一旦完成了它的进程,函数似乎会产生某种除零的崩溃……我的递归肯定有什么问题

------------------------------------更新日期:2014年10月25日--------------------

好了,我们现在有点问题了。@njlarsson建议检查函数在\u attr()上划分\u时的行为返回它接收到的相同数据集,这意味着所选属性在数据集中是一致的,不会发生分区。我对这种情况的最初想法是,下一个递归调用将有一个较小的attr_列表,最终空的attr_列表基例将捕获该分区。我显然错了,这里是e一些我运行过的基本测试用例和它们共享的光

第一个播放数据集有两个实例,前三个属性是要拆分的属性,第四个是我们试图猜测的属性。由于所有拆分属性都不相等,因此partition_on_attr()函数返回整个数据集,因为一个分区不可能发生

播放=[[0,0,0,1],[1,1,1,0]]

输出是一个很棒的决策树(不太美观,但这不是重点)

[a',0,['v',0,['c',1]],[v',1,['c',0]]

现在,让我们尝试一个不同的播放数据集,类似于第一个播放集-两个实例,相同的模式

播放=[[1,1,1,1],[1,1,1,0]]

在此数据集中,前三个属性(要拆分的属性)都是相等的。因此,partition_by_attr()函数必须返回与传递的数据集相同的单个分区。出现最大递归错误!


@njlarsson你发现了什么!我只是不明白为什么会发生这种情况。如果partition\u on\u attr函数将整个数据集作为一个分区返回,那么算法应该怎么做?

我在这段代码中没有看到任何东西会单独产生无限递归,我认为问题出在别处。很可能是,
partition\u on\u attr
生成的分区不严格小于其dataset参数。例如,它可能生成一个等于该参数的分区

我要检查的第一件事是当数据集只有一个元素时,
partition\u on\u attr
会做什么。它可能返回一个包含该元素的分区
[0, 1, 2]
[0, 1]
[1]
[]
i see and empty list!!!
[] 
i see and empty list!!!
[1]
[]
i see and empty list!!!
[]
[1]
[1]
[1]
[1] 
[1]
[1]
.
.
.