时间序列预测(一)——线性回归(linear regression)

目录

一、原理与目的

1、线性回归基于两个的假设:

2、线性回归的优缺点:

3、线性回归的主要目的是:

二、损失函数(loss function)

1、平方误差损失函数(忽略了噪声误差)

2、均方误差损失函数

三、随机梯度下降(通过不断地在损失函数递减的方向上更新参数来降低误差。)

四、代码实现


参考文章:

机器学习—线性回归算法(Linear Regression)-CSDN博客

《动手学深度学习》 — 动手学深度学习 2.0.0 documentation (d2l.ai)

4.机器学习-十大算法之一线性回归算法(LinearRegression)案例讲解-CSDN博客

在介绍之前,有几个概念:

假如要根据一个包含道路曲率(Curvature)、车速(Velocity)、侧向加速度(Ay)和方向盘转角(Steering_Angle)真实的数据集去预测未来的方向盘转角。

(1)数据集(data set):   一般来说,一个完整的数据集应该包括训练集、测试集和验证集。通常,数据集会被划分为训练集和测试集,比如将数据集的70%用作训练集,30%用作测试集。在进行训练时,可以使用交叉验证的方法将训练集再次划分为训练子集和验证子集,用于模型的训练和验证。

  • 训练集:用于训练机器学习模型的数据集。模型通过学习训练集中的数据特征和规律,来构建预测或分类的模型。
  • 测试集:用于评估机器学习模型性能的数据集。通过将模型应用于测试集,可以衡量模型的准确性、鲁棒性等性能指标。
  • 验证集(可选):在训练过程中,用于调整模型参数和选择最佳模型的数据集。验证集可以帮助我们在训练过程中避免过拟合或欠拟合的问题。

(2)标签(label)或目标(target):预测的目标(因变量),即预测方向盘转角

(3)特征(feature)或协变量(covariate):预测所依据的自变量,即道路曲率、车速和侧向加速度

时间序列预测中的线性回归是一种常用的方法,它基于时间序列数据之间的线性关系进行预测。以下是对时间序列预测中线性回归的详细解释:

一、原理与目的

1、线性回归基于两个的假设:
  1. 线性关系假设
    • 内容:自变量 x(一个或多个)和因变量 y 之间的关系是线性的。这意味着,存在一个或多个系数(包括一个常数项或截距),使得 y 可以表示为 x 的线性函数。
    • 数学表达:对于单变量线性回归,可以表示为 y=​W1​x+b+ϵ,其中W1 是权重,b是偏置,ϵ 是误差项。对于多变量线性回归,则形式为 y=W1x1​+W1x2​+⋯+Wn​xn​+b+ϵ。
  2. 正态分布假设(或称为误差项的正态分布):
    • 内容:任何噪声(即误差项 ϵ)都遵循正态分布(也称为高斯分布)。这意味着误差项是随机的,且其分布是对称的,有一个均值(通常为零)和一个方差。
    • 数学表达:误差项 ϵ 服从正态分布,即 ϵ∼N(0,σ2),其中 σ2 是方差。
2、线性回归的优缺点:
  1. 优势

    • 线性回归模型简单明了,易于理解和实现。
    • 线性回归的计算过程相对简单,计算效率高,可以快速得到预测结果。
  2. 缺点

    • 线性回归只能处理线性关系,对于非线性关系的数据可能效果不佳。
    • 线性回归没有考虑时间序列数据中的时间依赖性,因此在处理序列数据时可能表现不佳。
3、线性回归的主要目的是:

找到一组权重向量w和偏置b,拟合一个线性模型,当给定新的x时,这组权重向量和偏置能够使得新样本预测对应的 y 值。

在开始寻找最好的模型参数(model parameters)w和b之前,我们还需要两个东西:

(1)一种模型质量的度量方式——损失函数;

(2)一种能够更新模型以提高模型预测质量的方法——随机梯度下降。

二、损失函数(loss function)

损失函数(loss function)能够量化目标的实际值与预测值之间的差距。通常我们会选择非负数作为损失,且数值越小表示损失越小,完美预测时的损失为0。

1、平方误差损失函数(忽略了噪声误差)

回归问题中最常用的损失函数是平方误差函数。

