当前位置: 首页 > news >正文

基于Informer网络实现电力负荷时序预测——cross validation交叉验证与Hyperopt超参数调优

效果
前言

系列专栏:【深度学习:算法项目实战】✨︎
涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域,讨论了各种复杂的深度神经网络思想,如卷积神经网络、循环神经网络、生成对抗网络、门控循环单元、长短期记忆、自然语言处理、深度强化学习、大型语言模型和迁移学习。

该架构具有三个显著特点:①一个具有 O 时间和Llog(L)内存复杂度的ProbSparse自注意力机制。②一个优先考虑注意力并有效处理长输入序列的自注意力蒸馏过程。③一个MLP(多层感知器)多步解码器,能够在单次前向操作中预测长时间序列,而非逐步预测。(效果图
在这里插入图片描述

import pandas as pd
import matplotlib.pyplot as pltfrom neuralforecast.core import NeuralForecast
from neuralforecast.models import Informer
from neuralforecast.losses.numpy import mae, mse, rmse, mape
from neuralforecast.losses.pytorch import MAEfrom datasetsforecast.long_horizon import LongHorizon
from torchinfo import summary

1. 数据集加载

datasetsforecast 是一个用于处理时间序列预测相关数据集的库。它的主要目的是方便用户获取、加载和预处理适合于时间序列预测任务的数据集。在时间序列分析和预测领域,拥有高质量、合适的数据集是非常关键的一步,这个库能够帮助我们更高效地开展工作。

# Change this to your own data to try the model
Y_df, X_df, _ = LongHorizon.load(directory='./', group='ETTh1')

2. 数据预处理

Y_df['ds'] = pd.to_datetime(Y_df['ds'])
# For this excercise we are going to take 20% of the DataSet
n_time = len(Y_df.ds.unique())
val_size = int(.2 * n_time)
test_size = int(.2 * n_time)Y_df.groupby('unique_id').head(5)

在这里插入图片描述

3. 数据可视化

plt.style.use('ggplot')
plt.plot(Y_df['y'], color='darkorange' ,label='Trend')
plt.show()

ot

4. 构建模型

ProbAttentionInformer 模型的核心创新点,它通过“K、Q交替采样、没采到的地方用均值替代”的方式,来降低Attention的复杂度

class ProbMask:"""ProbMask"""def __init__(self, B, H, L, index, scores, device="cpu"):_mask = torch.ones(L, scores.shape[-1], dtype=torch.bool, device=device).triu(1)_mask_ex = _mask[None, None, :].expand(B, H, L, scores.shape[-1])indicator = _mask_ex[torch.arange(B)[:, None, None], torch.arange(H)[None, :, None], index, :].to(device)self._mask = indicator.view(scores.shape).to(device)@propertydef mask(self):return self._maskclass ProbAttention(nn.Module):"""ProbAttention"""def __init__(self,mask_flag=True,factor=5,scale=None,attention_dropout=0.1,output_attention=False,):super(ProbAttention, self).__init__()self.factor = factorself.scale = scaleself.mask_flag = mask_flagself.output_attention = output_attentionself.dropout = nn.Dropout(attention_dropout)def _prob_QK(self, Q, K, sample_k, n_top):  # n_top: c*ln(L_q)# Q [B, H, L, D]B, H, L_K, E = K.shape_, _, L_Q, _ = Q.shape# calculate the sampled Q_KK_expand = K.unsqueeze(-3).expand(B, H, L_Q, L_K, E)index_sample = torch.randint(L_K, (L_Q, sample_k))  # real U = U_part(factor*ln(L_k))*L_qK_sample = K_expand[:, :, torch.arange(L_Q).unsqueeze(1), index_sample, :]Q_K_sample = torch.matmul(Q.unsqueeze(-2), K_sample.transpose(-2, -1)).squeeze()# find the Top_k query with sparisty measurementM = Q_K_sample.max(-1)[0] - torch.div(Q_K_sample.sum(-1), L_K)M_top = M.topk(n_top, sorted=False)[1]# use the reduced Q to calculate Q_KQ_reduce = Q[torch.arange(B)[:, None, None], torch.arange(H)[None, :, None], M_top, :]  # factor*ln(L_q)Q_K = torch.matmul(Q_reduce, K.transpose(-2, -1))  # factor*ln(L_q)*L_kreturn Q_K, M_topdef _get_initial_context(self, V, L_Q):B, H, L_V, D = V.shapeif not self.mask_flag:# V_sum = V.sum(dim=-2)V_sum = V.mean(dim=-2)contex = V_sum.unsqueeze(-2).expand(B, H, L_Q, V_sum.shape[-1]).clone()else:  # use maskassert L_Q == L_V  # requires that L_Q == L_V, i.e. for self-attention onlycontex = V.cumsum(dim=-2)return contexdef _update_context(self, context_in, V, scores, index, L_Q, attn_mask):B, H, L_V, D = V.shapeif self.mask_flag:attn_mask = ProbMask(B, H, L_Q, index, scores, device=V.device)scores.masked_fill_(attn_mask.mask, -np.inf)attn = torch.softmax(scores, dim=-1)  # nn.Softmax(dim=-1)(scores)context_in[torch.arange(B)[:, None, None], torch.arange(H)[None, :, None], index, :] = torch.matmul(attn, V).type_as(context_in)if self.output_attention:attns = (torch.ones([B, H, L_V, L_V], device=attn.device) / L_V).type_as(attn)attns[torch.arange(B)[:, None, None], torch.arange(H)[None, :, None], index, :] = attnreturn (context_in, attns)else:return (context_in, None)def forward(self, queries, keys, values, attn_mask):B, L_Q, H, D = queries.shape_, L_K, _, _ = keys.shapequeries = queries.transpose(2, 1)keys = keys.transpose(2, 1)values = values.transpose(2, 1)U_part = self.factor * np.ceil(np.log(L_K)).astype("int").item()  # c*ln(L_k)u = self.factor * np.ceil(np.log(L_Q)).astype("int").item()  # c*ln(L_q)U_part = U_part if U_part < L_K else L_Ku = u if u < L_Q else L_Qscores_top, index = self._prob_QK(queries, keys, sample_k=U_part, n_top=u)# add scale factorscale = self.scale or 1.0 / math.sqrt(D)if scale is not None:scores_top = scores_top * scale# get the contextcontext = self._get_initial_context(values, L_Q)# update the context with selected top_k queriescontext, attn = self._update_context(context, values, scores_top, index, L_Q, attn_mask)return context.contiguous(), attn

ProbMask 类用于生成概率掩码,而 ProbAttention 类实现了一种基于概率的注意力机制。在 ProbAttention 类中,_prob_QK 方法用于计算 Q 和 K 的采样点积,_get_initial_context 方法用于获取初始上下文,_update_context 方法用于更新上下文。最后,forward 方法将这些部分组合在一起,实现了整个注意力机制的前向传播。

NeuralForecast 库的 models 模块可以用于构建 Informer 信息网络模型,NeuralForecast 库是基于 PyTorch 的高级封装,它提供了便捷的接口来构建和训练包括Informer信息网络模型在内的多种时间序列预测模型。Informer 模型以其处理长序列数据的高效性和准确性而著称,非常适合用于需要捕捉长期依赖关系的任务。

horizon = 1
model = Informer(h = 1,                                    # Forecasting horizoninput_size =10,                           # Input sizestat_exog_list=None,                      # static exogenous columns.hist_exog_list=None,                      # historic exogenousfutr_exog_list=None,                      # future exogenous columns.exclude_insample_y=False,                 # bool=False, the model skips the autoregressive features y[t-input_size:t] if True.decoder_input_size_multiplier = 0.5,      # float = 0.5,hidden_size = 128,                        # units of embeddings and encoders.dropout = 0.05,                           # float (0, 1)factor = 3,                               # Prob sparse attention factor.n_head = 4,                               # controls number of multi-head's attention.conv_hidden_size = 32,                    # channels of the convolutional encoder.activation = 'gelu',                      # activation from ['ReLU', 'Softplus', 'Tanh', 'SELU', 'LeakyReLU', 'PReLU', 'Sigmoid', 'GELU'].encoder_layers = 2,                       # number of layers for the TCN encoder.decoder_layers = 1,                       # number of layers for the MLP decoder.distil = True,                            # bool = True. wether the Informer decoder uses bottlenecks.loss=MAE(),                               # PyTorch module, instantiated train loss class from [losses collection]valid_loss=None,                          # PyTorch module=`loss`, instantiated valid loss class from [losses collection]max_steps = 1000,                         # Maximum number of training iterationslearning_rate = 1e-4,                     # float=1e-3, Learning rate between (0, 1).num_lr_decays = -1,                       # int=-1, Number of learning rate decays, evenly distributed across max_steps.early_stop_patience_steps = -1,           # int=-1, Number of validation iterations before early stopping.val_check_steps = 100,                    # Compute validation loss every 100 stepsbatch_size = 32,                          # number of different series in each batch.valid_batch_size = None,                  # number of different series in each validation and test batch.windows_batch_size=1024,                  # number of windows to sample in each training batch.inference_windows_batch_size=1024,        # number of windows to sample in each inference batch.start_padding_enabled=False,              # bool=False, if True, the model will pad the time series with zeros at the beginning, by input size.step_size = 1,                            # step size between each window of temporal data.scaler_type = "identity",                 # str='robust', type of scaler for temporal inputs normalization see temporal scalerrandom_seed = 1,                          # random_seed for pytorch initializer and numpy generators.drop_last_loader = False,                 # bool=False, if True `TimeSeriesDataLoader` drops last non-full batch.optimizer=None,                           # Subclass of 'torch.optim.Optimizer', optional, user specified optimizer instead of the default choice (Adam).optimizer_kwargs=None,                    # dict, optional, list of parameters used by the user specified `optimizer`.lr_scheduler=None,                        # Subclass of 'torch.optim.lr_scheduler.LRScheduler', optional, user specified lr_scheduler instead of the default choice (StepLR).lr_scheduler_kwargs=None,                 # dict, optional, list of parameters used by the user specified `lr_scheduler`.dataloader_kwargs=None,                   # dict, optional, list of parameters passed into the PyTorch Lightning dataloader by the `TimeSeriesDataLoader`.
)

中文解释:
exclude_insample_y: bool=False, the model skips the autoregressive features y[t-input_size:t] if True.意思是如果设置为True,说明模型会跳过(也就是不使用、忽略)自回归特征中从 y t − i n p u t s i z e y_{t-inputsize} ytinputsize y t y_t yt这一部分数据。正常情况下,这些数据往往会被纳入模型的输入,作为帮助模型学习时间序列规律以及进行预测的重要依据。但当满足上述条件时,模型就不会把这一段对应的历史时间序列值当作输入信息了,相当于切断了这部分自回归的信息链路,模型会基于其他可用的输入(比如外生变量、其他历史阶段的数据等,如果有的话)来进行后续的处理和预测工作。

5. 模型概要

summary(model=model)
======================================================================
Layer (type:depth-idx)                        Param #
======================================================================
Informer                                      --
├─MAE: 1-1                                    --
├─MAE: 1-2                                    --
├─ConstantPad1d: 1-3                          --
├─TemporalNorm: 1-4                           --
├─DataEmbedding: 1-5                          --
│    └─TokenEmbedding: 2-1                    --
│    │    └─Conv1d: 3-1                       384
│    └─PositionalEmbedding: 2-2               --
│    └─Dropout: 2-3                           --
├─DataEmbedding: 1-6                          --
│    └─TokenEmbedding: 2-4                    --
│    │    └─Conv1d: 3-2                       384
│    └─PositionalEmbedding: 2-5               --
│    └─Dropout: 2-6                           --
├─TransEncoder: 1-7                           --
│    └─ModuleList: 2-7                        --
│    │    └─TransEncoderLayer: 3-3            74,912
│    │    └─TransEncoderLayer: 3-4            74,912
│    └─ModuleList: 2-8                        --
│    │    └─ConvLayer: 3-5                    49,536
│    └─LayerNorm: 2-9                         256
├─TransDecoder: 1-8                           --
│    └─ModuleList: 2-10                       --
│    │    └─TransDecoderLayer: 3-6            141,216
│    └─LayerNorm: 2-11                        256
│    └─Linear: 2-12                           129
======================================================================
Total params: 341,985
Trainable params: 341,985
Non-trainable params: 0
======================================================================

6. 交叉验证

交叉验证方法 cross_validation 将返回模型在测试集上的预测结果。这里我们使用第一种方法进行交叉验证

nf = NeuralForecast(models = [model],freq='H'
)
Y_hat_df = nf.cross_validation(df=Y_df, val_size=val_size,test_size=test_size, n_windows=None)
| Name          | Type          | Params | Mode 
--------------------------------------------------------
0 | loss          | MAE           | 0      | train
1 | padder_train  | ConstantPad1d | 0      | train
2 | scaler        | TemporalNorm  | 0      | train
3 | enc_embedding | DataEmbedding | 384    | train
4 | dec_embedding | DataEmbedding | 384    | train
5 | encoder       | TransEncoder  | 199 K  | train
6 | decoder       | TransDecoder  | 141 K  | train
--------------------------------------------------------
341 K     Trainable params
0         Non-trainable params
341 K     Total params
1.368     Total estimated model params size (MB)
73        Modules in train mode
0         Modules in eval mode

7. 预测结果

Y_plot = Y_hat_df.copy() # OT dataset
cutoffs = Y_hat_df['cutoff'].unique()[::horizon]
Y_plot = Y_plot[Y_hat_df['cutoff'].isin(cutoffs)]plt.figure(figsize=(20,5))
plt.plot(Y_plot['ds'], Y_plot['y'], label='True')
plt.plot(Y_plot['ds'], Y_plot['Informer'], label='Informer')
plt.title('Informer Prediction', fontdict={'family': 'Times New Roman'})
plt.xlabel('Datestamp')
plt.ylabel('OT')
plt.grid()
plt.legend()

预测结果

8. 模型评估

以下代码使用了一些常见的评估指标:平均绝对误差(MAE)、平均绝对百分比误差(MAPE)、均方误差(MSE)、均方根误差(RMSE)来衡量模型预测的性能。这里我们将调用 neuralforecast.losses.numpy 模块中的 mae, mse, mape, rmse 函数来对模型的预测效果进行评估。

mae_informer = mae(Y_hat_df['y'], Y_hat_df['Informer'])
mse_informer = mse(Y_hat_df['y'], Y_hat_df['Informer'])mape_informer = mape(Y_hat_df['y'], Y_hat_df['Informer'])
rmse_informer = rmse(Y_hat_df['y'], Y_hat_df['Informer'])
print(f'Informer_mae: {mae_informer:.3f}')
print(f'Informer_mse: {mse_informer:.3f}')
print(f'Informer_mape: {mape_informer * 100:.3f}%')
print(f'Informer_rmse: {rmse_informer:.3f}')
Informer_mae: 0.069
Informer_mse: 0.007
Informer_mape: 5.403%
Informer_rmse: 0.085

相关文章:

基于Informer网络实现电力负荷时序预测——cross validation交叉验证与Hyperopt超参数调优

前言 系列专栏:【深度学习&#xff1a;算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域&#xff0c;讨论了各种复杂的深度神经网络思想&#xff0c;如卷积神经网络、循环神经网络、生成对…...

linux ubantu重启桌面

在 Ubuntu 系统中&#xff0c;重启桌面环境通常有几种方法&#xff0c;具体取决于你所使用的桌面环境&#xff08;如 GNOME、KDE 等&#xff09;。下面是几种常用的重启桌面的方法&#xff1a; 重启 GNOME 桌面环境 如果你使用的是 GNOME 桌面环境&#xff08;Ubuntu 默认桌面…...

C++Primer const限定符

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…...

【机器学习】机器学习的基本分类-自监督学习(Self-supervised Learning)

自监督学习是一种机器学习方法&#xff0c;介于监督学习和无监督学习之间。它通过数据本身生成标签&#xff0c;创建训练任务&#xff0c;从而学习数据的表征&#xff0c;而不需要人工标注的标签。这种方法在减少标注数据依赖、提高模型通用性等方面具有重要意义。 自监督学习的…...

python基础案例

#一个年份如果能被4整除但不能被 100整除&#xff0c;或能被 400整除&#xff0c;那么这个年份就是闰年。 year int(input(请输入年份&#xff1a;)) if (year %40 and year %100!0) or year %4000:print("这个年份就是闰年") else:print("这个年份不是闰…...

ARP(地址解析协议)攻击;TCP SYN Flood(SYN洪流)攻击

ARP&#xff08;地址解析协议&#xff09;攻击 是一种网络攻击类型&#xff0c;攻击者利用ARP协议的缺陷对目标网络实施攻击。ARP协议用于在局域网&#xff08;LAN&#xff09;中将IP地址解析为MAC地址&#xff0c;它是无认证机制的&#xff0c;这为攻击者提供了可利用的机会。…...

基于大数据爬虫+Python+数据可视化大屏的慧游数据爬虫与推荐分析系统(源码+论文+PPT+部署文档教程等)

博主介绍&#xff1a;**CSDN毕设辅导第一人、**全网粉丝50W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流 **技术范围&#xff1a;**S…...

Linux系统安装es详细教程

一、下载es及插件 从下面的网址进行对应es版本的下载https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.15.2-linux-x86_64.tar.gz &#xff0c;想要不同版本的es只需更换对应的版本号即可。 插件下载地址&#xff08;ik分词器、pinyin等&#xff09;es…...

分布式搜索引擎之elasticsearch基本使用3

分布式搜索引擎之elasticsearch基本使用3 1.部署单点es 1.1.创建网络 因为我们还需要部署kibana容器&#xff0c;因此需要让es和kibana容器互联。这里先创建一个网络&#xff1a; docker network create es-net1.2.加载镜像 这里我们采用elasticsearch的7.12.1版本的镜像&…...

进程间通信-----信号

进程间通信-----信号 信号&#xff1a;进程间异步通知的机制。是一种在操作系统中用于进程间通信和控制的机制。它可以用于多种场景&#xff0c;例如进程间通信、异常处理、线程同步等。常见的信号有SIGINT&#xff08;中断信号&#xff09;、SIGTERM&#xff08;终止信号&…...

机器学习基础-线性回归和逻辑回归

目录 基本概念和定义 线性回归 逻辑回归 线性回归中的最小二乘法和梯度下降法 最小二乘法 梯度下降法 参数调整策略 梯度下降类型 梯度下降的调参的基本操作 过拟合和欠拟合的概念及处理方法 过拟合&#xff08;Overfitting&#xff09; 欠拟合&#xff08;Underfi…...

低代码引擎插件开发:开启开发的便捷与创新之路

OneCode授权演示 一、低代码引擎与插件开发的概述 在当今快节奏的软件开发领域&#xff0c;低代码引擎正逐渐崭露头角。低代码引擎旨在让开发人员能够以最少的代码量创建功能丰富的应用程序&#xff0c;而其中的关键组成部分便是插件开发。低代码引擎通过提供可视化的开发环境…...

【C++】18.继承

文章目录 1.继承的概念及定义1.1 继承的概念1.2 继承定义1.2.1定义格式1.2.2继承关系和访问限定符1.2.3继承基类成员访问方式的变化 1.3 继承类模板 2.基类和派生类对象赋值转换3.继承中的作用域3.1 隐藏规则&#xff1a;3.2 考察继承作用域相关选择题 4.派生类的默认成员函数4…...

R语言基础| 中级绘图

写在前面 前面第六章的图形主要是展示单分类变量或连续型变量的分布情况。本章主要研究二元变量或多元变量关系的可视化。更多教程可参考&#xff1a; R语言基础学习手册 图片集锦&#xff1a; 11.1 散点图 1&#xff09;添加最佳拟合曲线的散点图&#xff1a; 绘制汽车重…...

TANGO - 数字人全身动作生成

文章目录 一、关于 TANGO演示视频&#xff08;YouTube&#xff09;&#x1f4dd;发布计划 二、⚒️安装克隆存储库构建环境 三、&#x1f680;训练和推理1、推理2、为自定义字符创建图形 一、关于 TANGO TANGO 是 具有分层音频运动嵌入 和 扩散插值的共语音手势视频再现 由东…...

从configure.ac到构建环境:解析Mellanox OFED内核模块构建脚本

在软件开发过程中,特别是在处理复杂的内核模块如Mellanox OFED(OpenFabrics Enterprise Distribution)时,构建一个可移植且高效的构建系统至关重要。Autoconf和Automake等工具在此过程中扮演着核心角色。本文将深入解析一个用于准备Mellanox OFED内核模块构建环境的Autocon…...

深入理解 Android 中的 KeyguardManager

深入理解 Android 中的 KeyguardManager 引言 在 Android 系统中&#xff0c;KeyguardManager 是一个重要的系统服务&#xff0c;负责管理设备的锁屏界面&#xff08;Keyguard&#xff09;。锁屏界面是设备安全性的第一道防线&#xff0c;用于防止未经授权的用户访问设备。Ke…...

在Vue3项目中使用svg-sprite-loader

1.普通的svg图片使用方式 1.1 路径引入 正常我们会把项目中的静态资源放在指定的一个目录&#xff0c;例如assets,使用起来就像 <img src"../assets/svgicons/about.svg" /> 1.2封装组件使用 显然上面的这种方法在项目开发中不太适用&#xff0c;每次都需…...

Linux(Centos 7.6)命令详解:pwd

1.命令作用 显示当前工作目录的完整路径(Print Working Directory) 2.命令语法 Usage: pwd [-LP] 3.参数详解 -L&#xff0c;显示逻辑路径&#xff0c;遵循符号链接&#xff1b;这是默认选项。-P&#xff0c;显示物理路径&#xff0c;不遵循符号链接。 4.常用用例 1.-L参…...

【iOS Swift Moya 最新请求网络框架封装通用】

【iOS Swift Moya 最新请求网络框架封装通用】 前言框架结构1.API定义&#xff08;TargetType&#xff09;2. 配置MoyaProvider3. 网络管理器4. 使用示例注意事项进一步优化 前言 设计一个基于Moya的网络请求框架&#xff0c;可以提供灵活的网络请求管理&#xff0c;例如设置请…...

【算法学习】——设施选址问题(动态规划)

题目描述 在一条高速公路附近有 V 个村庄&#xff0c;选择 P 个村庄在其附近建立邮局&#xff0c;要求每个村庄到最近的邮局的距离和最小(1<V<300&#xff0c;1<P<30)。 问题分析 这个问题是一个经典的设施选址问题&#xff08;Facility Location Problem&#…...

Linux——修改文件夹的所属用户组和用户

一、命令 举例&#xff1a; 授权 MOT17 文件夹 给 hust_xxx 用户&#xff1a; sudo chown -R hust_xxx:hust_xxx MOT17参考 Linux授权文件夹给用户...

我用Ai学Android Jetpack Compose之Text

这篇开始学习各种UI元素&#xff0c;答案来自 通义千问&#xff0c;通义千问没法生成图片&#xff0c;图片是我补充的。 下述代码只要复制到第一个工程&#xff0c;做一些import操作&#xff0c;一般import androidx.compose包里的东西&#xff0c;即可看到预览效果。完整工程代…...

H5通过URL Scheme唤醒手机地图APP

1.高德地图 安卓URL Scheme&#xff1a;baidumap:// 官方文档&#xff1a;https://lbs.amap.com/api/amap-mobile/guide/android/navigation IOS URL Scheme&#xff1a;iosamap:// 官方文档&#xff1a;https://lbs.amap.com/api/amap-mobile/guide/ios/navi HarmonyOS NEXT U…...

【Java数据结构】二叉树

1.树型结构 1.1树的概念 树是一种非线性的数据结构&#xff0c;由n个结点组成的具有层次关系的集合。下面是它的特点&#xff1a; 根结点是没有前驱的结点&#xff08;没有父结点的结点&#xff09;子结点之间互不相交除了根结点外&#xff0c;其它结点都只有一个父结点n个结…...

Golang设计模式目录

go语言实现设计模式 1 文章目录&#xff1a; 1.1 创建型模式 1.Golang设计模式之工厂模式2.Golang设计模式之抽象工厂模式3.Golang设计模式之单例模式4.Golang设计模式之建造者模式5.Golang设计模式之原型模式 1.2 结构型模式 6.Golang设计模式之适配器模式7.Golang设计模式之桥…...

vue3+Echarts+ts实现甘特图

项目场景&#xff1a; vue3Echartsts实现甘特图;发布任务 代码实现 封装ganttEcharts.vue <template><!-- Echarts 甘特图 --><div ref"progressChart" class"w100 h100"></div> </template> <script lang"ts&qu…...

nginx-灰度发布策略(split_clients)

一. 简述&#xff1a; 基于客户端的灰度发布&#xff08;也称为蓝绿部署或金丝雀发布&#xff09;是一种逐步将新版本的服务或应用暴露给部分用户&#xff0c;以确保在出现问题时可以快速回滚并最小化影响的技术。对于 Nginx&#xff0c;可以通过配置和使用不同的模块来实现基于…...

SQL中聚类后字段数据串联字符串方法研究

在 SQL 中&#xff0c;使用 聚类&#xff08;GROUP BY&#xff09; 后将某个字段的数据串联为一个字符串&#xff0c;常见的方法包括以下几种&#xff0c;取决于数据库管理系统&#xff08;DBMS&#xff09;的具体支持功能&#xff1a; 1. 使用 GROUP_CONCAT &#xff08;MySQL…...

vue3组件化开发优势劣势分析,及一个案例

Vue 3 组件化开发的优势和劣势 优势 可复用性&#xff1a; 组件可以重复使用&#xff0c;减少代码冗余&#xff0c;提高开发效率。 可以在不同的项目中复用组件&#xff0c;提升开发速度。 可维护性&#xff1a; 组件化开发使得代码结构清晰&#xff0c;易于维护。 每个…...

Springboot SAP Docker 镜像打包问题

问题类1&#xff0c;sapjco.jar 未识别到&#xff1a;Caused by: java.lang.NoClassDefFoundError: com/sap/conn/jco/ext/DestinationDataProvider 1./deploy/lib/ 文件下放sapjco3.jar、libsapjco3.so、sapjco3.dll 2.docker文件核心内容&#xff1a; COPY /deploy/lib/sap…...

nmap探测Web服务

HTTP服务 探测基本认证信息 nmap --script http-auth [目标]探测默认账户 nmap --scripthttp-default-accounts -p [端口] [目标]检查是否存在风险方法 nmap --script http-methods [目标]探测访问一个网页的时间 nmap --scripthttp-chrono -p 80 [目标]提取HTTP注释信息 nmap…...

【学习总结|DAY028】后端Web实战(部门管理)

在 Web 后端开发领域&#xff0c;构建高效、规范且功能完备的系统是核心目标。本文将围绕 Tlias 智能学习辅助系统的后端开发展开&#xff0c;详细阐述从开发准备工作到各部门管理功能实现&#xff0c;以及日志技术应用的全过程&#xff0c;为开发者提供全面的实践参考。 一、…...

Servlet 和 Spring MVC:区别与联系

前言 在 Java Web 开发中&#xff0c;Servlet 和 Spring MVC 是两个重要的技术。Servlet 是 Java Web 的基础组件&#xff0c;而 Spring MVC 是一个高级 Web 框架&#xff0c;建立在 Servlet 的基础之上&#xff0c;提供了强大的功能和易用性。这篇文章将从定义、原理、功能对…...

【君正T31开发记录】12.编译工具相关总结及介绍

移植交叉工具包的时候&#xff0c;发现这是很多工具的集合包&#xff1b;以及写makefile的时候&#xff0c;也需要了解下这些工具的作用及用法&#xff0c;这里总结记录一下常见的工具及相关用法。 g C编译器&#xff0c;用于编译C源代码文件&#xff0c;这个很常见&#xff0…...

Python 开发框架搭建简单博客系统:代码实践与应用

在当今数字化时代&#xff0c;博客作为一种流行的信息分享和交流平台&#xff0c;拥有广泛的受众。Python 以其强大的功能和丰富的库&#xff0c;为构建博客系统提供了理想的技术支持。本文将详细介绍如何利用 Python 开发框架搭建一个简单博客系统&#xff0c;包括功能实现、代…...

Java 正则表达式入门与应用(详细版)

正则表达式&#xff08;Regular Expression&#xff0c;简称Regex&#xff09;是一种文本模式匹配工具&#xff0c;在许多编程语言中都得到了广泛应用。Java 作为一种强大的编程语言&#xff0c;提供了对正则表达式的内建支持&#xff0c;使得在字符串处理、数据验证和文本解析…...

高效内存管理与调试技巧:深入解析 AddressSanitizer

在现代 C开发中&#xff0c;内存管理是一个至关重要但也容易出错的领域。即使使用了智能指针和其他高效工具&#xff0c;复杂的项目仍可能出现内存泄漏、非法访问等问题。为了解决这些问题&#xff0c;Google 开发了一个强大的工具——AddressSanitizer (ASan)。本文将详细介绍…...

力扣第137题:只出现一次的数字 II C语言解法

力扣第137题&#xff1a;只出现一次的数字 II C语言解法 题目描述 给定一个整数数组 nums&#xff0c;其中每个元素出现三次&#xff0c;除了一个元素出现一次。找出那个只出现一次的元素。 说明&#xff1a; 你的算法应该具有线性时间复杂度。你不可以使用额外的空间&…...

【Qt】控件概述和QWidget核心属性1(enabled、geometry、windowTitle、windowIcon、QRC机制)

一、控件概念 界面上各种元素、各种部分的统称&#xff08;如按钮、输入框、下拉框、单选复选框...&#xff09; Qt作为GUI开发框架&#xff0c;内置了各种的常用控件&#xff0c;并支持自定义控件。 二、控件体系发展 1.没有完全的控件&#xff0c;需要使用绘图API手动绘制…...

25年1月更新。Windows 上搭建 Python 开发环境:PyCharm 安装全攻略(文中有安装包不用官网下载)

python环境没有安装的可以点击这里先安装好python环境&#xff0c;python环境安装教程 安装 PyCharm IDE 获取 PyCharm PyCharm 提供两种主要版本——社区版&#xff08;免费&#xff09;和专业版&#xff08;付费&#xff09;。对于初学者和个人开发者而言&#xff0c;社区…...

软件工程大复习之(四)——面向对象与UML

4.1 面向对象概述 面向对象&#xff08;OO&#xff09;是一种编程范式&#xff0c;它将数据和处理数据的方法封装在对象中。面向对象的主要概念包括&#xff1a; 对象&#xff1a;实例化的数据和方法的集合。类&#xff1a;对象的蓝图或模板。封装&#xff1a;隐藏对象的内部…...

前端基础函数算法整理应用(sort+reduce+date+双重for循环)

文章目录 基础函数算法reduce 函数算法sort 函数算法时间排序1. 对日期字符串数组进行排序2. 对包含日期对象的数组进行排序3. 对包含时间戳的数组进行排序4. 对包含日期时间信息的对象数组进行排序 基础函数算法 一、排序算法 冒泡排序&#xff08;Bubble Sort&#xff09; …...

web系统漏洞攻击靶场

摘 要 互联网极速发展的同时&#xff0c;也会带来一些安全性的风险&#xff0c;一些不为人知的安全问题也逐渐暴露出来。近年来&#xff0c;媒体不断披露了许多网络安全事故&#xff0c;许多网络应用程序被黑客攻击&#xff0c;导致内部数据外泄&#xff0c;人们开始认识到网络…...

苍穹外卖-day07(Spring Cache 购物车业务逻辑)

内容 缓存菜品缓存套餐添加购物车查看购物车清空购物车 功能实现&#xff1a;缓存商品、购物车 效果图&#xff1a; 1. 缓存菜品 1.1 问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增…...

win10 VS2019上libtorch库配置过程

win10 VS2019上libtorch库配置过程 0 引言1 获取libtorch2 在VS上配置使用libtorch库3 结语 0 引言 &#x1f4bb;&#x1f4bb;AI一下&#x1f4bb;&#x1f4bb;   libtorch库是一个用于深度学习的C库&#xff0c;是PyTorch的官方C前端。它提供了用于构建和训练深度学习模…...

git 常用命令和本地合并解决冲突

目录 一、常用命令 二、本地可视化合并分支解决冲突 一、常用命令 最近&#xff0c;使用mac电脑&#xff0c;无法直接使用小乌龟进行可视化操作&#xff0c;现在记录一些常用命令。 拉取&#xff1a; git clone <git url> 仅拉起某个单独分支&#xff1a; git clo…...

Elasticsearch 创建索引 Mapping映射属性 索引库操作 增删改查

Mapping Type映射属性 mapping是对索引库中文档的约束&#xff0c;有以下类型。 text&#xff1a;用于分析和全文搜索&#xff0c;通常适用于长文本字段。keyword&#xff1a;用于精确匹配&#xff0c;不会进行分析&#xff0c;适用于标签、ID 等精确匹配场景。integer、long…...

Objective-C语言的数据结构

Objective-C语言中的数据结构 Objective-C是一种面向对象的编程语言&#xff0c;其在苹果公司的软件开发中得到了广泛应用。它主要用于开发macOS和iOS应用程序。虽然Objective-C有许多丰富的特性&#xff0c;但在程序设计中&#xff0c;数据结构仍然是构建任何应用程序的基础。…...

智能水文:ChatGPT等大语言模型如何提升水资源分析和模型优化的效率

大语言模型与水文水资源领域的融合具有多种具体应用&#xff0c;以下是一些主要的应用实例&#xff1a; 1、时间序列水文数据自动化处理及机器学习模型&#xff1a; ●自动分析流量或降雨量的异常值 ●参数估计&#xff0c;例如PIII型曲线的参数 ●自动分析降雨频率及重现期 ●…...