基于Transformer与随机森林的多变量时间序列预测

哈喽,我不是小upper,今天和大家聊聊基于Transformer与随机森林的多变量时间序列预测。

不懂Transformer的小伙伴可以看我上篇文章:一文带你彻底搞懂!Transformer !!https://blog.csdn.net/qq_70350287/article/details/147404686?spm=1001.2014.3001.5501

在多变量时间序列预测领域,我们常常需要依据历史数据来预估多个变量在未来的取值。打个比方,在分析城市交通流量时,就涉及到多个变量,像不同路段的车流量、车速等,我们要预测这些变量未来的变化情况。

以往常用的时间序列预测方法,比如 ARIMA SARIMA ,存在一定的局限性。它们一般假定数据之间呈现线性关系,可在实际的复杂系统中,数据间的关系往往并非如此简单。现实中的数据不仅存在非线性关系,还具有长期依赖特征,就好比今天的交通流量情况可能会受到一周前特殊事件的影响,而这些传统方法很难有效捕捉到这些复杂的关系,所以在面对复杂的多变量时间序列预测任务时,效果可能不太理想 。

在当下的技术发展进程中,基于深度学习的 Transformer 和基于机器学习的随机森林(Random Forest,简称 RF)在众多任务领域得到了极为广泛的应用。这两种技术各有所长,若将它们有机结合,便能够充分发挥各自的优势,实现更出色的效果。

Transformer 模型的核心亮点在于其独特的自注意力机制。这一机制赋予了 Transformer 强大的能力,使其能够精准且高效地捕捉时间序列中的长期依赖关系。在处理如自然语言文本、金融时间序列数据这类包含复杂时间依赖信息的任务时,Transformer 可以轻松关注到序列中不同位置之间的关联,从而理解整体的语义或趋势。例如在机器翻译中,它能理解句子中相隔较远词汇之间的语法和语义联系,提升翻译的准确性。

而随机森林(RF)模型则是通过构建多棵决策树的方式来进行工作。在面对高维特征空间时,它能够进行有效的回归操作。并且,RF 模型具有很强的鲁棒性,这使得它在处理包含噪声的数据时表现出色。即使数据中存在一些干扰信息,它也能凭借自身的结构和算法,尽量减少噪声对结果的影响,给出相对可靠的预测。比如在预测房屋价格时,面对包含测量误差等噪声的数据,随机森林模型依然能较好地捕捉到房价与其他因素之间的关系。

接下来,让我们一起深入了解这两种技术结合的细节内容。

多变量时间序列预测的问题建模

  1. 滑动窗口与样本构造:在多变量时间序列预测中,我们从给定的观测序列出发,通过设定窗口长度来构建样本。这一操作的目标是为后续的模型训练提供合适的数据形式,使模型能够学习到时间序列中的规律特征
  2. 归一化与去趋势:为了让数据更适合模型训练,我们对每个变量进行 Z-score 标准化处理。这种标准化方法能够将数据转化为均值为 0标准差为 1 的标准形式,有助于提升模型的训练效果和稳定性。
  3. 变量相关性分析计算皮尔逊相关系数矩阵是分析变量之间相关性的重要手段。通过这个矩阵,我们可以判断哪些变量之间关系紧密,进而选择对预测结果有重要影响的输入变量,去除那些相关性较低的变量,提高模型的效率和预测准确性。

模型融合策略

  1. 加权平均(Weighted Averaging):这是一种直观且简单的模型融合方法,它的优点是所需的参数较少。在融合多个模型的预测结果时,为每个模型分配一个权重,然后根据这些权重对各模型的预测值进行加权求和,得到最终的预测结果。权重的选择可以通过交叉验证等方式进行调优,以达到最佳的融合效果
  2. 堆叠泛化(Stacking):该方法分为两层进行模型融合。在第一层,使用 Transformer、随机森林(RF)等不同模型分别对数据进行处理并输出预测结果。然后,在第二层使用元学习器,例如线性回归模型或小型多层感知机(MLP)。具体操作是,先通过交叉验证的方式获得第一层各个模型对验证集的预测结果,再利用这些结果来训练元学习器,使元学习器能够学习到不同模型预测结果之间的关系,从而更好地融合这些结果,提升整体的预测性能。
  3. 误差协方差分析:误差协方差分析用于评估不同模型之间的互补性。如果两个模型的误差相关性较低,说明它们在预测过程中犯错误的情况有所不同,这种情况下将它们融合,往往能获得更好的预测效果。因为不同模型可以在不同方面发挥优势,相互补充,减少整体的预测误差。

