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

python使用梯度下降和牛頓法尋找Rosenbrock函數(shù)最小值實(shí)例

 更新時(shí)間:2020年04月02日 09:45:13   作者:SpringHerald  
這篇文章主要介紹了python使用梯度下降和牛頓法尋找Rosenbrock函數(shù)最小值實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧

Rosenbrock函數(shù)的定義如下:

其函數(shù)圖像如下:

我分別使用梯度下降法和牛頓法做了尋找Rosenbrock函數(shù)的實(shí)驗(yàn)。

梯度下降

梯度下降的更新公式:

圖中藍(lán)色的點(diǎn)為起點(diǎn),橙色的曲線(實(shí)際上是折線)是尋找最小值點(diǎn)的軌跡,終點(diǎn)(最小值點(diǎn))為 (1,1)(1,1)。

梯度下降用了約5000次才找到最小值點(diǎn)。

我選擇的迭代步長 α=0.002α=0.002,αα 沒有辦法取的太大,當(dāng)為0.003時(shí)就會(huì)發(fā)生振蕩:

牛頓法

牛頓法的更新公式:

Hessian矩陣中的每一個(gè)二階偏導(dǎo)我是用手算算出來的。

牛頓法只迭代了約5次就找到了函數(shù)的最小值點(diǎn)。

下面貼出兩個(gè)實(shí)驗(yàn)的代碼。

梯度下降:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import ticker


def f(x, y):
 return (1 - x) ** 2 + 100 * (y - x * x) ** 2


def H(x, y):
 return np.matrix([[1200 * x * x - 400 * y + 2, -400 * x],
      [-400 * x, 200]])


def grad(x, y):
 return np.matrix([[2 * x - 2 + 400 * x * (x * x - y)],
      [200 * (y - x * x)]])


def delta_grad(x, y):
 g = grad(x, y)

 alpha = 0.002
 delta = alpha * g
 return delta


# ----- 繪制等高線 -----
# 數(shù)據(jù)數(shù)目
n = 256
# 定義x, y
x = np.linspace(-1, 1.1, n)
y = np.linspace(-0.1, 1.1, n)

# 生成網(wǎng)格數(shù)據(jù)
X, Y = np.meshgrid(x, y)

plt.figure()
# 填充等高線的顏色, 8是等高線分為幾部分
plt.contourf(X, Y, f(X, Y), 5, alpha=0, cmap=plt.cm.hot)
# 繪制等高線
C = plt.contour(X, Y, f(X, Y), 8, locator=ticker.LogLocator(), colors='black', linewidth=0.01)
# 繪制等高線數(shù)據(jù)
plt.clabel(C, inline=True, fontsize=10)
# ---------------------

x = np.matrix([[-0.2],
    [0.4]])

tol = 0.00001
xv = [x[0, 0]]
yv = [x[1, 0]]

plt.plot(x[0, 0], x[1, 0], marker='o')

for t in range(6000):
 delta = delta_grad(x[0, 0], x[1, 0])
 if abs(delta[0, 0]) < tol and abs(delta[1, 0]) < tol:
  break
 x = x - delta
 xv.append(x[0, 0])
 yv.append(x[1, 0])

plt.plot(xv, yv, label='track')
# plt.plot(xv, yv, label='track', marker='o')
plt.xlabel('x')
plt.ylabel('y')
plt.title('Gradient for Rosenbrock Function')
plt.legend()
plt.show()

牛頓法:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import ticker


def f(x, y):
 return (1 - x) ** 2 + 100 * (y - x * x) ** 2


def H(x, y):
 return np.matrix([[1200 * x * x - 400 * y + 2, -400 * x],
      [-400 * x, 200]])


def grad(x, y):
 return np.matrix([[2 * x - 2 + 400 * x * (x * x - y)],
      [200 * (y - x * x)]])


def delta_newton(x, y):
 alpha = 1.0
 delta = alpha * H(x, y).I * grad(x, y)
 return delta


# ----- 繪制等高線 -----
# 數(shù)據(jù)數(shù)目
n = 256
# 定義x, y
x = np.linspace(-1, 1.1, n)
y = np.linspace(-1, 1.1, n)

# 生成網(wǎng)格數(shù)據(jù)
X, Y = np.meshgrid(x, y)

plt.figure()
# 填充等高線的顏色, 8是等高線分為幾部分
plt.contourf(X, Y, f(X, Y), 5, alpha=0, cmap=plt.cm.hot)
# 繪制等高線
C = plt.contour(X, Y, f(X, Y), 8, locator=ticker.LogLocator(), colors='black', linewidth=0.01)
# 繪制等高線數(shù)據(jù)
plt.clabel(C, inline=True, fontsize=10)
# ---------------------

x = np.matrix([[-0.3],
    [0.4]])

tol = 0.00001
xv = [x[0, 0]]
yv = [x[1, 0]]

