欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

梯度下降法介紹及利用Python實(shí)現(xiàn)的方法示例

 更新時(shí)間:2017年07月12日 08:39:19   作者:yhao浩  
梯度下降算法是一個(gè)很基本的算法,在機(jī)器學(xué)習(xí)和優(yōu)化中有著非常重要的作用,下面這篇文章主要給大家介紹了關(guān)于利用Python實(shí)現(xiàn)梯度下降法的相關(guān)資料,對大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。

本文主要給大家介紹了梯度下降法及利用Python實(shí)現(xiàn)的相關(guān)內(nèi)容,分享出來供大家參考學(xué)習(xí),下面話不多說,來一起看看詳細(xì)的介紹吧。

梯度下降法介紹

梯度下降法(gradient descent),又名最速下降法(steepest descent)是求解無約束最優(yōu)化問題最常用的方法,它是一種迭代方法,每一步主要的操作是求解目標(biāo)函數(shù)的梯度向量,將當(dāng)前位置的負(fù)梯度方向作為搜索方向(因?yàn)樵谠摲较蛏夏繕?biāo)函數(shù)下降最快,這也是最速下降法名稱的由來)。

梯度下降法特點(diǎn):越接近目標(biāo)值,步長越小,下降速度越慢。

直觀上來看如下圖所示:


這里每一個(gè)圈代表一個(gè)函數(shù)梯度,最中心表示函數(shù)極值點(diǎn),每次迭代根據(jù)當(dāng)前位置求得的梯度(用于確定搜索方向以及與步長共同決定前進(jìn)速度)和步長找到一個(gè)新的位置,這樣不斷迭代最終到達(dá)目標(biāo)函數(shù)局部最優(yōu)點(diǎn)(如果目標(biāo)函數(shù)是凸函數(shù),則到達(dá)全局最優(yōu)點(diǎn))。

下面我們將通過公式來具體說明梯度下降法

下面這個(gè)h(θ)是我們的擬合函數(shù)


也可以用向量的形式進(jìn)行表示:


下面函數(shù)是我們需要進(jìn)行最優(yōu)化的風(fēng)險(xiǎn)函數(shù),其中的每一項(xiàng)都表示在已有的訓(xùn)練集上我們的擬合函數(shù)與y之間的殘差,計(jì)算其平方損失函數(shù)作為我們構(gòu)建的風(fēng)險(xiǎn)函數(shù)(參見最小二乘法及其Python實(shí)現(xiàn))


這里我們乘上1/2是為了方便后面求偏導(dǎo)數(shù)時(shí)結(jié)果更加簡潔,之所以能乘上1/2是因?yàn)槌松线@個(gè)系數(shù)后對求解風(fēng)險(xiǎn)函數(shù)最優(yōu)值沒有影響。

我們的目標(biāo)就是要最小化風(fēng)險(xiǎn)函數(shù),使得我們的擬合函數(shù)能夠最大程度的對目標(biāo)函數(shù)y進(jìn)行擬合,即:


后面的具體梯度求解都是圍繞這個(gè)目標(biāo)來進(jìn)行。

批量梯度下降BGD

按照傳統(tǒng)的思想,我們需要對上述風(fēng)險(xiǎn)函數(shù)中的每個(gè)求其偏導(dǎo)數(shù),得到每個(gè)對應(yīng)的梯度


這里表示第i個(gè)樣本點(diǎn)的第j分量,即h(θ)中的

接下來由于我們要最小化風(fēng)險(xiǎn)函數(shù),故按照每個(gè)參數(shù)的負(fù)梯度方向來更新每一個(gè)


這里的α表示每一步的步長

從上面公式可以注意到,它得到的是一個(gè)全局最優(yōu)解,但是每迭代一步,都要用到訓(xùn)練集所有的數(shù)據(jù),如果m很大,那么可想而知這種方法的迭代速度?。∷?,這就引入了另外一種方法,隨機(jī)梯度下降。

隨機(jī)梯度下降SGD

因?yàn)榕刻荻认陆翟谟?xùn)練集很大的情況下迭代速度非常之慢,所以在這種情況下再使用批量梯度下降來求解風(fēng)險(xiǎn)函數(shù)的最優(yōu)化問題是不具有可行性的,在此情況下,提出了——隨機(jī)梯度下降
我們將上述的風(fēng)險(xiǎn)函數(shù)改寫成以下形式:


其中,


稱為樣本點(diǎn)的損失函數(shù)

接下來我們對每個(gè)樣本的損失函數(shù),對每個(gè)求其偏導(dǎo)數(shù),得到每個(gè)對應(yīng)的梯度


然后根據(jù)每個(gè)參數(shù)的負(fù)梯度方向來更新每一個(gè)


與批量梯度下降相比,隨機(jī)梯度下降每次迭代只用到了一個(gè)樣本,在樣本量很大的情況下,常見的情況是只用到了其中一部分樣本數(shù)據(jù)即可將θ迭代到最優(yōu)解。因此隨機(jī)梯度下降比批量梯度下降在計(jì)算量上會大大減少。

