1. 程式人生 > >機器學習實戰——Logistic迴歸 實現記錄

機器學習實戰——Logistic迴歸 實現記錄

問題: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,在函式內部對該變數進行運算,執行時會遇到了這樣的錯誤:

主要是因為沒有讓直譯器清楚變數是全域性變數還是區域性變數。