问题:NameError: name 'weights' is not defined
属于作者的排版错误;
weights = logRegres.gradAscent(dataArr,labelMat)
所以: weights.getA()是什么?
matrix.getA()
Return self as an ndarray object.
Equivalent to np.asarray(self).
Parameters: None
Returns: ret : ndarrayself as an ndarray
也就是说矩阵通过这个getA()这个方法可以将自身返回成一个n维数组对象为什么要这样做呢?
因为plotBestFit()函数中有计算散点x,y坐标的部分,其中计算y的时候用到了weights,如果weights是矩阵的话,weights[1]就是[[0.48007329]](注意这里有中括号!),就不是一个数了,最终你会发现y的计算结果的len()只有1,而x的len()则是60
问题:AttributeError: 'numpy.ndarray' object has no attribute 'getA'
究其原因,还是因为原书中代码有错误(翻遍了整个CSDN都没有结果,最后还是翻了原作者提供的代码明白的,作者也把代码更正过来了 )
weights = wei.getA()
这行可以去掉,然后把def中的 wei改成 weights 。。。然后完美运行~!
问题:TypeError: 'range' object doesn't support item deletion
#原代码
def stocGradAscent1(dataMatrix,classLabels,numIter=150):
m,n = shape(dataMatrix)
weights = ones(n)
for j in range(numIter):
dataIndex = range(m)
for i in range(m):
alpha = 4/(1.0 +j + i ) +0.01
randIndex = int(random.uniform(0,len(dataIndex)))
h = sigmoid(sum(dataMatrix[randIndex]*weights))
error = classLabels[randIndex] - h
weights = weights + alpha *error *dataMatrix[randIndex]
del(dataIndex[randIndex])
return weights
给range 加 list()即可解决 。原因:python3.x range返回的是range对象,不返回数组对象
def stocGradAscent1(dataMatrix,classLabels,numIter=150):
m,n = shape(dataMatrix)
weights = ones(n)
for j in range(numIter):
dataIndex = list(range(m))
for i in range(m):
alpha = 4/(1.0 +j + i ) +0.01
randIndex = int(random.uniform(0,len(dataIndex)))
h = sigmoid(sum(dataMatrix[randIndex]*weights))
error = classLabels[randIndex] - h
weights = weights + alpha *error *dataMatrix[randIndex]
del(dataIndex[randIndex])
return weights
问题:UnboundLocalError: local variable 'numTestVec' referenced before assignment
这是我遇到过最迷的问题了!!!
原答案:
numTestVect = 0.0
改正后:
numTestVec = 0.0
就因为多了一个字母,在那对了半天 = =眼盲两小时
问题:UnboundLocalError: local variable 'xxx' referenced before assignment
在函数外部已经定义了变量n,在函数内部对该变量进行运算,运行时会遇到了这样的错误:
主要是因为没有让解释器清楚变量是全局变量还是局部变量。