【Python】梯度下降法可视化学习过程记录(matplotlib绘制三维图形、ipywidgets包的使用等)

您所在的位置:网站首页 曲面图形怎么画图 【Python】梯度下降法可视化学习过程记录(matplotlib绘制三维图形、ipywidgets包的使用等)

【Python】梯度下降法可视化学习过程记录(matplotlib绘制三维图形、ipywidgets包的使用等)

2023-12-15 22:35| 来源: 网络整理| 查看: 265

一、学习“梯度下降法”

1、推荐学习链接:(简书)深入浅出–梯度下降法及其实现

2、结合链接中代码补充代码(主要添加了绘图)如下:

import numpy as np import matplotlib.pyplot as plt # Size of the points dataset. m = 20 # Points x-coordinate and dummy value (x0, x1). X0 = np.ones((m, 1)) X1 = np.arange(1, m+1).reshape(m, 1) X = np.hstack((X0, X1)) # Points y-coordinate y = np.array([ 3, 4, 5, 5, 2, 4, 7, 8, 11, 8, 12, 11, 13, 13, 16, 17, 18, 17, 19, 21 ]).reshape(m, 1) ''' plt.plot(X1,y) plt.show() plt.scatter(X1,y) plt.show() ''' # The Learning Rate alpha. alpha = 0.01 def error_function(theta, X, y): '''Error function J definition.(误差函数J)''' diff = np.dot(X, theta) - y return (1./2*m) * np.dot(np.transpose(diff), diff) def gradient_function(theta, X, y): '''Gradient of the function J definition..(误差函数J梯度定义,对theta求导结果)''' diff = np.dot(X, theta) - y return (1./m) * np.dot(np.transpose(X), diff) def gradient_descent(X, y, alpha): '''Perform gradient descent.''' theta = np.array([1, 1]).reshape(2, 1) gradient = gradient_function(theta, X, y) #梯度下降最快的方向 while not np.all(np.absolute(gradient) e or abs(a*Partial_derivative_fy(x1,x2))>e : x1=x1-a*Partial_derivative_fx(x1,x2) x2=x2-a*Partial_derivative_fy(x1,x2) k=k+1 u.append(x1) v.append(x2) w.append(function(x1,x2)) print(x1,x2) print(k,'次',function(x1,x2)) #print(u,v) U = np.array(u) V = np.array(v) W = np.array(w) #画图 fig = plt.figure() #ax = fig.add_subplot(111, projection='3d') ax = Axes3D(fig) X = np.arange(-10, 10, 0.2) Y = np.arange(-10, 10, 0.2) X, Y = np.meshgrid(X, Y) Z = (X-2)**2+2*(Y-1)**2 ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='rainbow') plt.show() #画线 ax.scatter(U,V,W,color = 'yellow') ax.plot(U,V,W,color = 'black') plt.show()

在这里插入图片描述

2、绘制“对比不同学习率收敛速度差异图”的代码

import matplotlib.pyplot as plt from matplotlib import cm from mpl_toolkits.mplot3d import Axes3D import numpy as np import random plt.ion() fig = plt.figure() ax = fig.gca(projection='3d') # Make data. X = np.arange(-4, 4, 0.05) Y = np.arange(-2, 4, 0.05) X, Y = np.meshgrid(X,Y) #原式 Z=(X-2)*(X-2)+2*(Y-1)*(Y-1) #原函数 分开定义 def Fun(x,y): x=x-2 y=y-1 x=np.multiply(x,x) y=np.multiply(y,y) y=y*2 return x+y #偏x导 def PxFun(x,y): return 2*x-4 #偏y导 def PyFun(x,y): return 4*y-4 #代码实现 def steep(x,y,e,ax): flag = 1 k = 0 while(flag): z1 = Fun(x,y) x = x - a*PxFun(x,y) y = y - a*PyFun(x,y) z2 = Fun(x,y) if(abs(z1-z2)100): break plt.pause(0.01) e = 10**(-20) a = 0.03 surf = ax.plot_surface(X, Y, Z, cmap="rainbow") ax.set_zlim(0,25) fig.colorbar(surf, shrink=0.5, aspect=5) for i in range(3): x = random.randint(-1,4) y=random.randint(-1,4) steep(x,y,e,ax) plt.show() A=np.array([0.02,0.04,0.06]) for a in [0.02,0.04,0.06]: x=1 y=3 flag = 1 k = 0 tag_z=[Fun(x,y)] tag_k=[0] while(flag): z1 = Fun(x,y) x = x - a*PxFun(x,y) y = y - a*PyFun(x,y) z2 = Fun(x,y) tag_z.append(z2) if(abs(z1-z2)50): break plt.plot(tag_k,tag_z) plt.title('Objective function,Iterations') plt.xlabel('Iterations') plt.ylabel('Objective function') plt.legend(['a=0.02','a=0.04','a=0.06']) plt.show()

在这里插入图片描述 //2019.11.4更新补充

四、补充一些小技巧

1、在Spyter中图像单独显示的技巧 进行如下设置: tools——preferences——ipython console——graphics中backend改成automatic或者QT5 设置之后记得重启软件,之后显示的图片就是这样的了: 在这里插入图片描述

2、在Jupyter Notebook中显示单独显示图像界面(Spyter亦可)

在代码中加入语句: %matplotlib auto 或者 %matplotlib qt

若写%matplotlib inline 的图片将不会单独弹出



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3