python使用梯度下降和牛頓法尋找Rosenbrock函式最小值例項
阿新 • • 發佈:2020-04-03
Rosenbrock函式的定義如下:
其函式影象如下:
我分別使用梯度下降法和牛頓法做了尋找Rosenbrock函式的實驗。
梯度下降
梯度下降的更新公式:
圖中藍色的點為起點,橙色的曲線(實際上是折線)是尋找最小值點的軌跡,終點(最小值點)為 (1,1)(1,1)。
梯度下降用了約5000次才找到最小值點。
我選擇的迭代步長 α=0.002α=0.002,αα 沒有辦法取的太大,當為0.003時就會發生振盪:
牛頓法
牛頓法的更新公式:
Hessian矩陣中的每一個二階偏導我是用手算算出來的。
牛頓法只迭代了約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函式最小值例項就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。