问题:同一个文件下定义了两个参数,如果需要调用另一个,需要把另一个放在前面定义
def regLeaf(dataSet):#returns the value used for each leaf
return mean(dataSet[:,-1])
def regErr(dataSet):
return var(dataSet[:,-1]) * shape(dataSet)[0]
def createTree(dataSet, leafType=regLeaf, errType=regErr, ops=(1,4)):#assume dataSet is NumPy Mat so we can array filtering
feat, val = chooseBestSplit(dataSet, leafType, errType, ops)#choose the best split
if feat == None: return val #if the splitting hit a stop condition return val
retTree = {}
retTree['spInd'] = feat
retTree['spVal'] = val
lSet, rSet = binSplitDataSet(dataSet, feat, val)
retTree['left'] = createTree(lSet, leafType, errType, ops)
retTree['right'] = createTree(rSet, leafType, errType, ops)
return retTree
问题参考:https://blog.csdn.net/sinat_17196995/article/details/69621687
此节代码对于Python3不适用过多
问题:TypeError: unsupported operand type(s) for /: 'map' and 'int'
# python3不适用:fltLine = map(float,curLine)
修改为: fltLine = list(map(float, curLine))#将每行映射成浮点数,python3返回值改变,所以需要
mat0 = dataSet[nonzero(dataSet[:, feature] > value)[0], :]
mat1 = dataSet[nonzero(dataSet[:, feature] <= value)[0], :]
#下面原书代码报错 index 0 is out of bounds,使用上面两行代码
#mat0 = dataSet[nonzero(dataSet[:, feature] > value)[0], :][0]
#mat1 = dataSet[nonzero(dataSet[:, feature] <= value)[0], :][0]
# for splitVal in set(dataSet[:,featIndex]): python3报错修改为下面
for splitVal in set((dataSet[:, featIndex].T.A.tolist())[0]):#遍历每个特征里不同的特征值
测试代码前,有三处错误:
1、TypeError: unsupported operand type(s) for /: ‘map‘ and ‘int‘
修改loadDataSet函数某行为fltLine = list(map(float,curLine)),因为python3中map的返回值变了,所以要加list()
2、TypeError: unhashable type: ‘matrix’
修改chooseBestSplit函数某行为:for splitVal in set((dataSet[:,featIndex].T.A.tolist())[0]): matrix类型不能被hash。
3、TypeError: index 0 is out of bounds
函数修改两行binSplitDataSet
mat0 = dataSet[nonzero(dataSet[:, feature] > value)[0], :]
mat1 = dataSet[nonzero(dataSet[:, feature] <= value)[0], :]
问题:TypeError: string indices must be integers
问题:_tkinter.TclError: can't invoke "label" command: application has been destro
yed
>>> root = Tk()
运行完出来框以后不要关闭
>>> root=Tk() #创建一个空的tk窗口,注意弹出后不要关闭,然后继续输入下一行
>>> myLabel=Label(root,text="hello,Tkinter!")
问题:AttributeError: 'FigureCanvasTkAgg' object has no attribute 'show'
解决: The FigureCanvasTk.show function was deprecated in version 2.2. Use FigureCanvasTk.draw instead.
这是运用命令行的输出得到的修改提示。
C:\Windows\system32>cd C:/Users/34856/Desktop
C:\Users\34856\Desktop>python treeExplore.py
treeExplore.py:49: MatplotlibDeprecationWarning: The FigureCanvasTk.show function was deprecated in version 2.2. Use FigureCanvasTk.draw instead.
reDraw.canvas.show()
Traceback (most recent call last):
File "treeExplore.py", line 70, in <module>
reDraw(1.0,10)
File "treeExplore.py", line 21, in reDraw
reDraw.a.scatter(reDraw.rawDat[:,0],reDraw.rawDat[:,1],s= 5)
File "F:\anaconda\lib\site-packages\matplotlib\__init__.py", line 1855, in inner
return func(ax, *args, **kwargs)
File "F:\anaconda\lib\site-packages\matplotlib\axes\_axes.py", line 4287, in scatter
x, y, s, c, colors, edgecolors, linewidths)
File "F:\anaconda\lib\site-packages\matplotlib\cbook\__init__.py", line 1657, in delete_masked_points
raise ValueError("Masked arrays must be 1-D")
ValueError: Masked arrays must be 1-D
C:\Users\34856\Desktop>
然鹅出现了另一个问题:ValueError: Masked arrays must be 1-D
不清楚是什么原理,只要加上array()就好了 = =
大概意思就是说矩阵对象不是一维(1-D)的,变成一维数组就好了。
reDraw.a.scatter(reDraw.rawDat[:,0],reDraw.rawDat[:,1],s= 5)
#正确:
reDraw.a.scatter(array(reDraw.rawDat[:,0]),array(reDraw.rawDat[:,1]),s= 5)
问题:AttributeError: 'numpy.ndarray' object has no attribute 'regTree'
yHat = regTree.createForeCast(myTree,reDraw.testDat.regTree.modelTreeEval)
#更改为
yHat = regTree.createForeCast(myTree,reDraw.testDat,regTree.modelTreeEval)
一般出现……has no attribute '……'的时候一般都是拼写错误