Logistic迴歸之梯度上升優化演算法(一)
Logistic迴歸之梯度上升優化演算法
一、Logistic迴歸
首先我們需要了解什麼是Logistic迴歸。Logistic迴歸是一種分類演算法,一般用於二分類問題,例如預測明天是否下雨,當然也可以用於多分類問題。本文主要是討論二分類問題。二分類問題即輸出結果一般只有兩個情況,我們可以理解為函式的輸出為0或1。具有這種性質的函式我們已經接觸過,該函式成為海微塞德階躍函式(Heaviside step function),或者直接稱為單位階躍函式。然而該函式在跳躍點上從0瞬間跳躍到1,這個瞬間跳躍過程很難處理。所以使用Sigmoid函式,Sigmoid函式計算公式如下:
Z是函式的輸入,將兩個數值向量對應元素相乘然後全部加起來得到z值。向量x是分類器的輸入資料,向量w也就是我們要找到的最佳引數(係數),從而使得分類器儘可能精確。圖中上部分是沒有w的的輸入,圖中下部分是有w的輸入。使得Sigmoid函式看起來像一個階躍函式。
二、梯度上升法
為了尋找最佳引數w,需要用到最優化理論的一些知識。首先介紹梯度上升的最優化方法。梯度上升法基於的思想是:要找到某函式的最大值,最好的方法是沿著該函式的梯度方向探尋。如果梯度記為,則函式d的梯度由下表示:
這個梯度意味著要沿x的方向移動,沿y方向移動。其中,函式f(x,y)必須要在待計算的點上有定義並且可微。其實和我們高中求導求極值是一個意思。梯度演算法的迭代公式如下:
其中為步長,也就是學習速率,控制更新的幅度。我們以函式為例。比如從(0,0)開始,迭代路徑就是1→2→3→4→...→n,直到求出的x為函式極大值的近似值,停止迭代,python3程式碼如下:
'''
函式說明:梯度上升演算法測試函式
求函式f(x) = -x^2 + 4x的極大值
Parameters:
無
Returens:
無
'''
def Gradient_Ascent_test():
def f_prime(x_old):
return -2 * x_old +4 #f(x)的導數
x_old = -1 #初始值,給一個小魚x_new的值
x_new = 0 #梯度上升演算法初始值,即從(0,0)開始
alpha = 0.01 #步長,也就是學習速率,控制更新的幅度
presision = 0.00000001 #精度,也就是更新閾值
while abs(x_old - x_new) >presision:
x_old = x_new
x_new = x_old + alpha * f_prime(x_old) #上面提到的公式
print(x_new) #列印最終求解的x
if __name__ == '__main__':
Gradient_Ascent_test()