SGD有一個(gè)缺點(diǎn)是,其噪音較BGD要多,使得SGD并不是每次迭代都向著整體最優(yōu)化方向。而且SGD因?yàn)槊看味际鞘褂靡粋€(gè)樣本進(jìn)行迭代,因此最終求得的最優(yōu)解往往不是全局最優(yōu)解,而只是局部最優(yōu)解。但是大的整體的方向是向全局最優(yōu)解的,最終的結(jié)果往往是在全局最優(yōu)解附近。

下面是兩種方法的圖形展示:

從上述圖形可以看出,SGD因?yàn)槊看味际怯靡粋€(gè)樣本點(diǎn)進(jìn)行梯度搜索,因此其最優(yōu)化路徑看上去比較盲目(這也是隨機(jī)梯度下降名字的由來)。

對比其優(yōu)劣點(diǎn)如下:

批量梯度下降:

優(yōu)點(diǎn):全局最優(yōu)解;易于并行實(shí)現(xiàn);總體迭代次數(shù)不多

缺點(diǎn):當(dāng)樣本數(shù)目很多時(shí),訓(xùn)練過程會很慢,每次迭代需要耗費(fèi)大量的時(shí)間。

隨機(jī)梯度下降:

優(yōu)點(diǎn):訓(xùn)練速度快,每次迭代計(jì)算量不大

缺點(diǎn):準(zhǔn)確度下降,并不是全局最優(yōu);不易于并行實(shí)現(xiàn);總體迭代次數(shù)比較多。

Python實(shí)現(xiàn)方法示例

上面我們講解了什么是梯度下降法,以及如何求解梯度下降,下面我們將通過python來實(shí)現(xiàn)梯度下降法。

# _*_ coding: utf-8 _*_ 
# 作者: yhao 
# 博客: http://blog.csdn.net/yhao2014 
# 郵箱: yanhao07@sina.com 
 
# 訓(xùn)練集 
# 每個(gè)樣本點(diǎn)有3個(gè)分量 (x0,x1,x2) 
x = [(1, 0., 3), (1, 1., 3), (1, 2., 3), (1, 3., 2), (1, 4., 4)] 
# y[i] 樣本點(diǎn)對應(yīng)的輸出 
y = [95.364, 97.217205, 75.195834, 60.105519, 49.342380] 
 
# 迭代閥值,當(dāng)兩次迭代損失函數(shù)之差小于該閥值時(shí)停止迭代 
epsilon = 0.0001 
 
# 學(xué)習(xí)率 
alpha = 0.01 
diff = [0, 0] 
max_itor = 1000 
error1 = 0 
error0 = 0 
cnt = 0 
m = len(x) 
 
 
# 初始化參數(shù) 
theta0 = 0 
theta1 = 0 
theta2 = 0 
 
while True: 
 cnt += 1 
 
 # 參數(shù)迭代計(jì)算 
 for i in range(m): 
 # 擬合函數(shù)為 y = theta0 * x[0] + theta1 * x[1] +theta2 * x[2] 
 # 計(jì)算殘差 
 diff[0] = (theta0 + theta1 * x[i][1] + theta2 * x[i][2]) - y[i] 
 
 # 梯度 = diff[0] * x[i][j] 
 theta0 -= alpha * diff[0] * x[i][0] 
 theta1 -= alpha * diff[0] * x[i][1] 
 theta2 -= alpha * diff[0] * x[i][2] 
 
 # 計(jì)算損失函數(shù) 
 error1 = 0 
 for lp in range(len(x)): 
 error1 += (y[lp]-(theta0 + theta1 * x[lp][1] + theta2 * x[lp][2]))**2/2 
 
 if abs(error1-error0) < epsilon: 
 break 
 else: 
 error0 = error1 
 
 print ' theta0 : %f, theta1 : %f, theta2 : %f, error1 : %f' % (theta0, theta1, theta2, error1) 
print 'Done: theta0 : %f, theta1 : %f, theta2 : %f' % (theta0, theta1, theta2) 
print '迭代次數(shù): %d' % cnt 

