python如何实现梯度法

  介绍

这篇文章将为大家详细讲解有关python如何实现梯度法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

假设我们已经知道梯度法,最速下降法的原理。

现给出一个算例:

 python如何实现梯度法

如果人工直接求解:

 python如何实现梯度法

 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)

最终结果图如下所示:

 python如何实现梯度法

python如何实现梯度法