1. 程式人生 > 程式設計 >python使用梯度下降和牛頓法尋找Rosenbrock函式最小值例項

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

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 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


# ----- 繪製等高線 -----
# 資料數目
n = 256
# 定義x,y
x = np.linspace(-1,1.1,n)
y = np.linspace(-0.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,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.00001
xv = [x[0,0]]
yv = [x[1,0]]

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

for t in range(6000):
 delta = delta_grad(x[0,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,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,[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,n)
y = np.linspace(-1,fontsize=10)
# ---------------------

x = np.matrix([[-0.3],marker='o')

for t in range(100):
 delta = delta_newton(x[0,marker='o')
plt.xlabel('x')
plt.ylabel('y')
plt.title('Newton\'s Method for Rosenbrock Function')
plt.legend()
plt.show()

以上這篇python使用梯度下降和牛頓法尋找Rosenbrock函式最小值例項就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。