day1~简单线性回归模型学习

前言 

近期开始做关于预测模型和最优化解模型的大创,以前做数模也了解过一些,觉得是时候系统的学习学习了~身为一名才大二的超级小白,温故而知新是很有必要的,于是想在CSDN上记录学习成果!欢迎大家来和我一起讨论!

 模型建立

 先从最简单的规划模型开始。下面给出了一组数据。

xs=np.array([0.5,0.6,0.8,1.1,1.4])
ys=np.array([5.0,5.5,6.0,6.8,7.0])

最简单的预测模型:y=w0+w1x。根据已知的模型找到w0,w1,尽可能精确的描述输入和输出的关系。

单样本误差:求出y’,单样本误差为\frac{1}{2}(y'-y)^2

总样本误差:\sum \frac{1}{2}(y'-y)^2

损失函数(loss):即为总样本误差。找到w0和w1使得loss最小。这是一个三维数学模型 

下面给出了相应的求解代码~并且画出了w0,w1,loss的三维图形

import numpy as np
import matplotlib.pyplot as mp
from mpl_toolkits.mplot3d import Axes3D

xs=np.array([0.5,0.6,0.8,1.1,1.4])
ys=np.array([5.0,5.5,6.0,6.8,7.0])
n=500  #把w0,w1分割500
w0_grid,w1_grid=np.meshgrid(np.linspace(-3,10,n),
                            np.linspace(-3,10,n))
for x,y in zip(xs,ys):
    loss=(w0_grid+w1_grid*x-y)**2/2

#画图  画出每个w0,w1对应的loss,三维图
mp.figure('Loss Function',facecolor='lightgray')
ax3d = mp.gca(projection="3d")
ax3d.set_xlabel('w0')
ax3d.set_ylabel('w1')
ax3d.set_zlabel('loss')
ax3d.plot_surface(w0_grid,w1_grid,loss,
                  cstride=30,rstride=30,cmap='jet')
mp.show()

 

得到的三维图形如下

 

模型求解

得到了w0,w1,loss的关系,需要找到最小的loss对应的w0,w1输出。这里采用梯度下降公式。

我们先用二维求解(w0,y)举例:

梯度下降。先随便找一个点(w0,y),之后向最低点前进。

w1=w0±Lrate*y’  。Lrate是学习率,y’是导数,w1是w的二次取值。当导数较大时,说明离最低点较远,于是\Delta w较大,当导数较小时\Delta w较小。Lrate自己取,可调。取较高的迭代次数可以向最低值无限接近。

对于三维来说,以上的导数都变成了偏导。可以推导出相应偏导的公式(附在代码中)

#找到loss最低点对应的w0,w1,即为所求w0,w1
train_x=np.array([0.5,0.6,0.8,1.1,1.4])
train_y=np.array([5.0,5.5,6.0,6.8,7.0])
w0,w1=1,1  #随便赋初值
times=1000  #迭代1000次
lrate=0.01
for i in range(1,times+1):
    #求偏导
    d0=(w0+w1*train_x-train_y).sum()
    d1=(w1*train_x**2+train_x*w0-train_x*train_y).sum()
    #根据梯度下降公式
    w0=w0-lrate*d0
    w1=w1-lrate*d1

print('w0:',w0)
print('w1:',w1)

最后我们得到了w0,w1

w0: 4.065692318299849
w1: 2.2634176028710415

查看最终模型

最后我们画出散点图和回归线,进行预测时只需要带入就行啦。

#通过w0,w1,模型参数画出回归线
linex=np.linspace(
    train_x.min(),train_x.max(),100)
liney=w1*linex+w0

#画出x,y散点分布图及其回归线
mp.figure('Linear Regression',facecolor='lightgray')
mp.title('Linear Regression',fontsize=18)
mp.grid(linestyle=":")
mp.scatter(train_x,train_y,s=80,marker='o',
           color='dodgerblue',label='Samples')
mp.plot(linex,liney,color='orangered',
        linewidth=2,label='Regression Line')
mp.legend()
mp.show()

 结语

做大创的时候输入输出数据不止二维,并且有几百组数据,所以需要更加精确合适的模型,继续加油!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值