plt.plot(x[0, 0], x[1, 0], marker='o')

for t in range(100):
 delta = delta_newton(x[0, 0], x[1, 0])
 if abs(delta[0, 0]) < tol and abs(delta[1, 0]) < tol:
  break
 x = x - delta
 xv.append(x[0, 0])
 yv.append(x[1, 0])

plt.plot(xv, yv, label='track')
# plt.plot(xv, yv, label='track', marker='o')
plt.xlabel('x')
plt.ylabel('y')
plt.title('Newton\'s Method for Rosenbrock Function')
plt.legend()
plt.show()

以上這篇python使用梯度下降和牛頓法尋找Rosenbrock函數(shù)最小值實(shí)例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • python中常用的內(nèi)置模塊匯總

    python中常用的內(nèi)置模塊匯總

    Python內(nèi)置的模塊有很多,我們也已經(jīng)接觸了不少相關(guān)模塊,接下來咱們就來做一些匯總和介紹,在此我會(huì)整理出項(xiàng)目開發(fā)最常用的來進(jìn)行講解,感興趣的朋友跟隨小編一起看看吧
    2022-01-01
  • Pandas中字符串和時(shí)間轉(zhuǎn)換與格式化的實(shí)現(xiàn)

    Pandas中字符串和時(shí)間轉(zhuǎn)換與格式化的實(shí)現(xiàn)

    本文主要介紹了Pandas中字符串和時(shí)間轉(zhuǎn)換與格式化的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • python如何開啟多線程

    python如何開啟多線程

    這篇文章主要介紹了python如何開啟多線程問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 舉例講解Python中裝飾器的用法

    舉例講解Python中裝飾器的用法

    這篇文章主要介紹了Python中裝飾器的用法,是Python學(xué)習(xí)進(jìn)階當(dāng)中的重要知識(shí),需要的朋友可以參考下
    2015-04-04
  • Python中的HTTP請(qǐng)求超時(shí)處理方式

    Python中的HTTP請(qǐng)求超時(shí)處理方式

    HTTP請(qǐng)求超時(shí)是指客戶端在設(shè)定的時(shí)間內(nèi)未收到服務(wù)器完整響應(yīng),合理設(shè)置超時(shí)時(shí)間可提高系統(tǒng)性能和用戶體驗(yàn),Python中,requests庫和aiohttp庫提供超時(shí)控制功能,通過timeout參數(shù)設(shè)置請(qǐng)求超時(shí),并利用try-except捕獲異常,合理超時(shí)設(shè)置和處理是開發(fā)HTTP客戶端的重要技巧
    2024-11-11
  • Python cookbook(數(shù)據(jù)結(jié)構(gòu)與算法)篩選及提取序列中元素的方法

    Python cookbook(數(shù)據(jù)結(jié)構(gòu)與算法)篩選及提取序列中元素的方法

    這篇文章主要介紹了Python cookbook(數(shù)據(jù)結(jié)構(gòu)與算法)篩選及提取序列中元素的方法,涉及Python列表推導(dǎo)式、生成器表達(dá)式及filter()函數(shù)相關(guān)使用技巧,需要的朋友可以參考下
    2018-03-03
  • Python中關(guān)鍵字global和nonlocal的區(qū)別詳解

    Python中關(guān)鍵字global和nonlocal的區(qū)別詳解

    這篇文章主要給大家介紹了關(guān)于Python中關(guān)鍵字global和nonlocal的區(qū)別的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • python裝飾器中@property屬性的使用解析

    python裝飾器中@property屬性的使用解析

    這篇文章主要介紹了python裝飾器中@property屬性的使用解析,property屬性是一種用起來像是使用的實(shí)例屬性一樣的特殊屬性,可以對(duì)應(yīng)于某個(gè)方法,需要的朋友可以參考下
    2023-09-09
  • Python中列表和元組的使用方法和區(qū)別詳解

    Python中列表和元組的使用方法和區(qū)別詳解

    這篇文章主要介紹了Python中列表和元組的使用方法和區(qū)別詳解的相關(guān)資料,需要的朋友可以參考下
    2016-07-07
  • minconda安裝pytorch的詳細(xì)方法

    minconda安裝pytorch的詳細(xì)方法

    這篇文章主要介紹了minconda安裝pytorch的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03

最新評(píng)論

容城县| 巴里| 临澧县| 新邵县| 偏关县| 福泉市| 新化县| 江津市| 满城县| 池州市| 贵州省| 平武县| 民乐县| 嘉义县| 建水县| 翁牛特旗| 来安县| 巫山县| 民乐县| 洱源县| 桂平市| 都江堰市| 云南省| 越西县| 石门县| 衢州市| 慈溪市| 邯郸县| 申扎县| 衡阳县| 封丘县| 红桥区| 汉源县| 辉县市| 观塘区| 栖霞市| 姜堰市| 杭锦后旗| 平塘县| 衡水市| 北碚区|