regression应用
1.股票预测:给定股票的历史数据,来预测股市明天的平均值
2.推荐系统:给定不同商品的特性,来预测购买某商品的可能性
3.自动驾驶:无人车上各个传感器的数据,来预测方向盘的角度
4.以及本节课重点讲解的预测宝可梦的cp值:给定进化前的cp值,物种,血量,重量等,来预测进化后的cp值
加一点自己的理解,感觉预测也可以叫判断或者计算
regression步骤
step1:model
选定一个model来进行训练,视频中选用的是线性模型,用训练资料去找一个最好的function

其实就相当于一个多元一次方程,每个元就是我们的特征,我们的目的是找到一个合适的系数。
step 2: Goodness of Function
定义模型的好坏。
判断好坏,我们可以用每个数据的预测值与真实值的差值的平方来定义模型的好坏,要是这个值越小,那么这个模型就越好,如下图。


step3 Best function 找出最好的function
我们定义了判断function的函数后,我们就可以根据这个函数来找到一个最佳值。在这个最佳值的function就是best function

视频中采用的是梯度下降法来进行求解。

首先我们对w入手,先随机选取一个w0,并计算当前的微分,就是上图中猴子站的地方的斜率,如果说斜率大于零,则往右边走,如果斜率小于0,则往左边走,走的长度我们定义为学习率,一直重复,直到找到最值 。但是这种方法有个缺点,就是找到的最值可能是局部最值而不是全局最值。

我们注意到,上图只是针对于单个变量w来进行最值寻找,但是我们的线性模型其实有多个变量。怎样求出多个变量的最值呢?

其实很简单,我们可以先求w,再求b,在视频中用一个矩阵(上图)标红的地方来表示梯度。其实梯度就是各个参数的偏微分,下图是计算方法。


下图是w和b的图形演示,下面这个图的颜色代表loss的大小。可以看红点的位置是怎么更新的。可以发现,红点一直是在往loss比较小的地方前进。

但是梯度下降最大的麻烦是可能找到局部最优值,而不是全局最优值,但是本节视频里面的线性模型不会出现这种情况

模型的验证
在视频中,采用训练集和测试集的平均误差来验证模型的好坏,如下图

测试集误差

尝试一下其他模型–一元N次模型
比如说一元二次模型

也可以尝试三次式,四次式的情况,如下图
…

过拟合

可以看到模型越复杂,在训练集的误差会减小,但是会在测试集的误差会先变小再变大,这种情况叫过拟合。
尝试优化
通过增加样本数量分析,会发现宝可梦的种类对分类的结果有影响

step1.将四个线性模型合并到一个模型中


step2. 加入更多参数,更多样本
将血量(HP)、重量(Weight)、高度(Height)也加入到模型中


结果发现还是过拟合
step3. 加入正则化

回归实现代码
import numpy as np
import matplotlib.pyplot as plt
x_data=[338.,333.,328.,207.,226.,25.,170.,60.,208.,606.]
y_data=[640.,633.,619.,393.,428.,27.,193.,66.,226.,1591.]
x=np.arange(-200,-100,1)
y=np.arange(-5,5,0.1)
z=np.zeros((len(x),len(y)))
X,Y = np.meshgrid(x,y)##生成网络点坐标矩阵
#计算loss
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
lr = 0.0000001 #learning rate
iteration = 1000000
b_history = [b]
w_history = [w]
#迭代
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]
#梯度更新
b = b - lr*b_grad
w = w - lr*w_grad
b_history.append(b)
w_history.append(w)
#plot the figure
plt.contourf(x,y,z,50,alpha=0.5,cmap=plt.get_cmap('jet'))
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)
plt.show()

发现其实没有到达最优解,我们可以尝试增大学习率试一下。
lr=0.000001,增大了10倍

再增大10倍来看看。

结果很不好,最后视频中,李老师给两个参数特质化了learning rate,来修正结果
lr_b = 0
lr_w = 0
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 + 2.0*b_grad**2
lr_w = lr_w + 2.0*w_grad**2
b = b - lr/np.sqrt(lr_b)*b_grad
w = w - lr/np.sqrt(lr_w)*w_grad
这篇博客探讨了回归分析的应用,如股票预测、推荐系统、自动驾驶和宝可梦CP值预测。通过线性模型和梯度下降法寻找最佳函数,解释了模型验证和过拟合现象。文章还展示了如何通过增加参数和正则化来优化模型,以应对过拟合问题。最后,通过代码实例展示了回归实现过程。
950

被折叠的 条评论
为什么被折叠?



