首页 > 其他分享 >时间序列预测(一)——线性回归(linear regression)

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

时间:2024-10-12 19:22:44浏览次数:11  
标签:误差 plt linear 模型 损失 test 线性 regression

目录

一、原理与目的

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

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

二、损失函数(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、线性回归的主要目的是:

找到一组权重向量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、输出结果:(可以看到训练效果比较好,因为毕竟侧向加速度和方向盘转角有直接的关系)

至此结束。

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

标签:误差,plt,linear,模型,损失,test,线性,regression
From: https://blog.csdn.net/qq_47885795/article/details/142858744

相关文章

  • YOLOv11改进 | 独家创新- 注意力篇 | YOLOv11引入GAM和LinearAttention结合之LGAM注意
    1.LGAM介绍     LGAM(LinearGlobalAttentionModule)和GAM(GlobalAttentionModule)是两种用于图像特征提取的注意力机制。它们在设计上有一些显著的差异,这使得LGAM在某些方面比GAM更具优势。     LGAM的设计与改进:    (1).线性注意力机制的引......
  • 线性代数--矩阵
    矩阵代表一张树表m*n行数不一定等于列数A=(a11⋯a1n⋮⋱⋮am1⋯amn)同型矩阵有前提:AB行数相等列数相等A34B34矩阵相等同型矩阵并且对应的元素相等零矩阵所有元素均为0两个零矩阵一定相等是错误的:矩阵相等的前提是同型矩阵特殊矩阵方阵:行数===列数也有主对角线......
  • 5.5求非凸函数的线性规划问题
    importnumpyasnpfromscipy.optimizeimportminimizedefobjective(x):return2*x[0]+3*x[0]**2+3*x[1]+x[1]**2+x[2]defconstraint1(x):return10-(x[0]+2*x[0]**2+x[1]+2*x[1]**2+x[2])defconstraint2(x):......
  • 5.4求解非凸非线性规划
    importnumpyasnpfromscipy.optimizeimportminimize#定义目标函数defobjective(x):return-np.sum(np.sqrt(x))#注意:scipy的minimize默认是最小化问题,所以这里取负号#定义约束条件constraints=[{'type':'ineq','fun':lambdax:10-x[0]}......
  • 非线性规划
    什么是非线性规划非线性规划,指约束条件中有非线性约束。非线性约束,即约束的不等式中含有高次幂项,如\(x_1^2+x_2^2\leq1\)就是一个非线性约束。matlab标准型,只能求解最小值问题,且约束条件要是小于等于的不等式matlab函数求解非线性规划[x,value]=fmincon(@f,x0,A,b,......
  • 非线性规划之飞行管理问题
    题目:在约10000m高空的某边长160km的正方形区域内,经常有若干架飞机作水平飞行。区域内每架飞机的位置和速度向量均由计算机记录其数据,以便进行飞行管理。当一架欲进入该区域的飞机到达区域边缘时,记录其数据后,要立即计算并判断是否会与区域内的飞机发生碰撞。如果会碰撞,则应计算如......
  • 线性代数-行列式
    n阶排列由1,2,...,n组成的一个有序数组(一个都不少)123,213,312,3213级排列改变顺序,不是同一个排列(有序)123...nn级标准排列(自然排列)行列式定义3阶行列式A3×3=|a11a12a13a21a22a23a31a32a33|=a11a22a33+a12a23a31+a13a21a32−a13a22a31−a12a21a33−a11a23a32行标取自然排......
  • Flutter布局(1):线性布局(Row、Column)
    所谓线性布局,即指沿水平或垂直方向排列子组件。Flutter中通过Row和Column来实现线性布局。主轴和纵轴对于线性布局,有主轴和纵轴之分,如果布局是沿水平方向,那么主轴就是指水平方向,而纵轴即垂直方向;如果布局沿垂直方向,那么主轴就是指垂直方向,而纵轴就是水平方向。一、Row组件1.1......
  • 线性回归算法(Java)
      手动实现线性回归(梯度下降法)1publicclassLinearRegressionGD{2privatedoublelearningRate;3privateintiterations;4privatedoubleslope;5privatedoubleintercept;67publicLinearRegressionGD(doublelearningRate,......
  • 【状态估计】非线性受控动力系统的线性预测器——Koopman模型预测MPC(Matlab代码实现)
     ......