当样本i的预测值为ˆy(i),其相应的真实标签为y(i)时,平方误差可以定义为以下公式:

其中,常数1/2其实是没什么用的,只是这样在形式上稍微简单一些(当对损失函数求导后常数系数为1)

为了度量模型在整个数据集上的质量,需计算在训练集n个样本上的损失均值(也等价于求和)。

最后就是,找一组参数(w∗, b∗),这组参数能最小化L(w, b).

2、均方误差损失函数

均方误差损失函数(简称均方损失)可以用于线性回归的一个原因是:假设了观测中包含噪声,其中噪声服从正态分布

这里用到极大似然估计法,单个数据y的似然:

整个数据集的似然:

最后就是确定参数w和b是使整个数据集的似然最大。

化解一下

第一项没有参数w和b,最终是求w和b使第二项的值最小。

三、随机梯度下降(通过不断地在损失函数递减的方向上更新参数来降低误差。)

梯度下降最简单的用法是计算损失函数(数据集中所有样本的损失均值)关于模型参数的导数(在这里也可以称为梯度)。但因为每一次必须遍历整个数据集,执行可能会非常慢。因此,通常在每次计算更新时随机抽取一小批量B样本。

具体计算过程:(这里是只针对平方误差损失函数,均方误差同理)

(1)随机抽样一个小批量B(这也称为批量大小(batch size)),

(2)计算小批量的平均损失关于模型参数(即w和b)的偏导数(也可以称为梯度)

(3)将梯度乘以一个预先确定的正数η(η表示学习率(learning rate)),并从当前参数的值(即w和b)中减掉。

公式如下:(∂表示偏导数)

这里还有四个概念:

超参数:指可以手动预先调整但不在训练过程中更新的参数,如此时的批量大小和学习率

泛化:指模型能够适应新的、未知的数据的能力。如,找到一组参数,这组参数能够在从未见过的数据上实现较低的损失,说明泛化能力较强。

矢量化:指将算法从一次操作一个数据值转换为一次操作一组数据值的过程。这一技术可以显著提高数据处理的效率。例如:计算a+b,其中a、b中各有100个值,一种是用for循环计算每一个值,一种是直接a向量和b向量相加计算,后者即矢量化。

全连接层/稠密层:每个神经元都与上一层的所有神经元相连。对于线性回归,每个输入都与每个输出(在本例中只有一个输出)相连。

四、代码实现

根据一个包含道路曲率(Curvature)、车速(Velocity)、侧向加速度(Ay)和方向盘转角(Steering_Angle)真实的数据集,去预测未来的方向盘转角。

1、先将需要的库导入


# 导入三个常用的数据处理和可视化库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 从sklearn库中导入线性回归模型
from sklearn.linear_model import LinearRegression
# 从sklearn库中导入train_test_split函数。train_test_split函数用于将数据集划分为训练集和测试集
from sklearn.model_selection import train_test_split
# 引入mean_absolute_error对线性回归进行评估
from sklearn.metrics import mean_absolute_error as mae

2、编写模型主体:

# 1. 数据预处理
# 读取数据  
data = pd.read_excel('input_data_20241010160240.xlsx')  # 替换为你的数据文件路径  
  
# 提取特征和标签  
labels = data['Steering_Angle']
features = data[['Curvature','Ay', 'Velocity']]  # 注意这里使用了列表来提取多列  

# 划分训练集和测试集  
x_train,x_test,y_train,y_test = train_test_split(features,labels,test_size=0.2)
# 其中,features表示特征数据,target表示目标数据,test_size=0.2表示将20%的数据作为测试集,剩余的80%作为训练集。划分后的训练集和测试集分别赋值给变量x_train、x_test、y_train和y_test。


# 创建模型
liner = LinearRegression()
liner.fit(x_train,y_train)

# 获取权重和偏置
weights = liner.coef_  
bias = liner.intercept_  
  
# 打印权重和偏置  
print(f"Weights: {weights}")  
print(f"Bias: {bias}")  

# 预测
y_pred = liner.predict(x_test)

# 得分(R^2 score),回归的得分一般表示模型对数据的拟合程度,越接近1越好  
score = liner.score(x_test, y_test)  
print(f"R^2 score: {score}")  

# 评估指标
# 计算线性回归模型在测试集上的平均绝对误差(Mean Absolute Error,MAE) ,平均绝对误差越小,模型的预测精度越高。 
mae = mae(y_test, y_pred)  
print(f"Mean Absolute Error: {mae}")

# 支持中文
plt.rcParams['font.sans-serif'] = ['SimSun']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

# 绘制实际值和预测值的对比图  
plt.figure(figsize=(10, 6))  
plt.plot(range(len(y_test)), y_test, label='实际值', color='blue')  
plt.plot(range(len(y_pred)), y_pred, label='预测值', color='red')  
plt.xlabel('样本索引')  
plt.ylabel('Steering Angle')  
plt.title('实际值与预测值对比图')  
plt.legend()  
plt.grid(True)  
plt.show()

3、输出结果:(可以看到训练效果比较好,因为毕竟侧向加速度和方向盘转角有直接的关系)

至此结束。

别忘了给这篇文章点个赞哦,非常感谢。我也正处于学习的过程,如果有问题,欢迎在评论区留言讨论,一起学习!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/890042.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微服务实战——登录(普通登录、社交登录、SSO单点登录)

登录 1.1. 用户密码 PostMapping("/login")public String login(UserLoginVo vo, RedirectAttributes redirectAttributes, HttpSession session){R r memberFeignService.login(vo);if(r.getCode() 0){MemberRespVo data r.getData("data", new Type…

英伟达股价分析:英伟达股价能否上涨到150美元,接下来该如何操作?

来源:猛兽财经 作者:猛兽财经​ 猛兽财经核心观点: (1)华尔街投行Oppenheimer已将英伟达的目标价上调到了150美元。 (2)产品方面的最新进展和合作伙伴关系进一步提升了英伟达的市场地位。 &…

Nacos配置管理和Nacos集群配置

目录 Nacos作为配置中心实现配置管理 统一配置管理 如何在nocas添加配置文件 在微服务拉取nacos配置中心的配置 1)引入nacos-config依赖 2)添加bootstrap.yaml 3)测试,读取nacos配置中心中配置文件的内容 ​编辑 总结&…

ORA-65096:公用用户名或角色名无效

CREATE USER DATA_SHARING IDENTIFIED BY "Ab2"; Oracle建立用户的的时候,可能会出现一直提示 ORA-65096:公用用户名或角色名无效; 我查了一下,好像是 oracle 12版本及以上版本的特性,用户名必须加c##或者C##前缀才能创…

拆解学习【反激-PD-氮化镓】(一)

小米67W桌面快充插座: 反激基本拓扑: 商用场景下,这个拓扑进行了如下优化: 1.Q22换成了氮化镓开关管,当然需要适配的能驱动氮化镓的控制芯片 2.D21二极管换成了MOS管。 3.由于是AC220V输入,设计了整流桥…

Android Camera系列(四):TextureView+OpenGL ES+Camera

别人贪婪时我恐惧,别人恐惧时我贪婪 Android Camera系列(一):SurfaceViewCamera Android Camera系列(二):TextureViewCamera Android Camera系列(三):GLSur…

【Nginx系列】Nginx启动失败

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

轻量服务器和云服务器ecs哪个好用一些?

轻量服务器和云服务器ecs哪个好用一些?轻量服务器与云服务器ECS在多方面存在显著差异,对于需要高性能计算和大规模数据处理的用户来说,ECS可能是更好的选择;而对于预算有限且需求较为简单的用户来说,轻量服务器可能更为…

Cpp::STL—list类的模拟实现(上)(13)

文章目录 前言一、结点类的实现二、迭代器类的实现迭代器类的存在意义迭代器类的模板参数构造函数运算符的重载--运算符的重载、!运算符的重载*运算符的重载->运算符的重载 总结 前言 注意本篇难度偏高,其主要体现在迭代器类的实现!   什么&#xf…

QD1-P8 HTML 格式化标签(font、pre、b、strong、i、u、del、s、sub、sup)

