最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

圖文詳解梯度下降算法的原理及Python實現(xiàn)

 更新時間:2022年08月03日 09:01:10   作者:Mr.Winter`  
梯度下降是迭代法的一種,可以用于求解最小二乘問題(線性和非線性都可以)。本文將通過圖文詳解梯度下降算法的原理及實現(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;

④ 重復(fù)②③直至收斂到最優(yōu)f(x)min。

數(shù)值解法最大的優(yōu)點是編程簡明,但缺陷也很明顯:

① 初值的設(shè)定對結(jié)果收斂快慢影響很大;

② 增量方向隨機生成,效率較低;

③ 容易陷入局部最優(yōu)解;

④ 無法處理“高原”類型函數(shù)。

所謂陷入局部最優(yōu)解是指當?shù)M入到某個極小值或其鄰域時,由于步長選擇不恰當,無論正方向還是負方向,學(xué)習(xí)效果都不如當前,導(dǎo)致無法向全局最優(yōu)迭代。就本問題而言如圖所示,當?shù)萑離=xj時,由于學(xué)習(xí)步長step的限制,無法使f(xj±Step)<f(xj),因此迭代就被鎖死在了圖中的紅色區(qū)段??梢钥闯鰔=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)生余項誤差。因此引入學(xué)習(xí)率γ∈(0,1)來減小偏移度,即xk+1-xk=−γf′(xk?)

在工程上,學(xué)習(xí)率γ \gammaγ要結(jié)合實際應(yīng)用合理選擇,γ \gammaγ過大會使迭代在極小值兩側(cè)振蕩,算法無法收斂;γ \gammaγ過小會使學(xué)習(xí)效率下降,算法收斂慢。

對于向量 ,將上述迭代公式推廣為

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)文章

最新評論

扎囊县| 威海市| 泊头市| 双江| 肇源县| 瓮安县| 内丘县| 师宗县| 泾阳县| 旅游| 鲜城| 遵化市| 曲麻莱县| 土默特左旗| 信丰县| 宝山区| 泰来县| 门源| 南涧| 天峻县| 安仁县| 库伦旗| 通州市| 乳源| 会同县| 镇平县| 同江市| 普定县| 庆元县| 白水县| 潜江市| 柏乡县| 资阳市| 大宁县| 琼海市| 包头市| 浦北县| 涞源县| 郴州市| 迭部县| 清流县|