python如何实现梯度法
导读:本文共1418.5字符,通常情况下阅读需要5分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: 假设我们已经知道梯度法——最速下降法的原理。现给出一个算例:如果人工直接求解:现给出Python求解过程:importnumpyasnpfromsympyimport*importmathimportmatplotlib.pyplotaspltimportmpl_toolkits.axisartistasaxisartist#定义符号x1,x2,t... ...
音频解说
目录
(为您整理了一些要点),点击可以直达。假设我们已经知道梯度法——最速下降法的原理。
现给出一个算例:
如果人工直接求解:
现给出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)
最终结果图如下所示:
</div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:
python如何实现梯度法的详细内容,希望对您有所帮助,信息来源于网络。