介绍
这篇文章将为大家详细讲解有关python如何实现梯度法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
假设我们已经知道梯度法,最速下降法的原理。
现给出一个算例:
如果人工直接求解:
现给python求出解过程:
import numpy as np 得到sympy import * import 数学 import matplotlib.pyplot  as plt import mpl_toolkits.axisartist  as axisartist #,定义符号 x1, x2, t =,符号(& # 39;x1, x2,, t,) def func (): ,#自定义一个函数 战俘,return  (x1,, 2), +, 2, *,战俘(x2), 2),安康;2,*,x1 *, x2 作用;2,*,x2 def 研究生(数据): ,#求梯度向量,data=https://www.yisu.com/zixun/[data1、data2] f=func () grad_vec=[差异(f, x1),差异(f, x2)] #求偏导数,梯度向量 研究生=[] 在grad_vec:项 grad.append(项目。潜艇(x1,数据[0])。潜艇(x2,数据[1])) 返回研究生 def grad_len(研究生): #梯度向量的模长 vec_len=数学。√战俘毕业生[0],2)+战俘(研究生[1],2)) 返回vec_len def zhudian (f): #求得最小值(t)的驻点 t_diff=diff (f) t_min=解决(t_diff) 返回t_min def主要(X0,θ): f=func () grad_vec=研究生(X0) grad_length=grad_len (grad_vec) #梯度向量的模长 k=0 data_x=[0] data_y=[0] 虽然grad_length>θ:#迭代的终止条件 k +=1 p=-np.array (grad_vec) #迭代 X=np.array (X0) + t * p t_func=f。潜艇(x1, X [0])。潜艇(x2, X [1]) t_min=zhudian (t_func) X0=np.array (X0) + t_min * p grad_vec=研究生(X0) grad_length=grad_len (grad_vec) 打印(grad_length, grad_length) 打印('坐标”,X0 [0], X0 [1]) data_x.append (X0 [0]) data_y.append (X0 [1]) 打印(k) #绘图 无花果=plt.figure () ax=axisartist。次要情节(图111) fig.add_axes (ax) ax.axis“底”。set_axisline_style(- |>,大?1.5) ax.axis(“左”)。set_axisline_style(“->”,大?1.5) ax.axis(“顶级”).set_visible(假) ax.axis(“正确”).set_visible(假) plt。标题(r的梯度美元/方法——最大/美元下降/方法) plt。情节(data_x data_y,标签=r f (x_1、x_2)=美元x_1 ^ 2 + 2/cdot x_2 ^ 2 - 2/cdot x_1/cdot x_2-2/cdot x_2美元”) plt.legend () plt。散点(1,- 1,标志=(5、1),c=5 s=1000) plt.grid () plt。包含(r“x_1美元”,字形大?20) plt。ylabel (r“x_2美元”,字形大?20) plt.show () if __name__==癬_main__”: #给定初始迭代点和阈值 主要((0,0),0.00001)
最终结果图如下所示: