课程连接:李宏毅机器学习——回归演示html
下载安装命令 ## CPU版本安装命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/cpu paddlepaddle ## GPU版本安装命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/gpu paddlepaddle-gpu
李宏毅老师用了一个比较易懂的demo例子来说解咱们在实际中作regression的时候会遇到哪些困难,咱们如何解决,如下是李老师在课堂上的详细demo课程。python
一.matplotlib是基于Python语言的开源项目,旨在为Python提供一个数据绘图包。数组
import numpy as np import matplotlib.pyplot as plt
二.traning data
# traning data x_data = [338.,333.,328.,207.,226.,25.,179.,60.,208.,606.] y_data = [640.,633.,619.,393.,428.,27.,193.,66.,226.,1591] #y_data = b + w * x_data
arange(a,b,c) 参数分别表示开始值,结束值,步长app
zeros数组:全零数组,元素全为零。
ones数组:全1数组,元素全为1。
empty数组:空数组,元素全近似为0。机器学习
a = np.array([1,2,3])
b = np.array([7,8])
res = np.meshgrid(a,b)
返回list,有两个元素,第一个元素是X轴的取值,向量a两行,第二个元素是Y轴的取值,向量b三列
返回结果: X=array([ [1,2,3],[1,2,3] ]), Y=array([ [7,7,7],[8,8,8] ])
(1,7)(2,7)(3,7)
(1,8)(2,8)(3,8)ide
x = np.arange(-200,-100,1)#bias y = np.arange(-5,5,0.1)#weight Z = np.zeros((len(x), len(y))) X, Y = np.meshgrid(x,y) for i in range(len(x)): for j in range(len(y)): b = x[i] w = y[j] Z[j][i] = 0 for n in range(len(x_data)): Z[j][i] = Z[j][i] + (y_data[n] - b - w*x_data[n])**2 Z[j][i] = Z[j][i]/len(x_data) b = -120#initial b w = -4#initial w lr = 0.00000001 #learning rate #lr = 0.000001 #learning rate2 #lr = 0.00001 #learning rate3 #lr = 1 #learning rate4 iteration = 100000 #store initial values for plotting. b_history = [b] w_history = [w] #lr_b=0 #lr_w=0 #iterations for i in range(iteration): b_grad = 0.0#偏微分 w_grad = 0.0 for n in range(len(x_data)): b_grad = b_grad - 2.0*(y_data[n] - b - w*x_data[n])*1.0 w_grad = w_grad - 2.0*(y_data[n] - b - w*x_data[n])*x_data[n] lr_b=lr_b+b_grad**2 lr_w=lr_w+w_grad**2 # update parameters_1 b = b - lr * b_grad w = w - lr * w_grad # update parameters_2 #b = b - lr/np.sqrt(lr_b) * b_grad #w = w - lr/np.sqrt(lr_w) * w_grad #store parameters for plotting b_history.append(b) w_history.append(w)
隐式建立figure对象
当第一次执行plt.xxx()画图代码时,系统会去判断是否已经有了figure对象,若是没有,系统会自动建立一个figure对象,而且在这个figure之上,自动建立一个axes坐标系(注意:默认建立一个figure对象,一个axes坐标系)。
也就是说,若是咱们不设置figure对象,那么一个figure对象上,只能有一个axes坐标系,即咱们只能绘制一个图形。函数matplotlib.pyplot contourf
函数原型:
coutour([X, Y,] Z,[levels], **kwargs)
是来绘制等高线的,contour和contourf都是画三维等高线图的,不一样点在于contour() 是绘制轮廓线,contourf()会填充轮廓。除非另有说明,不然两个版本的函数是相同的。学习plt.plot
plt.plot()函数的本质就是根据点链接线。根据x(数组或者列表) 和 y(数组或者列表)组成点,而后链接成线。字体
plt.xlim
函数功能:设置x轴的数值显示范围。
调用签名:plt.xlim(xmin, xmax)
xmin:x轴上的最小值
xmax:x轴上的最大值code显示图形
plt.show()或figure.show()若是在pycharm中绘图的话,必需要加这句代码,才能显示。若是在notebook中进行绘图,能够不用加这句代码,而是自动显示。
plt.contourf(x,y,Z,50,alpha=0.5, cmap=plt.get_cmap('jet')) #坐标:[-188.4],[2.67],color:线条颜色 plt.plot([-188.4],[2.67],'x', ms=12, markeredgewidth=3, color='orange') plt.plot(b_history,w_history,'o-', ms=3, lw=1.5, color='black') plt.xlim(-200,-100) plt.ylim(-5,5) #设置横纵坐标的名称以及对应字体格式 plt.xlabel(r'$b$', fontsize =16) plt.ylabel(r'$w$', fontsize =16)
七.通过100000次update以后,如今获得的参数离最佳点依旧有很大距离,learning rate过小。
八.放大learning rate = 0.000001(修改16行lr的值,再运行下面的可视化代码)
plt.contourf(x,y,Z,50,alpha=0.5, cmap=plt.get_cmap('jet')) #坐标:[-188.4],[2.67],color:线条颜色 plt.plot([-188.4],[2.67],'x', ms=12, markeredgewidth=3, color='orange') plt.plot(b_history,w_history,'o-', ms=3, lw=1.5, color='black') plt.xlim(-200,-100) plt.ylim(-5,5) #设置横纵坐标的名称以及对应字体格式 plt.xlabel(r'$b$', fontsize =16) plt.ylabel(r'$w$', fontsize =16)
九.发现与最佳点还有一大段距离,继续增大learning rate的值,令lr= 0.00001,修改之后可视化查看效果
plt.contourf(x,y,Z,50,alpha=0.5, cmap=plt.get_cmap('jet')) #坐标:[-188.4],[2.67],color:线条颜色 plt.plot([-188.4],[2.67],'x', ms=12, markeredgewidth=3, color='orange') plt.plot(b_history,w_history,'o-', ms=3, lw=1.5, color='black') plt.xlim(-200,-100) plt.ylim(-5,5) #设置横纵坐标的名称以及对应字体格式 plt.xlabel(r'$b$', fontsize =16) plt.ylabel(r'$w$', fontsize =16)
十.这时候咱们发现learning过大,致使数据超出图。
解决办法:给b,w都设置一个learning rate,给他们不同的learning rate
具体修改方法:20,29,30,51,52行代码注释去掉,46,47,行代码用#注释
再运行可视化结果
plt.contourf(x,y,Z,50,alpha=0.5, cmap=plt.get_cmap('jet')) #坐标:[-188.4],[2.67],color:线条颜色 plt.plot([-188.4],[2.67],'x', ms=12, markeredgewidth=3, color='orange') plt.plot(b_history,w_history,'o-', ms=3, lw=1.5, color='black') plt.xlim(-200,-100) plt.ylim(-5,5) #设置横纵坐标的名称以及对应字体格式 plt.xlabel(r'$b$', fontsize =16) plt.ylabel(r'$w$', fontsize =16)
我在AI Studio上得到黄金等级,点亮6个徽章,来互关呀~
下载安装命令 ## CPU版本安装命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/cpu paddlepaddle ## GPU版本安装命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/gpu paddlepaddle-gpu