小结

模块关键组件细节要点
序列预处理滑动窗口、归一化、相关性分析利用滑动窗口构造样本,通过 Z-score 进行标准化,借助皮尔逊相关矩阵筛选特征
Transformer 编码器位置编码(PosEnc)、多头注意力、前馈神经网络(FFN)、层归一化(LayerNorm)采用正余弦位置编码,利用防未来信息掩码避免信息泄露,结合残差连接和归一化;多头注意力并行捕捉多尺度依赖关系;逐位置前馈网络增强模型的非线性表达能力
随机森林回归自助采样(Bootstrap)、分类与回归树(CART)分裂、子特征随机选择树间差异源于有放回采样和特征随机子集;回归树依据最小化节点内均方误差(MSE)进行分裂;通过平均化减少预测方差
融合策略加权平均、堆叠泛化、误差协方差分析加权平均的系数可通过交叉验证调优;堆叠泛化借助元学习器捕获二级特征;误差协方差分析揭示模型间的互补性
评估指标均方误差(MSE)、均方根误差(RMSE)、平均绝对误差(MAE)、平均绝对百分比误差(MAPE)、多变量加权评估MSE 对大误差较为敏感,MAE 更稳健,MAPE 以百分比形式呈现便于解读,多变量加权评估可综合考虑不同变量的重要性进行全面评估

在这里,我们将基于 Transformer 与随机森林的集成方法,开展多变量时间序列的预测任务。为了更便捷地展示整个过程,我们使用虚拟数据集来完成数据生成、模型训练、预测、评估等环节,同时还会生成多种可视化图形,以此深入分析模型的表现,最后给出算法的优化要点和调参流程。

1. 数据集 & 预处理

为构建一个多变量时间序列数据集,我们生成包含三个变量的虚拟时间序列数据。其中一个变量是呈周期性变化的正弦波,一个是余弦波,还有一个是添加了噪声的随机信号。具体代码如下:

# 生成虚拟多变量时间序列数据:3个变量,长度为T
import numpy as np
T = 1200  # 时间步数
t = np.arange(T)
x1 = np.sin(0.02 * t)  # 正弦波
x2 = np.cos(0.02 * t)  # 余弦波
x3 = 0.1 * np.random.randn(T)  # 高斯噪声# 数据合并,形状为(T, 3)
data = np.stack([x1, x2, x3], axis=1)

接下来,对生成的数据进行标准化处理(Z-score),使数据具有统一的尺度,便于后续模型训练。

from sklearn.preprocessing import StandardScaler
# 标准化处理(Z-score)
scaler = StandardScaler()
data_norm = scaler.fit_transform(data)  # 标准化后的数据

数据集拆分与窗口化

我们把时间序列数据拆分成滑动窗口样本,进而生成训练集和测试集。在这个过程中,我们构建特征数据X和目标数据Y

window_size = 30  # 假设窗口大小为30
horizon = 1  # 预测步长为1
X, Y = [], []
for i in range(T - window_size - horizon + 1):X.append(data_norm[i:i + window_size])  # 选择窗口内的数据Y.append(data_norm[i + window_size:i + window_size + horizon])  # 预测窗口后的数据
X = np.array(X)  # shape: (samples, window_size, features)
Y = np.array(Y).squeeze(axis=1)  # shape: (samples, features)# 划分训练集与测试集
train_ratio = 0.8
n_train = int(len(X) * train_ratio)
X_train, X_test = X[:n_train], X[n_train:]
Y_train, Y_test = Y[:n_train], Y[n_train:]# 转换为PyTorch Tensor
import torch
from torch.utils.data import TensorDataset, DataLoader
X_train_t = torch.tensor(X_train, dtype=torch.float32)
Y_train_t = torch.tensor(Y_train, dtype=torch.float32)
X_test_t = torch.tensor(X_test, dtype=torch.float32)
Y_test_t = torch.tensor(Y_test, dtype=torch.float32)train_dataset = TensorDataset(X_train_t, Y_train_t)
train_loader  = DataLoader(train_dataset, batch_size=32, shuffle=True)
可视化数据