結(jié)果(截取部分):

 theta0 : 2.782632, theta1 : 3.207850, theta2 : 7.998823, error1 : 7.508687 
 theta0 : 4.254302, theta1 : 3.809652, theta2 : 11.972218, error1 : 813.550287 
 theta0 : 5.154766, theta1 : 3.351648, theta2 : 14.188535, error1 : 1686.507256 
 theta0 : 5.800348, theta1 : 2.489862, theta2 : 15.617995, error1 : 2086.492788 
 theta0 : 6.326710, theta1 : 1.500854, theta2 : 16.676947, error1 : 2204.562407 
 theta0 : 6.792409, theta1 : 0.499552, theta2 : 17.545335, error1 : 2194.779569 
 theta0 : 74.892395, theta1 : -13.494257, theta2 : 8.587471, error1 : 87.700881 
 theta0 : 74.942294, theta1 : -13.493667, theta2 : 8.571632, error1 : 87.372640 
 theta0 : 74.992087, theta1 : -13.493079, theta2 : 8.555828, error1 : 87.045719 
 theta0 : 75.041771, theta1 : -13.492491, theta2 : 8.540057, error1 : 86.720115 
 theta0 : 75.091349, theta1 : -13.491905, theta2 : 8.524321, error1 : 86.395820 
 theta0 : 75.140820, theta1 : -13.491320, theta2 : 8.508618, error1 : 86.072830 
 theta0 : 75.190184, theta1 : -13.490736, theta2 : 8.492950, error1 : 85.751139 
 theta0 : 75.239442, theta1 : -13.490154, theta2 : 8.477315, error1 : 85.430741 
 theta0 : 97.986390, theta1 : -13.221172, theta2 : 1.257259, error1 : 1.553781 
 theta0 : 97.986505, theta1 : -13.221170, theta2 : 1.257223, error1 : 1.553680 
 theta0 : 97.986620, theta1 : -13.221169, theta2 : 1.257186, error1 : 1.553579 
 theta0 : 97.986735, theta1 : -13.221167, theta2 : 1.257150, error1 : 1.553479 
 theta0 : 97.986849, theta1 : -13.221166, theta2 : 1.257113, error1 : 1.553379 
 theta0 : 97.986963, theta1 : -13.221165, theta2 : 1.257077, error1 : 1.553278 
Done: theta0 : 97.987078, theta1 : -13.221163, theta2 : 1.257041 
迭代次數(shù): 3443 

可以看到最后收斂到穩(wěn)定的參數(shù)值。

注意:這里在選取alpha和epsilon時(shí)需要謹(jǐn)慎選擇,可能不適的值會導(dǎo)致最后無法收斂。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

參考文檔:

相關(guān)文章

  • python2 與python3的print區(qū)別小結(jié)

    python2 與python3的print區(qū)別小結(jié)

    這篇文章主要介紹了python2 與python3的print區(qū)別小結(jié),需要的朋友可以參考下
    2018-01-01
  • Python深度學(xué)習(xí)albumentations數(shù)據(jù)增強(qiáng)庫

    Python深度學(xué)習(xí)albumentations數(shù)據(jù)增強(qiáng)庫

    下面開始albumenations的正式介紹,在這里我強(qiáng)烈建議英語基礎(chǔ)還好的讀者去官方網(wǎng)站跟著教程一步步學(xué)習(xí),而這里的內(nèi)容主要是我自己的一個(gè)總結(jié)以及方便英語能力較弱的讀者學(xué)習(xí)
    2021-09-09
  • python實(shí)現(xiàn)TCPserver的使用示例

    python實(shí)現(xiàn)TCPserver的使用示例

    python實(shí)現(xiàn)TCPserver是一件簡單的事情,只要通過socket這個(gè)模塊就可以實(shí)現(xiàn),本文就來介紹一下python實(shí)現(xiàn)TCPserver的使用示例,感興趣的可以了解一下
    2023-10-10
  • Python實(shí)現(xiàn)按中文排序的方法示例

    Python實(shí)現(xiàn)按中文排序的方法示例

    這篇文章主要介紹了Python實(shí)現(xiàn)按中文排序的方法,涉及Python基于locale模塊的中文編碼與排序相關(guān)操作技巧,需要的朋友可以參考下
    2018-04-04
  • 使用python播放音頻的示例代碼

    使用python播放音頻的示例代碼

    在Python中,我們可以使用多種庫來播放音頻文件,其中最常用的是pygame庫和playsound庫,本文給大家分享使用這些庫的示例,對python播放音頻示例代碼感興趣的朋友一起看看吧
    2024-02-02
  • win10+anaconda安裝yolov5的方法及問題解決方案

    win10+anaconda安裝yolov5的方法及問題解決方案

    這篇文章主要介紹了win10+anaconda安裝yolov5的方法及問題解決方案,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • python nmap實(shí)現(xiàn)端口掃描器教程

    python nmap實(shí)現(xiàn)端口掃描器教程

    這篇文章主要為大家詳細(xì)介紹了python nmap實(shí)現(xiàn)端口掃描器教程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • Python計(jì)算信息熵實(shí)例

    Python計(jì)算信息熵實(shí)例

    這篇文章主要介紹了Python計(jì)算信息熵實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • Python、Javascript中的閉包比較

    Python、Javascript中的閉包比較

    這篇文章主要介紹了Python、Javascript中的閉包比較,本文分別講解了Python和Javascript中的閉包,分對它們的不同做了一個(gè)簡單的比較,需要的朋友可以參考下
    2015-02-02
  • python字典dict中常用內(nèi)置函數(shù)的使用

    python字典dict中常用內(nèi)置函數(shù)的使用

    本文主要介紹了python字典dict中常用內(nèi)置函數(shù)的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04

最新評論