線性回歸-梯度下降法

梯度下降法求解最小二乘


梯度下降(GD)是最小化風險函數、損失函數的一種常用方法,隨機梯度下降和批量梯度下降是兩種迭代求解思路,下面從公式和實現的角度對兩者進行分析
下面的h(x)是要擬合的函數,J(theta)是損失函數,theta是參數,要迭代求解的值,theta求解出來了那最終要擬合的函數h(theta)就出來了。其中n是訓練集的樣本數量,j是參數的個數。

1、批量梯度下降法

(1)構造損失函數


(2)求梯度
對J(theta)關于theta求偏導,得到損失函數關于每個theta對應的的梯度


(3)設置參數
1.學習率
學習率不能設置過大,否則每次theta改變的太快,可能會跳過全局最優解。而陷入局部最優解,但是也不能設置的過小,否則要經過很多次迭代才能收斂到全局最優解
2.最大迭代次數
即梯度下降法迭代的最大次數
3.誤差閾值
和迭代次數一樣是用來控制迭代的結束條件的,當誤差小于某個閾值或者迭代次數大于最大迭代次數時就結束迭代

(4)迭代更新theta
梯度是函數增長最快的方向,因此最小化損失函數,要沿著梯度的反方向進行尋優,來更新每個theta



從上面公式可以注意到,每迭代一步,都要用到訓練集所有的數據,如果樣本數量n很大,那么批量梯度下降的迭代速度會很慢!所以,這就引入了另外一種方法,隨機梯度下降。

(5)python的實現

#coding=UTF-8

import numpy as np
import matplotlib.pyplot as plt
class linear_regression_gradient_descent:

    def __init__(self,x,y,eps,alpha,max_iter_times):
        '''
        initalize feature、dependent variable 、learning rate、iteration times
        :param x:
        :param y:
        :param alpha:
        :param max_iter_times:
        '''
        self.x=x
        self.y=y
        self.n = len(self.x)
        self.w=np.zeros((x.shape[1],1))
        self.alpha=alpha
        self.iteration=max_iter_times
        self.eps=eps
        self.cost_review=np.zeros((0,0))

    def error_function(self):
        '''
        compute error of training data in every iteration
        :return:a vector of error
        '''
        # step1 compute cost function
        n = len(self.x)
        y_pred = np.dot(self.x, self.w)
        error = y_pred - self.y
        return error

    def partial_devative(self):
        '''
        compute the partial derivatives of cost functions on theta in every turn
        :return:
        '''
        n = len(self.x)
        error = self.error_function()
        delta_w = np.dot(self.x.T, error) / n
        return delta_w

    def batch_gradient_descent(self):
        '''
        gradient descent to solve the parameter of linear regression
        :return:
        '''
        n = len(self.x)
        itera = 0
        error = self.error_function()
        cost = np.sum(error ** 2) / 2 * n
        while (itera < self.iteration or cost > self.eps):
            #step1 compute the partial derivatives of cost functions on theta
            delta_w = self.partial_devative()
            #step2 update theta
            self.w = self.w - self.alpha * delta_w
            #step3 compute cost function
            error = self.error_function()
            cost = np.sum(error ** 2) / 2 * n
           # print cost
            self.cost_review=np.append(self.cost_review, cost)
            itera += 1
        return self.w
if __name__=="__main__":
        x = np.array([[1, 2, 2, 0, 1], [3, 4, 2, 0, 1], [2, 5, 1, 0, 2], [2, 3, 5, 1, 3], [1, 4, 2, 3, 1], [3, 4, 2, 2, 1]])
        x_theta0 = np.ones(x.shape[0])
        # insert a full-1 col in the first col of X matrix to get the design matrix
        design_matrix = np.insert(x, 0, values=x_theta0, axis=1)
        y = np.array([1.2, 0.4, 0.6, 2.1, 0.9, 0.3]).reshape((len(design_matrix), 1))
        lr = linear_regression_gradient_descent(design_matrix,y,0.15,0.01,100)
        w=lr.batch_gradient_descent()
        print "parameter of linear regression:"+str(w)
        print "iteration times are:"+str(len(lr.cost_review))
    #show the curve of cost function
    fig=plt.figure(1)
    plt.plot(lr.cost_review,color='r')
    plt.ylim(ymin=np.min(lr.cost_review),ymax=np.max(lr.cost_review))
    plt.xlim(xmin=0,xmax=len(lr.cost_review)+1)
    plt.ylabel("cost function")
    plt.xlabel("id of iteration")
    plt.title("cost function of linear regression")
    plt.grid()
    plt.show()