我们先绘制数据集的原始图形,以此清晰展示三个变量的时间序列变化情况。

import matplotlib.pyplot as plt
# 可视化原始数据
plt.figure(figsize=(12, 6))
plt.plot(t, data_norm[:, 0], label='Var1', color='magenta')
plt.plot(t, data_norm[:, 1], label='Var2', color='cyan')
plt.plot(t, data_norm[:, 2], label='Var3', color='lime')
plt.title("Raw Multivariate Time Series")
plt.xlabel("Time")
plt.ylabel("Normalized Value")
plt.legend()
plt.show()

可视化展示的横坐标是时间(Time),从 0 到 1200,代表时间步数;纵坐标是标准化后的值(Normalized Value) ,范围从 - 3 到 2 。图中有三条线,紫色线代表 Var1,是一条正弦波曲线,呈现周期性波动;蓝色线代表 Var2,是余弦波曲线,也呈周期性波动,但和正弦波有相位差;绿色线代表 Var3,是加了高斯噪声的随机信号,波动非常剧烈且杂乱无章,不像前两条线那样有明显规律 。 

2. Transformer 模型实现

Transformer 回归模型

Transformer 模型借助自注意力机制,能有效捕捉序列中的长期依赖关系。我们使用 PyTorch 搭建一个简洁的 Transformer Encoder 架构。代码如下:

# Transformer回归模型
import torch
import torch.nn as nn
import mathclass TransformerRegressor(nn.Module):def __init__(self, input_dim, d_model, nhead, num_layers, dim_feedforward):super().__init__()# 输入映射层self.input_linear = nn.Linear(input_dim, d_model)# Transformer编码器层encoder_layer = nn.TransformerEncoderLayer(d_model=d_model, nhead=nhead, dim_feedforward=dim_feedforward)self.transformer = nn.TransformerEncoder(encoder_layer, num_layers=num_layers)# 输出映射层self.output_linear = nn.Linear(d_model, input_dim)def forward(self, src):x = self.input_linear(src) * math.sqrt(self.input_linear.out_features)  # 线性变换x = x.permute(1, 0, 2)  # 转置为 (seq_len, batch, d_model)x = self.transformer(x)  # Transformer编码x = x.mean(dim=0)  # 平均池化 (batch, d_model)return self.output_linear(x)  # 预测输出 (batch, input_dim)

在这个模型中,input_linear负责将输入数据映射到指定维度transformer进行核心的编码操作,output_linear则输出预测结果。

模型训练

接下来定义训练所需参数并开始训练模型:

# 定义训练参数
input_dim = 3
model = TransformerRegressor(input_dim, d_model=64, nhead=4, num_layers=2, dim_feedforward=128)
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
criterion = nn.MSELoss()# 训练模型
num_epochs = 50
loss_list = []model.train()
for epoch in range(1, num_epochs+1):epoch_loss = 0.0for xb, yb in train_loader:optimizer.zero_grad()pred = model(xb)loss = criterion(pred, yb)loss.backward()optimizer.step()epoch_loss += loss.item() * xb.size(0)epoch_loss /= len(train_loader.dataset)loss_list.append(epoch_loss)if epoch % 10 == 0:print(f"Epoch {epoch}/{num_epochs}, Loss: {epoch_loss:.4f}")

这里,我们设置了模型的具体参数,选用 Adam 优化器和均方误差损失函数(MSELoss) 。在训练循环中,每个 epoch 都会计算平均损失,并记录下来,方便后续观察模型训练情况。

3. 随机森林模型实现

随机森林回归器

对于随机森林模型,我们先对数据进行预处理,然后训练和预测:

# 随机森林训练与预测
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error, mean_absolute_error
import numpy as npX_rf_train = X_train.reshape(n_train, -1)
X_rf_test = X_test.reshape(len(X_test), -1)rf = RandomForestRegressor(n_estimators=200, max_depth=12, random_state=42)
rf.fit(X_rf_train, Y_train)
rf_pred = rf.predict(X_rf_test)

这里将训练数据和测试数据调整为适合随机森林模型输入的形状,然后使用指定参数训练随机森林回归器,并得到测试集上的预测结果。

评估模型性能

通过计算均方误差(MSE)和平均绝对误差(MAE)来衡量 Transformer 模型和随机森林模型在测试集上的表现:

# model是已经训练好的TransformerRegressor模型,X_test_t是测试集数据
model.eval()  # 将模型设置为评估模式
with torch.no_grad():  # 不计算梯度,节省内存并加快计算tf_pred_test = model(X_test_t).cpu().numpy()  # 对测试集进行预测并转换为numpy数组mse_tf = mean_squared_error(Y_test, tf_pred_test)
mae_tf = mean_absolute_error(Y_test, tf_pred_test)
mse_rf = mean_squared_error(Y_test, rf_pred)
mae_rf = mean_absolute_error(Y_test, rf_pred)print(f"Transformer -> MSE: {mse_tf:.4f}, MAE: {mae_tf:.4f}")
print(f"Random Forest -> MSE: {mse_rf:.4f}, MAE: {mae_rf:.4f}")

通过调整加权系数alpha,综合两个模型的优势,得到集成模型的预测结果,并再次计算评估指标,判断融合效果。 

 从输出结果看,Transformer 模型的均方误差(MSE)为 0.3988 ,平均绝对误差(MAE)为 0.3221 ;随机森林模型的 MSE 是 0.3889 ,MAE 是 0.3071 。这表明在这个多变量时间序列预测任务中,随机森林模型在衡量预测值与真实值偏离程度的 MSE 和 MAE 指标上,表现略优于 Transformer 模型 ,即随机森林模型的预测值相对更接近真实值 。

5. 可视化分析

原始数据可视化

为了更好地理解数据的变化趋势,我们再次展示标准化后的多变量时间序列:

import matplotlib.pyplot as pltplt.figure(figsize=(12, 6))
plt.plot(t, data_norm[:, 0], label='Var1', color='magenta')
plt.plot(t, data_norm[:, 1], label='Var2', color='cyan')
plt.plot(t, data_norm[:, 2], label='Var3', color='lime')
plt.title("Raw Multivariate Time Series")
plt.xlabel("Time")
plt.ylabel("Normalized Value")
plt.legend()
plt.show()

这张图展示了标准化后的多变量时间序列,横坐标为时间,从 0 到 1200,纵坐标是标准化值。紫色线代表 Var1,是正弦波,呈现周期性起伏;蓝色线是 Var2,为余弦波,同样周期性波动,和正弦波有相位差异;绿色线的 Var3 是加了高斯噪声的随机信号,波动剧烈且无明显规律。通过该图能直观看到各变量的变化特征,Var1 和 Var2 的周期性可帮助预测,而 Var3 的随机性增加了预测难度 。 

Transformer 训练损失曲线

为了观察 Transformer 模型的收敛情况,我们绘制其训练损失曲线。具体代码如下:

import matplotlib.pyplot as pltplt.figure(figsize=(8, 4))
plt.plot(range(1, num_epochs+1), loss_list, color='orange', label='Train Loss')
plt.title("Transformer Training Loss")
plt.xlabel("Epoch")
plt.ylabel("MSE Loss")
plt.legend()
plt.show()

运行后得到一张直方图,横坐标是预测误差,纵坐标是误差出现的频率。通过观察直方图的形状和分布,我们可以了解融合模型预测误差的集中程度和离散情况。比如,如果直方图呈现近似正态分布,说明误差分布相对稳定;若存在长尾或异常值,可能表示模型在某些情况下预测效果不佳,需要进一步分析和改进。 

图中输出的是 Transformer 模型的训练损失曲线。横坐标是训练轮次(Epoch),从 0 到 50 ,纵坐标是均方误差损失(MSE Loss) 。可以看到,在训练初期,损失值从接近 0.5 迅速下降,随后在不同轮次间有小幅度波动。整体趋势是逐渐降低并趋于平稳,说明 Transformer 模型在训练过程中不断学习,尽管过程中有起伏,但最终损失稳定在一定范围内,模型在朝着收敛方向发展。 

 

真实与预测值对比(融合模型)

我们来展示融合模型(Transformer 和随机森林融合)的预测结果与真实值的对比情况。代码如下:

plt.figure(figsize=(12, 6))
plt.plot(np.arange(n_train+window_size, T-horizon+1), Y_test[:, 0], color='blue', label='True Var1')
plt.plot(np.arange(n_train+window_size, T-horizon+1), ensemble_pred[:, 0], color='red', linestyle='--', label='Pred Var1')
plt.title("True vs Predicted (Ensemble Model)")
plt.xlabel("Time")
plt.ylabel("Value")
plt.legend()
plt.show()

执行后得到一张折线图,横坐标是时间,纵坐标是变量的值。蓝色实线代表真实值(True Var1),红色虚线代表融合模型的预测值(Pred Var1) 。通过对比这两条线,我们可以直观地看出融合模型的预测效果。如果两条线贴合度高,说明模型预测准确;若偏差较大,则表明模型在预测该变量时存在一定误差。 

 

随机森林特征重要性

为了了解随机森林模型中各个特征的贡献情况,也就是哪些历史数据对预测最重要,我们绘制特征重要性图,代码如下:

importances = rf.feature_importances_
indices = np.argsort(importances)[-10:]
plt.figure(figsize=(8, 6))
plt.barh(range(len(indices)), importances[indices], color='teal')
plt.yticks(range(len(indices)), [f"Feature {i}" for i in indices])
plt.title("Random Forest Feature Importances")
plt.xlabel("Importance")
plt.ylabel("Feature")
plt.show()

这会生成下图的横向条形图,横坐标是特征的重要性程度,纵坐标是特征编号。条形的长度代表对应特征的重要性,越长说明该特征对随机森林模型的预测越关键。通过这张图,我们可以清晰地看到不同特征在模型中的重要程度,有助于进一步优化模型和理解数据。 

可以看出上图展示了不同特征对模型预测的贡献。横坐标是重要性数值,纵坐标是特征编号。可见,Feature 0 和 Feature 88 重要性较高,对预测影响大;其余特征重要性相对较低。 

融合模型误差分布

我们通过绘制误差的直方图来分析融合模型预测误差的分布情况,代码如下:

errors = ensemble_pred.flatten() - Y_test.flatten()
plt.figure(figsize=(8, 6))
plt.hist(errors, bins=30, color='violet', edgecolor='black')
plt.title("Error Distribution (Ensemble)")
plt.xlabel("Prediction Error")
plt.ylabel("Frequency")
plt.show()

本代码运行后输出一张直方图,横坐标是预测误差,纵坐标是误差出现的频率。通过观察直方图的形状和分布,我们可以了解融合模型预测误差的集中程度和离散情况。比如,如果直方图呈现近似正态分布,说明误差分布相对稳定;若存在长尾或异常值,可能表示模型在某些情况下预测效果不佳,需要进一步分析和改进。 

横坐标为预测误差,纵坐标是误差出现的频率。图中显示,大部分误差集中在 0 附近,说明融合模型的预测值与真实值较为接近,模型预测效果较好 ,仅有少量误差分布在远离 0 的两侧,表明模型在少数情况下会出现较大偏差 。 

6. 算法优化点与调参流程

融合策略优化
  • 加权系数调优:可运用网格搜索或交叉验证等方法,对加权系数alpha进行精细调节,以找出能使融合模型性能最优的取值。
  • 堆叠(Stacking):在融合模型中,尝试采用更复杂的回归器,如 XGBoost、Lasso 等,取代简单的线性回归或小型 MLP,从而更精准地学习不同模型间的最优组合方式。
