久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:36日期:2022-07-31 11:49:09

Rosenbrock函數的定義如下:

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

其函數圖像如下:

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

我分別使用梯度下降法和牛頓法做了尋找Rosenbrock函數的實驗。

梯度下降

梯度下降的更新公式:

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

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

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

梯度下降用了約5000次才找到最小值點。

我選擇的迭代步長 α=0.002α=0.002,αα 沒有辦法取的太大,當為0.003時就會發生振蕩:

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

牛頓法

牛頓法的更新公式:

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

Hessian矩陣中的每一個二階偏導我是用手算算出來的。

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

牛頓法只迭代了約5次就找到了函數的最小值點。

下面貼出兩個實驗的代碼。

梯度下降:

import numpy as npimport matplotlib.pyplot as pltfrom matplotlib import tickerdef f(x, y): return (1 - x) ** 2 + 100 * (y - x * x) ** 2def 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# ----- 繪制等高線 -----# 數據數目n = 256# 定義x, yx = np.linspace(-1, 1.1, n)y = np.linspace(-0.1, 1.1, n)# 生成網格數據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)# 繪制等高線數據plt.clabel(C, inline=True, fontsize=10)# ---------------------x = np.matrix([[-0.2], [0.4]])tol = 0.00001xv = [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 npimport matplotlib.pyplot as pltfrom matplotlib import tickerdef f(x, y): return (1 - x) ** 2 + 100 * (y - x * x) ** 2def 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# ----- 繪制等高線 -----# 數據數目n = 256# 定義x, yx = np.linspace(-1, 1.1, n)y = np.linspace(-1, 1.1, n)# 生成網格數據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)# 繪制等高線數據plt.clabel(C, inline=True, fontsize=10)# ---------------------x = np.matrix([[-0.3], [0.4]])tol = 0.00001xv = [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函數最小值實例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 欧美日韩一区在线 | 精品无码久久久久久国产 | 国产欧美日韩精品一区二区三区 | 9191在线 | 久久久久久网址 | 色婷婷影院 | 欧美日韩国产一区二区三区 | 国产精品久久久久久 | 自拍偷拍亚洲视频 | 日本做暖暖视频高清观看 | 成人欧美一区二区三区黑人孕妇 | 99热欧美| 国产成人精品免费 | 最新中文字幕视频 | 久久免费的视频 | 欧美日韩一区二区在线 | 欧美日一区二区 | 欧洲成人午夜免费大片 | 激情91| 日本不卡精品 | 性大毛片视频 | 亚洲a精品| 嫩草网站入口 | 久久精品中文 | 亚洲成人av一区二区 | 91久久| 国产人免费人成免费视频 | 亚洲成人中文字幕 | 久久视频一区二区 | 国产精品乱码一二三区的特点 | 作爱视频免费看 | 欧美三区视频 | 国产999精品久久久久 | 一区二区在线看 | 久久免费精品视频 | 中文字幕日韩欧美一区二区三区 | 国产精产国品一二三产区视频 | 精品二区 | 亚洲国产精品一区 | 国产在线精品一区二区三区 | 日韩欧美国产一区二区 |