圖文詳解梯度下降算法的原理及Python實現(xiàn)
1.引例
給定如圖所示的某個函數(shù),如何通過計算機算法編程求f(x)min?
2.數(shù)值解法
傳統(tǒng)方法是數(shù)值解法,如圖所示
按照以下步驟迭代循環(huán)直至最優(yōu):
① 任意給定一個初值x0;
② 隨機生成增量方向,結(jié)合步長生成Δx;
③ 計算比較f(x0)與f(x0+Δx)的大小,若f(x0+Δx)<f(x0)則更新位置,否則重新生成Δx;
④ 重復②③直至收斂到最優(yōu)f(x)min。
數(shù)值解法最大的優(yōu)點是編程簡明,但缺陷也很明顯:
① 初值的設(shè)定對結(jié)果收斂快慢影響很大;
② 增量方向隨機生成,效率較低;
③ 容易陷入局部最優(yōu)解;
④ 無法處理“高原”類型函數(shù)。
所謂陷入局部最優(yōu)解是指當?shù)M入到某個極小值或其鄰域時,由于步長選擇不恰當,無論正方向還是負方向,學習效果都不如當前,導致無法向全局最優(yōu)迭代。就本問題而言如圖所示,當?shù)萑離=xj時,由于學習步長step的限制,無法使f(xj±Step)<f(xj),因此迭代就被鎖死在了圖中的紅色區(qū)段。可以看出x=xj并非期望的全局最優(yōu)。
若出現(xiàn)下圖所示的“高原”函數(shù),也可能使迭代得不到更新。
3.梯度下降算法
梯度下降算法可視為數(shù)值解法的一種改進,闡述如下:
記第k輪迭代后,自變量更新為x=xk,令目標函數(shù)f(x)在x=xk泰勒展開:
f(x)=f(xk?)+f′(xk?)(x−xk?)+o(x)
考察f(x)min ,則期望f(xk+1)<f(xk),從而:
f(xk+1?)−f(xk?)=f′(xk?)(xk+1?−xk?)<0
若f′(xk)>0則xk+1<xk ,即迭代方向為負;反之為正。不妨設(shè)xk+1−xk=−f′(xk),從而保證f(xk+1)−f(xk)<0。必須指出,泰勒公式成立的條件是x→x0,故|f′(xk)|不能太大,否則xk+1與xk距離太遠產(chǎn)生余項誤差。因此引入學習率γ∈(0,1)來減小偏移度,即xk+1-xk=−γf′(xk?)
在工程上,學習率γ \gammaγ要結(jié)合實際應用合理選擇,γ \gammaγ過大會使迭代在極小值兩側(cè)振蕩,算法無法收斂;γ \gammaγ過小會使學習效率下降,算法收斂慢。
對于向量 ,將上述迭代公式推廣為
xk+1?=xk?−γ∇xk??
其中
為多元函數(shù)的梯度,故此迭代算法也稱為梯度下降算法
梯度下降算法通過函數(shù)梯度確定了每一次迭代的方向和步長,提高了算法效率。但從原理上可以知道,此算法并不能解決數(shù)值解法中初值設(shè)定、局部最優(yōu)陷落和部分函數(shù)鎖死的問題。
4.代碼實戰(zhàn):Logistic回歸
import pandas as pd import numpy as np import os import matplotlib.pyplot as plt import matplotlib as mpl from Logit import Logit ''' * @breif: 從CSV中加載指定數(shù)據(jù) * @param[in]: file -> 文件名 * @param[in]: colName -> 要加載的列名 * @param[in]: mode -> 加載模式, set: 列名與該列數(shù)據(jù)組成的字典, df: df類型 * @retval: mode模式下的返回值 ''' def loadCsvData(file, colName, mode='df'): assert mode in ('set', 'df') df = pd.read_csv(file, encoding='utf-8-sig', usecols=colName) if mode == 'df': return df if mode == 'set': res = {} for col in colName: res[col] = df[col].values return res if __name__ == '__main__': # ============================ # 讀取CSV數(shù)據(jù) # ============================ csvPath = os.path.abspath(os.path.join(__file__, "../../data/dataset3.0alpha.csv")) dataX = loadCsvData(csvPath, ["含糖率", "密度"], 'df') dataY = loadCsvData(csvPath, ["好瓜"], 'df') label = np.array([ 1 if i == "是" else 0 for i in list(map(lambda s: s.strip(), list(dataY['好瓜']))) ]) # ============================ # 繪制樣本點 # ============================ line_x = np.array([np.min(dataX['密度']), np.max(dataX['密度'])]) mpl.rcParams['font.sans-serif'] = [u'SimHei'] plt.title('對數(shù)幾率回歸模擬\nLogistic Regression Simulation') plt.xlabel('density') plt.ylabel('sugarRate') plt.scatter(dataX['密度'][label==0], dataX['含糖率'][label==0], marker='^', color='k', s=100, label='壞瓜') plt.scatter(dataX['密度'][label==1], dataX['含糖率'][label==1], marker='^', color='r', s=100, label='好瓜') # ============================ # 實例化對數(shù)幾率回歸模型 # ============================ logit = Logit(dataX, label) # 采用梯度下降法 logit.logitRegression(logit.gradientDescent) line_y = -logit.w[0, 0] / logit.w[1, 0] * line_x - logit.w[2, 0] / logit.w[1, 0] plt.plot(line_x, line_y, 'b-', label="梯度下降法") # 繪圖 plt.legend(loc='upper left') plt.show()
到此這篇關(guān)于圖文詳解梯度下降算法的原理及Python實現(xiàn)的文章就介紹到這了,更多相關(guān)Python梯度下降算法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python讀取Ansible?playbooks返回信息示例解析
這篇文章主要為大家介紹了Python讀取Ansible?playbooks返回信息示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12python實現(xiàn)WebSocket服務端過程解析
這篇文章主要介紹了python實現(xiàn)WebSocket服務端過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-10-10Flask Paginate實現(xiàn)表格分頁的使用示例
flask_paginate是Flask框架的一個分頁擴展,用于處理分頁相關(guān)的功能,本文就來介紹一下Flask Paginate實現(xiàn)表格分頁的使用示例,感興趣的可以了解一下2023-11-11Python實現(xiàn)公歷(陽歷)轉(zhuǎn)農(nóng)歷(陰歷)的方法示例
這篇文章主要介紹了Python實現(xiàn)公歷(陽歷)轉(zhuǎn)農(nóng)歷(陰歷)的方法,涉及農(nóng)歷算法原理及Python日期運算相關(guān)操作技巧,需要的朋友可以參考下2017-08-08python類型強制轉(zhuǎn)換long to int的代碼
python的int型最大值和系統(tǒng)有關(guān),32位和64位系統(tǒng)結(jié)果是不同的,分別為2的31次方減1和2的63次方減1,可以通過sys.maxint查看此值2013-02-02簡單的Python動態(tài)可視化神器,編程小白也能上手
這篇文章就來介紹簡單的Python動態(tài)可視化神器,最近發(fā)現(xiàn)了一個寶藏動態(tài)可視化庫,非常簡單,即使是小白也能輕松上手。這個庫就是motionchart,它能夠用 pandas 的 dataframe 數(shù)據(jù)直接創(chuàng)建交互式的動態(tài)圖表,下面來簡單看一下如何使用。2021-10-102020最新pycharm漢化安裝(python工程獅親測有效)
這篇文章主要介紹了2020最新pycharm漢化安裝(python工程獅親測有效),文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-04-04