cost_function.png

可以看出:雖然迭代次數設置了100次,但是因為誤差一直沒有達到設置的閾值0.15以內,因為一直在迭代,大約迭代了將近1000次才結束,在迭代的過程中,可以看到誤差一直在不斷減小,直至達到閾值要求

2、隨機梯度下降法
(1)構造損失函數
上面批量梯度下降對應的是所有的訓練樣本,可以寫成如下這種形式:

損失函數

此時的損失函數對應的是訓練集中每個樣本的損失函數,是樣本粒度的

(2)求梯度
對每個樣本的損失函數關于theta求偏導得到梯度


梯度

(3)設置參數
參照批量梯度下降法

(4)迭代更新theta


迭代更新公式

3.SGD與BGD的比較
相同點都是全局尋優的
BGD是最小化所有訓練樣本的損失函數,使得最終求解的是全局的最優解,即求解的參數是使得風險函數最小;
SGD是最小化每條樣本的損失函數,SGD伴隨的一個問題是噪音較BGD要多,使得SGD并不是每次迭代都向著整體最優化方向。但是大的整體的方向是向全局最優化的,最終的結果往往是在全局最優解附近。
總之,SGD和BGD都是在整個參數區間上進行搜索,學習率越大,每次參數的變動越大,那么可能容易陷入局部最小值,但是整體思想是全局尋優的
不同點
(1)效率上
隨機梯度下降(SGD)是通過每個樣本來迭代更新一次,如果樣本量很大的情況(例如幾十萬),那么可能只用其中幾萬條或者幾千條的樣本,就已經將theta迭代到最優解了;
對比上面的批量梯度下降,迭代一次需要用到十幾萬訓練樣本,一次迭代不可能最優,如果迭代10次的話就需要遍歷訓練樣本10次。因此SGD在計算的效率上要高于BGD
(2)局部最小值問題
因為SGD是通過每次對部分樣本進行迭代,是對BGD的一個隨機近似,那么當目標函數有多個局部極小值時,SGD比BGD反而更可能避免進入局部極小值中。
(3)學習率η的選擇
對于步長 η的取值,一般BGD的η比SGD的大。因為GD的是使用準確的梯度,理直氣壯地走,SGD使用的是近似的梯度,就得小心翼翼地走,怕一不小心誤入歧途南轅北轍了。

4.梯度下降法和最小二乘法求解線性回歸的比較
(1)梯度下降法是迭代算法,通過每一次迭代不斷沿著函數減小最快的方向來改變代價函數的自變量theta,進而減小代價函數值,這一過程我們可以看出:梯度下降法是全局尋優的過程,只要theta設置合理,就不會陷入局部最小值,我們會逐漸收斂到全局最優值;
(2)最小二乘法是對代價函數直接求偏導令其為0,因此是局部尋優,實踐表明在屬性或者樣本數目比較多時,梯度下降法效果更好,且在參數設置合理的情況下,會收斂到全局最優解

5、梯度下降用來求最優解,哪些問題可以求得全局最優?哪些問題可能局部最優解?
對于linear regression問題,如果最優化問題對theta的分布是****unimodal,即從圖形上面看只有一個peak,所以梯度下降最終求得的是全局最優解。然而對于multimodal的問題,因為存在多個peak值,很有可能梯度下降的最終結果是局部最優

轉載請注明出處:

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,321評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,559評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,442評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,835評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,581評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,922評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,931評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,096評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,639評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,374評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,591評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,104評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,789評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,196評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,524評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,322評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,554評論 2 379

推薦閱讀更多精彩內容