调参流程
  • 基线评估:率先针对单独的 Transformer 模型随机森林(RF)模型进行调参,确定它们各自的基础性能表现,为后续融合模型的优化提供参照。
  • 组合调参:在明确基线模型性能的前提下,对加权系数alpha进行调节,优化加权平均融合效果;或者引入堆叠模型,进一步挖掘提升模型整体性能的潜力。
  • 交叉验证:在模型训练阶段,采用 k 折交叉验证法,全面评估模型的泛化能力,确保模型在不同数据子集上都能有稳定的表现。
  • 模型监控与调整:密切关注训练过程中损失值的变化情况,依据变化趋势,及时、适当地调整模型结构或超参数,使模型始终保持良好的训练状态。

本案例完整呈现了基于 Transformer 与随机森林的多变量时间序列预测过程,涵盖数据生成、模型训练、评估以及优化等各个环节。通过数据可视化和模型分析,我们能够深入理解模型的实际表现,并据此对模型进行针对性的调整与优化。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

初识网络原理

文章目录 1.IP地址2.端口号3.网络中的五元组4.协议分层5.封装和分用6.客户端与服务器 1.IP地址 IP地址 (IP Address): 用于在网络中唯一标识一台设备(主机、路由器等)。IP地址分为IPv4和IPv6两种版本。IPv4是32位地址,通常表示为四个用点分隔…

健康养生之道

健康养生是一种积极的生活态度,是对自己和家人的关爱。从生活的细微之处做起,便能为健康打下坚实的基础。 在生活习惯方面,要注重细节。保持居住环境的整洁与通风,让生活空间舒适宜人。勤洗手、勤换洗衣物,养成良好的卫…

几种电气绝缘类型

1. 基本绝缘 1.1 绝缘等级 1.2 I类设备 2. 附加绝缘 3. 双重绝缘 4. 加强绝缘 5. 功能性绝缘 1. 基本绝缘 用于防止触及带电部件的初级保护,该防护是由绝缘材料完成的 基本绝缘的目的在于为防电击提供一个基本的保护,以避免触电的危险,不过此类绝缘只能保证正常状态下…

01.浏览器自动化webdriver源码分析之启动函数

日后,网络爬虫也好,数据采集也好,自动化必然是主流。因此,笔者未雨绸缪,在此研究各类自动化源码,希望能够赶上时代,做出一套实用的自动化框架。 这里先研究传统的webdriver中转来进行浏览器自动…

PLOG安装

Plog可以通过以下命令安装 cd ~ && git clone https://github.com/SergiusTheBest/plog.gitcd plog && mkdir buildcd build && cmake ..make && sudo make installcd ~ && sudo rm -rf ./plog若无法科学上网,可使用git cl…

Cyber SpaceGuidance网安学习指南见解

免责声明 如有异议请在评论区友好交流,或者私信 内容纯属个人见解,仅供学习参考 如若从事非法行业请勿食用 如有雷同纯属巧合 版权问题请直接联系本人进行删改 前言 提示:这里可以添加本文要记录的大概内容: 提示:以…

第十五届蓝桥杯 2024 C/C++组 下一次相遇

目录 题目: 题目描述: 题目链接: 思路: 自己的思路详解: 更好的思路详解: 代码: 自己的思路代码详解: 更好的思路代码详解: 题目: 题目描述&#xf…

Vue3中provide和inject数据修改规则

在 Vue3 中,通过 inject 接收到的数据是否可以直接修改,取决于 provide 提供的值的类型和响应式处理方式: 1. 若提供的是普通值(非响应式数据) javascript 复制 // 父组件 provide(staticValue, 123); 子组件修改行…

今日CSS笔记

原手写笔记 ------------------------------------------------------------------------------------------------------- css选择器的种类有很多种。这里只介绍几种常用的选择器。 1. 标签选择器标签选择器是最基本的选择器,它可以选择所有的标签。例如&#xff…

