機器學習實戰——Logistic迴歸 實現記錄
阿新 • • 發佈:2018-11-09
問題: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,在函式內部對該變數進行運算,執行時會遇到了這樣的錯誤:
主要是因為沒有讓直譯器清楚變數是全域性變數還是區域性變數。