最简单的线性回归模型-标量

news/2024/11/29 7:42:41/

  首先考虑yyy为标量,www为标量的情况,那么我们的线性函数为y=wx+by=wx+by=wx+b。每批输入的量batch size 为111,每批输入的xxx为一个标量,设为x∗x^*x,标签yyy同样为一个标量,设为y∗y^*y。因此每批训练的损失函数LLL可以表示为:
L=(y−y∗)2=(wx∗+b−y∗)2\begin{aligned} L&=\left(y-y^*\right)^2\\ &=\left(wx^*+b-y^*\right)^2\\ \end{aligned} L=(yy)2=(wx+by)2
  每次训练完需要更新参数wwwbbb,我们采用梯度下降方法对这两个参数进行更新的话,需要求出两个参数的梯度,也就是需要求出∂L∂w\frac{\partial{L}}{\partial{w}}wL∂L∂b\frac{\partial{L}}{\partial{b}}bL,结果如下:
∂L∂w=2(wx∗+b−y∗)x∗\frac{\partial{L}}{\partial{w}}=2(wx^*+b-y^*)x^* wL=2(wx+by)x
∂L∂b=2(wx∗+b−y∗)\frac{\partial{L}}{\partial{b}}=2(wx^*+b-y^*) bL=2(wx+by)
训练之前需要对wwwbbb初始化赋值,设定步长stepstepstep。这样每轮wwwbbb的更新方法为:
wnew=w−step∗2(wx∗+b−y∗)x∗w_{new}=w-step*2(wx^*+b-y^*)x^*wnew=wstep2(wx+by)x
bnew=b−step∗2(wx∗+b−y∗)b_{new}=b-step*2(wx^*+b-y^*)bnew=bstep2(wx+by)
首先考虑yyy为标量,www为标量的情况,那么我们的线性函数为y=wx+by=wx+by=wx+b。每批输入的量batch size 为NNN,每批输入的xxx为一个向量,设为x∗\boldsymbol{x}^*x,标签yyy同样为一个向量,设为y∗\boldsymbol{y}^*y。因此损失函数可以表示为:
L=∑n=1N(y−y∗)2=∑n=1N(y−y∗)2\begin{aligned} L&=\sum_{n=1}^{N}\left(y-y^*\right)^2\\ &=\sum_{n=1}^{N}\left(y-y^*\right)^2\\ \end{aligned} L=n=1N(yy)2=n=1N(yy)2
下面我们对这种最简单的线性回归模型使用python实现一下:

x = np.array([0.1,1.2,2.1,3.8,4.1,5.4,6.2,7.1,8.2,9.3,10.4,11.2,12.3,13.8,14.9,15.5,16.2,17.1,18.5,19.2])
y = np.array([5.7,8.8,10.8,11.4,13.1,16.6,17.3,19.4,21.8,23.1,25.1,29.2,29.9,31.8,32.3,36.5,39.1,38.4,44.2,43.4])
print(x,y)
plt.scatter(x,y)
plt.show()

在这里插入图片描述
回归过程如下:

# 设定步长
step=0.001
# 存储每轮损失的loss数组
loss_list=[]
# 定义epoch
epoch=30
# 定义参数w和b并初始化
w=0.0
b=0.0
#梯度下降回归
for i in range(epoch) :#计算当前输入x和标签y的索引,由于x和y数组长度一致,因此通过i整除x的长度即可获得当前索引index = i % len(x)# 当前轮次的x值为:cx=x[index]# 当前轮次的y值为:cy=y[index]# 计算当前lossloss_list.append((w*cx+b-cy)**2)# 计算参数w和b的梯度grad_w = 2*(w*cx+b-cy)*cxgrad_b = 2*(w*cx+b-cy)# 更新w和b的值w -= step*grad_wb -= step*grad_b

输出loss如下:

plt.plot(loss_list)
plt.show()

在这里插入图片描述
输出拟合函数的结果:

print("y=%.2fx+%.2f" %(w,b))
y=2.46x+0.39

拟合的函数图像与训练数据中的点关系图如下:
在这里插入图片描述
可以看到迭代30次后的函数图像,现在迭代次数增加到3000,拟合结果如下:
在这里插入图片描述
loss如下:
在这里插入图片描述

在batchsize为1的时候,loss波动很大。因此有必要增大batchsize,下一篇我们在此基础上增加batchsize看看线性回归的结果。


http://www.ppmy.cn/news/30355.html

相关文章

28个案例问题分析---019---单表的11个Update接口--MyBatis

一:背景介绍 项目开发中。我们使用的是MyBatis,在MyBatis的xml文件里,两个表的更新功能,写了足足11个更新接口,毫无复用的思想 这种方式可以正常的实现功能,但是没有复用,无论是从时间上还是维…

CDH大数据平台入门篇之搭建与部署

一、CDH介绍 1.CDH 是一个强大的商业版数据中心管理工具 提供了各种能够快速稳定运行的数据计算框架,如Spark; 使用Apache Impala做为对HDFS、HBase的高性能SQL查询引擎; 使用Hive数据仓库工具帮助用户分析数据; 提供CM安装HBas…

SCI期刊收不收费也有门道,你知道吗?

什么是OA期刊? OA期刊是在互联网上在线出版的学术刊物,英文全称是OpenAccess Journal,中文译为“开放存取期刊”。OA期刊不同于传统的学术期刊如《自然》、《科学》等,采取的是向读者收费的运营模式,读者只有付费订阅&#xff0…

jconsole远程linux下的tomcat

修改Tomcat的配置 进去 Tomcat 安装目录下的 bin 目录,编辑 catalina.sh vi catalina.sh定位到 ----- Execute The Requested Command ----------------------------------------- vi 编辑模式下,点击 Esc,输入 / ,然后粘贴 -…

java面试八股文之------Redis夺命连环25问

java面试八股文之------Redis夺命连环25问👨‍🎓1.为什么redis这么快👨‍🎓2.redis的应用场景,为什么要用👨‍🎓3.redis6.0之前为什么一直不使用多线程,6.0为甚么又使用多线程了&…

CS:GO头号特训添加bot + CS:GO控制台指令大全

CS:GO头号特训添加bot CS:GO控制台指令大全 我是艾西,在我们玩csgo时总是会有一些自己的下想法以及想和小伙伴们一起玩的快乐,今天我跟大家简单的说一下头号特训 头号特训模式下单人或多人跑图的相关指令,帮助玩家熟悉头号特训的玩法、特殊道…

SpringBoot自动装配原理、条件注解及封装Starter

1.什么是 SpringBoot 自动装配? 我们现在提到自动装配的时候,一般会和Spring Boot联系在一起。但是实际上SpringFramework 早就实现了这个功能。Spring Boot 只是在其基础上,通过 SPI 的方式,做了进一步优化。 SpringBoot 定义了…

顺序表以及链表的应用及区别(包含OJ讲解)

前面我已经发过怎么实现链表以及顺序表,今天大概的总结一下。 顺序表: 1.能够随时的存取,比较方便。 2.插入删除时,需要挪动数据,比较麻烦,因为是连续存储。 3.存储密度相对于链表来说是比较高的&#…