本节学习&#xff1a;HTML 格式化标签。 本节视频 www.bilibili.com/video/BV1n64y1U7oj?p8 ‍ 一、font 标签 用途&#xff1a;定义文本的字体大小、颜色和 face&#xff08;字体类型&#xff09;。 示例 <!DOCTYPE html> <html><head><meta cha…

JAVA-数据结构-排序

1.直接插入排序 1.原理&#xff1a;和玩扑克牌一样&#xff0c;从左边第二个牌开始&#xff0c;选中这个&#xff0c;和前面的所有牌比较&#xff0c;插在合适的位置 public static void insertsort(int[] arr){//直接插入排序for (int i 1; i < arr.length; i) {//此循环…

LOID:有效提升遮挡条件下的车道检测精度

1.论文信息 论文标题&#xff1a;LOID: Lane Occlusion Inpainting and Detection for Enhanced Autonomous Driving Systems 作者&#xff1a;Aayush Agrawal, Ashmitha Jaysi Sivakumar, Ibrahim Kaif∗, Chayan Banerjee† 作者单位&#xff1a;印度马德拉斯印度理工学院&…

Web安全 - 路径穿越(Path Traversal)

文章目录 OWASP 2023 TOP 10导图定义路径穿越的原理常见攻击目标防御措施输入验证和清理避免直接拼接用户输入最小化权限日志监控 ExampleCode漏洞代码&#xff1a;路径穿越攻击案例漏洞说明修复后的安全代码代码分析 其他不同文件系统下的路径穿越特性Windows系统类Unix系统&a…

【C++】基于红黑树封装set和map

&#x1f680;个人主页&#xff1a;小羊 &#x1f680;所属专栏&#xff1a;C 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 前言一、更高维度的泛型二、模版参数三、比较逻辑的重写四、迭代器4.1 const迭代器4.2 重载4.3 - -重载 五、完整代…

为什么很多人宁愿加钱买港版,也不愿买国行 iPhone 16

最近的 iPhone 16 市场&#xff0c;真的是倒反天罡&#xff0c;攻守异形啊。 过去&#xff0c;港版 iPhone 都是性价比的次选&#xff0c;便宜个 10% 都得考虑考虑。但今年&#xff0c;港版 iPhone 16 的价格&#xff0c;反而比国行还贵。 比如&#xff0c;闲鱼上某个卖家&am…

[红队apt]文件捆绑攻击流程

免责声明:本文用于了解攻击者攻击手法&#xff0c;切勿用于不法用途 前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文整理黑客通过文件捆绑进行攻击的流程思路 文件捆绑原理 废话只多说这一句。 1.exe和2.exe被你捆绑为3.exe。 那么你点击了3.exe就等于点…

kafka消息队列核心内容及常见问题

目录 1. 使用消息队列的目的&#xff08;优点与缺点&#xff09; 2. 常见各消息队列对比 3. kafka介绍 3.1 kafka简介 3.2 kafka特点 3.3 kafka系统架构 3.4 设置数据可靠性 3.4.1 Topic 分区副本 3.4.2 消息确认机制 4. 常见问题&#xff08;面试题&#xff09; 4.…

Acwing 排序

1.快速排序 主要思想&#xff1a;基于分治思想。通过选择一个基准元素&#xff0c;将数组分为两部分&#xff0c;左边部分元素都小于等于基准&#xff0c;右边部分元素都大于等于基准。然后对这两部分分别递归地进行排序。 分区逻辑&#xff1a;双指针算法 左指针i从左往右找…

《RabbitMQ篇》消息应答和发布确认

消息应答 消息应答机制&#xff1a;消费者接收信息并处理完之后&#xff0c;告诉rabbitmq该信息已经处理&#xff0c;rabbitmq可以把该信息删除了. 消息自动重新入队&#xff1a;如果处理某个消息的消费者异常关闭了&#xff0c;没有发送ACK确认&#xff0c;rabbitmq会将其重…

金九银十软件测试面试题(800道)

今年你的目标是拿下大厂offer&#xff1f;还是多少万年薪&#xff1f;其实这些都离不开日积月累的过程。 为此我特意整理出一份&#xff08;超详细笔记/面试题&#xff09;它几乎涵盖了所有的测试开发技术栈&#xff0c;非常珍贵&#xff0c;人手一份 肝完进大厂 妥妥的&#…