日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

最优化算法python实现篇(4)——无约束多维极值(梯度下降法)

發布時間:2025/3/21 python 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 最优化算法python实现篇(4)——无约束多维极值(梯度下降法) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最優化算法python實現篇(4)——無約束多維極值(梯度下降法)

  • 摘要
  • 算法簡介
  • 注意事項
  • 算法適用性
  • python實現
  • 實例運行結果
  • 算法過程可視化

摘要

本文介紹了多維無約束極值優化算法中的梯度下降法,通過python進行實現,并可視化展示了算法過程。

算法簡介

給定初始點,沿著負梯度方向(函數值下降最快的方向)按一定步長(機器學習中也叫學習率)進行搜索,直到滿足算法終止條件,則停止搜索。

注意事項

學習率不能太小,也不能太大,可以多嘗試一些值。當然每次沿著負梯度方向搜索時,總會存在一個步長使得該次搜索的函數值最低,也就是一個一維無約束極值問題,可調用黃金分割法的一維無約束優化方法求取最佳步長(學習率)。

算法適用性

1、有可能會陷入局部小值。
2、適用于凸函數,由于線性回歸的損失函數(Loss Function)是凸函數,所以該算法的應用之一就是解決線性回歸問題。

python實現

基本參數:
func:優化的目標函數
x0:初始化變量值
alpha:學習率,一般指定為(0-1),若不指定,則調取一維極值搜索法(黃金分割法)進行求取最優學習率值。黃金分割法代碼可參考我的博客:黃金分割法.
黃金分割法內部嵌套了進退法求取一個凸區間。進退法代碼參考我的博客:進退法.
epoch:最大迭代次數,若不指定默認為1000
eps:精度,默認為:1e-6

from sympy import * import numpy as np from mpl_toolkits.mplot3d import axes3d import matplotlib.pyplot as plt from matplotlib import cm class CyrusGradientDescent(object):"""func:優化的目標函數x0:初始化變量值alpha:學習率,一般指定為(0-1),若不指定,則調取一維極值搜索法(黃金分割法)進行求取最優學習率值黃金分割法代碼可參考我的博客:https://blog.csdn.net/Cyrus_May/article/details/105877363黃金分割法內部嵌套了進退法求取一個凸區間。進退法代碼參考我的博客:https://blog.csdn.net/Cyrus_May/article/details/105821131epoch:最大迭代次數,若不指定默認為1000eps:精度,默認為:1e-6"""# 1、初始化輸入參數def __init__(self,func,x0,**kargs):self.var = [Symbol("x"+str(i+1)) for i in range(int(len(x0)))]func_input = "func(("for i in range(int(len(x0))):if i != int(len(x0))-1:func_input += "self.var[" + str(i) + "]" + ","else:func_input += "self.var[" + str(i) + "]" + "))"self.func = eval(func_input)self.x = np.array(x0).reshape(-1,1)if "alpha" in kargs.keys():self.alpha = kargs["alpha"]else:self.alpha = Noneif "epoch" in kargs.keys():self.epoch = kargs["epoch"]else:self.epoch = 1e3if "eps" in kargs.keys():self.eps = kargs["eps"]else:self.eps = 1e-6self.process = []self.process.append(self.x)# 2、定義計算函數值函數def cal_func_value(self,x):func = self.funcfor i in range(x.shape[0]):func = func.subs(self.var[i],x[i,0])return func# 3、定義計算雅克比矩陣,即梯度的函數def cal_gradient(self):f = Matrix([self.func])v = Matrix(self.var)gradient = f.jacobian(v)gradient_value = []for diff_func in list(gradient):for i in range(len(self.var)):diff_func = diff_func.subs(self.var[i],self.x[i,0])gradient_value.append(diff_func)return np.array(gradient_value).reshape(-1,1)# 4、定義 若未指定學習率α時,計算最優學習率的函數def cal_alpha(self,gradient_value):if self.alpha != None:return self.alphaelse:def alpha_func(alpha):x = self.x - alpha*gradient_valuereturn self.cal_func_value(x)from minimize_golden import Minimize_Goldenreturn Minimize_Golden(func = alpha_func).run()[0] # 5、定義更新變量值的函數def update_x(self,alpha,gradient_value):self.x = self.x - alpha*gradient_valueself.process.append(self.x)# 6、定義可視化函數(當目標函數只有兩個自變量時才使用)def visual(self,x1,x2):X1,X2 = np.meshgrid(x1,x2)Z = np.ones(X1.shape)for i in range(X1.shape[0]):for j in range(X1.shape[1]):Z[i,j] = self.cal_func_value(np.array([X1[i,j],X2[i,j]]).reshape(-1,1))fig = plt.figure(figsize=(16,8))z = []x = []y = []for i in range(len(self.process)):z.append(self.cal_func_value(self.process[i]))x.append(self.process[i][0,0])y.append(self.process[i][1,0])ax = fig.add_subplot(1,1,1,projection = "3d")ax.plot_wireframe(X1,X2,Z,rcount = 20,ccount = 20)ax.plot(x,y,z,color = "r",marker = "*")# 7、統籌運行def run(self):for i in range(int(self.epoch)):# 1、計算梯度gradient_value = self.cal_gradient()if (gradient_value == 0).all():return self.x,self.cal_func_value(self.x)# 2、計算學習率αalpha = self.cal_alpha(gradient_value)# 3、更新變量值x_old = self.xself.update_x(alpha,gradient_value)if np.abs(self.cal_func_value(x_old)-self.cal_func_value(self.x)) < self.eps:return self.x,self.cal_func_value(self.x)return self.x,self.cal_func_value(self.x)if __name__ == "__main__":def func(x):return x[0]**2+x[1]**2+100gd_model = CyrusGradientDescent(func = func,x0 = (-5,5),alpha = 0.1)x,y_min = gd_model.run()print("*"*10,"Gradient Descent Algorithm","*"*10)print("x:",x)print("y_min:",y_min)x1 = np.linspace(-5,5,100)x2 = np.linspace(-5,5,100)gd_model.visual(x1,x2)

實例運行結果

********** Gradient Descent Algorithm ********** x: [[-0.000830767497365573][0.000830767497365573]] y_min: 100.000001380349

算法過程可視化


by CyrusMay 2020 05 08

直到文明又毀滅
一千世紀后的第一天
伊甸園里肩并肩
我們笑看太陽也熄滅

——五月天(一千個世紀)——

總結

以上是生活随笔為你收集整理的最优化算法python实现篇(4)——无约束多维极值(梯度下降法)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。