1. 程式人生 > >【機器學習演算法-python實現】邏輯迴歸的實現(LogicalRegression)

【機器學習演算法-python實現】邏輯迴歸的實現(LogicalRegression)

1.背景知識

在剛剛結束的天貓大資料s1比賽中,邏輯迴歸是大家都普遍使用且效果不錯的一種演算法。

(1)迴歸     

    先來說說什麼是迴歸,比如說我們有兩類資料,各有50十個點組成,當我門把這些點畫出來,會有一條線區分這兩組資料,我們擬合出這個曲線(因為很有可能是非線性),就是迴歸。我們通過大量的資料找出這條線,並擬合出這條線的表示式,再有資料,我們就以這條線為區分來實現分類。下圖是我畫的一個數據集的兩組資料,中間有一條區分兩組資料的線。

   (2)sigmoid函式

         我們看到了上圖中兩組資料的劃分,那麼我們怎麼來找出兩組資料的邊界表示式呢,這裡用到sigmoid函式。它的形狀大致是(如下),公式

把資料集的特徵值設為x1,x2,x3......。我們要求出它們的迴歸係數。只要設z=w1*x1+w2*x2.....用sigmoid函數出理是防止資料從0到1發生跳變,因為目標函式是0到1,我們要把帶入x1,x2...多項式資料控制在這之間。

 (3)梯度上升演算法

   梯度上升是指找到函式增長的方向。公式。在具體實現的過程中,不停地迭代運算直到w的值幾乎不再變化為止。

2.程式碼

資料集在工程中有。匯入資料集,並定義sigmoid函式
def loadDataSet():
    dataMat = []; labelMat = []
    fr = open('/Users/hakuri/Desktop/testSet.txt')
    for line in fr.readlines():
        lineArr = line.strip().split()
        dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])
        labelMat.append(int(lineArr[2]))
    return dataMat,labelMat

def sigmoid(inX):
    return 1.0/(1+exp(-inX))


返回迴歸係數,對應於每個特徵值,for迴圈實現了遞迴梯度上升演算法。
def gradAscent(dataMatIn, classLabels):
    dataMatrix = mat(dataMatIn)             #convert to NumPy matrix
    labelMat = mat(classLabels).transpose() #convert to NumPy matrix
    
    m,n = shape(dataMatrix)
    alpha = 0.001
    maxCycles = 500
    weights = ones((n,1))
    
    for k in range(maxCycles):              #heavy on matrix operations
        h = sigmoid(dataMatrix*weights)     #matrix mult
        error = (labelMat - h)              #vector subtraction
        weights = weights + alpha * dataMatrix.transpose()* error #matrix mult
    return weights


結果,返回了特徵值的迴歸係數。我們的資料集有兩個特徵值分別是x1,x2。我們又增設了了x0變數。得到的結果

[[ 4.12414349]

 [ 0.48007329]

 [-0.6168482 ]]

我們得出x1和x2的關係(設x0=1),0=4.12414349+0.48007329*x1-0.6168482*x2畫出x1與x2的關係圖

3.程式碼

作者微信公眾號:凡人機器學習

長期分享機器學習實戰相關資訊,感謝關注!