python如何实现梯度法(python,开发技术)

时间:2024-05-03 11:05:27 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

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

现给出一个算例:

python如何实现梯度法

如果人工直接求解:

python如何实现梯度法

python如何实现梯度法

现给出Python求解过程:

importnumpyasnpfromsympyimport*importmathimportmatplotlib.pyplotaspltimportmpl_toolkits.axisartistasaxisartist#定义符号x1,x2,t=symbols('x1,x2,t')deffunc():#自定义一个函数returnpow(x1,2)+2*pow(x2,2)-2*x1*x2-2*x2defgrad(data):#求梯度向量,data=[data1,data2]f=func()grad_vec=[diff(f,x1),diff(f,x2)]#求偏导数,梯度向量grad=[]foritemingrad_vec:grad.append(item.subs(x1,data[0]).subs(x2,data[1]))returngraddefgrad_len(grad):#梯度向量的模长vec_len=math.sqrt(pow(grad[0],2)+pow(grad[1],2))returnvec_lendefzhudian(f):#求得min(t)的驻点t_diff=diff(f)t_min=solve(t_diff)returnt_mindefmain(X0,theta):f=func()grad_vec=grad(X0)grad_length=grad_len(grad_vec)#梯度向量的模长k=0data_x=[0]data_y=[0]whilegrad_length>theta:#迭代的终止条件k+=1p=-np.array(grad_vec)#迭代X=np.array(X0)+t*pt_func=f.subs(x1,X[0]).subs(x2,X[1])t_min=zhudian(t_func)X0=np.array(X0)+t_min*pgrad_vec=grad(X0)grad_length=grad_len(grad_vec)print('grad_length',grad_length)print('坐标',X0[0],X0[1])data_x.append(X0[0])data_y.append(X0[1])print(k)#绘图fig=plt.figure()ax=axisartist.Subplot(fig,111)fig.add_axes(ax)ax.axis["bottom"].set_axisline_style("-|>",size=1.5)ax.axis["left"].set_axisline_style("->",size=1.5)ax.axis["top"].set_visible(False)ax.axis["right"].set_visible(False)plt.title(r'$Gradient\method-steepest\descent\method$')plt.plot(data_x,data_y,label=r'$f(x_1,x_2)=x_1^2+2\cdotx_2^2-2\cdotx_1\cdotx_2-2\cdotx_2$')plt.legend()plt.scatter(1,1,marker=(5,1),c=5,s=1000)plt.grid()plt.xlabel(r'$x_1$',fontsize=20)plt.ylabel(r'$x_2$',fontsize=20)plt.show()if__name__=='__main__':#给定初始迭代点和阈值main([0,0],0.00001)

最终结果图如下所示:

python如何实现梯度法

 </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:python如何实现梯度法的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:Windows10+anacond+GPU+pytorch安装详细过程下一篇:

10 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18