健康生活新指南

在 “朋克养生” 与 “躺平焦虑” 并存的时代,真正的健康生活无需刻意 “内卷”。这几个简单又实用的养生妙招,能让你在忙碌日常中悄悄升级健康状态,轻松拥抱活力人生。​ 一、饮食:吃对食物,给身体 “加 Buff”​ 别…

轻量级景好鼠标录制器

景好鼠标录制器(详情请戳 官网)是一款免费无广的键鼠动作录制/循环回放工具,轻松自动化应对一些重复繁琐的操作任务,如来回切换窗口、文档同一相对位置的复制粘贴等场景,兼容Win XP - 11 。毕竟此款本身主打简约类型&a…

结构体与共用体-------C语言经典题目(3)

结构体 1.如何定义和使用结构体指针? 1.结构体指针的定义 首先需要定义结构体类型,例如表示学生信息的结构体: struct Student {char name[50];int age;float score; };接着,使用struct 关键字和指针符号* 声明结构体指针&#x…

未来教育风向标 | 教育学顶流985高校,华东师范大学《AIGC技术赋能教育数字化转型的机遇与挑战》,13所大学deepseek

今天大师兄给大家推荐的是华东师范大学祝智庭教授的《AIGC技术赋能教育数字化转型的机遇与挑战》。华东师范大学是一所985学校,在最新的国家学科测评中,软件工程为A级,教育学为A级。 可以说在AI和教育的结合上是国内top级别的存在。 此讲义探…

Java常用正则表达式及使用方法

在 Java 中,Pattern 和 Matcher 类是 java.util.regex 包的核心,用于处理正则表达式。 Pattern 类 Pattern 类表示编译后的正则表达式,它提供了一种将正则表达式字符串编译成可执行对象的方式,以便后续用于匹配操作。 常用方法…

车载软件架构 --- 驾驶员不感知的控制器软件运行

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁,漫无目的走着,大概这就是成年人最深的孤独吧! 旧人不知我近况,新人不知我过…

深度学习3.5 图像分类数据集

%matplotlib inline import torch import torchvision from torch.utils import data from torchvision import transforms from d2l import torch as d2l代码执行流程图 #mermaid-svg-WWhBmQvijswiICpI {font-family:"trebuchet ms",verdana,arial,sans-serif;font-…

Kotlin集合全解析:List和Map高频操作手册

Kotlin 中 Map 和 List 常用功能总结 List 常用功能 创建 List val immutableList listOf(1, 2, 3) // 不可变列表 val mutableList mutableListOf("a", "b", "c") // 可变列表 val emptyList emptyList<String>() // 空列表基本…

Yocto项目实战教程-第7章定制镜像菜谱与内核菜谱-7.2小节-定制应用程序

&#x1f50d; B站相应的视频教程&#xff1a; &#x1f4cc; Yocto项目实战教程-第7章-定制镜像菜谱与内核菜谱 记得三连&#xff0c;标为原始粉丝,感谢大神支持。 在嵌入式Linux系统开发中&#xff0c;定制专属应用程序往往是最贴近产品交付的那一环。而Yocto项目&#xff0c…

【图像轮廓特征查找】图像处理(OpenCV) -part8

17 图像轮廓特征查找 图像轮廓特征查找其实就是他的外接轮廓。 应用&#xff1a; 图像分割 形状分析 物体检测与识别 根据轮廓点进行&#xff0c;所以要先找到轮廓。 先灰度化、二值化。目标物体白色&#xff0c;非目标物体黑色&#xff0c;选择合适的儿值化方式。 有了轮…

C# 的 字符串插值($) 和 逐字字符串(@) 功能

这段代码使用了 C# 的 字符串插值&#xff08;$&#xff09; 和 逐字字符串&#xff08;&#xff09; 功能&#xff0c;并在 SQL 语句中动态拼接变量。下面详细解释它们的用法&#xff1a; 1. $&#xff08;字符串插值&#xff09; $ 是 C# 的 字符串插值 符号&#xff0c;允许…