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

时间序列预测模型比较分析:SARIMAX、RNN、LSTM、Prophet 及 Transformer

时间序列预测根据过去的模式预测未来事件。我们的目标是找出最佳预测方法,因为不同的技术在特定条件下表现出色。本文章将探讨各种方法在不同数据集上的表现,为你在任何情况下选择和微调正确的预测方法提供真知灼见。

我们将探讨五种主要方法:

  • SARIMAX:检测重复出现的模式并考虑各种外部影响。

  • RNN: 分析顺序数据,适用于按时间顺序排列的信息。

  • LSTM:通过长时间保留数据来增强 RNN。

  • Prophet: 由 Facebook 开发,对数据缺口和重大趋势变化具有强大的抵抗能力。

  • Transformer: 利用自我关注,有效识别复杂模式。

我们在不同类型的数据上对这些方法进行了测试:

  • 电力生产: 分析行业能源消耗的长期趋势。电力生产Kaggle 数据集[1]

  • 洗发水销售: 监测洗发水销量的变化。洗发水销售Kaggle 数据集[2]

  • 犯罪数据: 洞察公共安全和城市生活。犯罪数据数据集[3]

  • 碰撞报告: 加强对车祸和道路安全的了解。碰撞报告数据集[4]

  • 模拟数据: 利用自定义生成的时间序列对 RNN 和 LSTM 模型进行深入比较。

我们在各种数据集上应用这些模型(每个模型都有特定的配置),以评估它们的准确性、可靠性和速度。

一般方法

我们是这样做的

数据检查:

应用 “有马方法 ”的原则,我们首先评估静态趋势,并通过自相关函数(ACF)和部分自相关函数(PACF)分析检测模式。这一阶段有助于识别数据中反复出现的模式,从而为我们选择最合适的模型及其参数配置提供信息。

参数优化:

对于每种算法和数据集,我们都会精心选择参数,以提高预测的准确性。

模型训练和验证:

我们使用数据集训练每种算法,并留出一部分数据专门用于验证。

性能评估:

平均绝对百分比误差(MAPE)被用作所有验证数据的标准指标,以便进行直接比较。

这种方法有助于我们了解每种算法的优缺点,指导我们针对具体的时间序列预测挑战选择合适的算法。

时间序列识别概述

我们使用 “电力生产 ”数据集探索时间序列识别。我们的目标是计算该数据的月平均值,从而发现准确预测所必需的关键趋势和模式。

下面的 Python 脚本将对月度数据汇总进行处理和可视化:

import matplotlib.pyplot as plt
import pandas as pdData = pd.read_csv("Electric_Production.csv")
monthly_data = data.IPG2211A2N.resample('M').mean()
data.IPG2211A2N.resample('M').mean().plot()
plt.show()

图 (1): 月度电力生产数据可视化

该图(图 1)揭示了电力生产的潜在季节性变化,这对预测工作至关重要。

为了评估数据集的静态性并探索自回归和移动平均成分,我们进行了统计测试和分析,如 Dickey-Fuller 检验、自相关函数 (ACF) 和偏自相关函数 (PACF):

from statsmodels.tsa.stattools import adfuller, acf, pacf# Dickey-Fuller test
result = adfuller(monthly_data)
print(f'ADF Statistic: {result[0]}')
print(f'p-value: {result[1]}')# ACF and PACF
acf_values = acf(monthly_data, nlags=20)
pacf_values = pacf(monthly_data, nlags=20, method='ols')# Visualization
plt.figure(figsize=(10, 5))
plt.subplot(121)
plt.plot(acf_values)
plt.title('Autocorrelation Function')
plt.subplot(122)
plt.plot(pacf_values)
plt.title('Partial Autocorrelation Function')
plt.tight_layout()
plt.show()

图 (2): ACF 和 PACF 图

这些分析提供了以下结果:

  • Dickey-Fuller 检验: 显示非平稳性,表明需要进行差分。

  • ACF 和 PACF: 突显了自回归和移动平均成分的必要性,建议使用初始 ARIMA(1,1,0)模型。

这些发现使我们能够准确地准备和评估各种数据集,以便进行时间序列预测。

按照这一既定方法,我们对其他数据集的分析结果总结如下:

表(1) 数据识别结果

预测技术

利用 SARIMAX 进行时间序列预测

确定数据集的 ARIMA 模型参数后,我们就可以使用 SARIMAX 进行预测了。SARIMAX 代表带有外生因素的季节性自回归整合移动平均模型,通过纳入季节周期和外部变量的潜在影响来增强 ARIMA。

下面是将 SARIMAX 应用于 “电力生产” 数据集的 Python 示例,其中保留了最近三个月的数据以进行验证:

import pandas as pd
from statsmodels.tsa.statespace.sarimax import SARIMAX
from statsmodels.tsa.seasonal import seasonal_decomposedata=pd.read_csv("Electric_Production.csv")
monthly_data = data.IPG2211A2N.resample('M').mean().reset_index()# 将数据分成训练集和测试集
train_data = monthly_data['IPG2211A2N'][:-3]
test_data = monthly_data['IPG2211A2N'][-3:]# 拟合 ARIMA(1,1,1) 模型
model = ARIMA(train_data, order=(1,1,1))
model_fit = model.fit()# 预测过去三个月
forecast = model_fit.forecast(steps=3)
# 计算实际值和预测值之间的 MAPE
mape = mean_absolute_percentage_error(test_data, forecast)
print(f"Forecast: {forecast}")
print(f"Actual: {test_data}")
print(f"MAPE: {mape}")

我们使用平均绝对百分比误差 (MAPE) 作为评估预测准确性的指标。同样的方法可应用于其他数据集,从而确保我们预测方法的一致性。

利用 RNN 进行时间序列预测

递归神经网络(RNN)在时间序列预测中表现突出,因为它能通过隐藏状态动态记忆过去的信息。这与 SARIMAX 的线性建模方法形成鲜明对比,因为 RNN 可以以非线性方式对数据进行建模,使其在理解和预测随时间变化的模式方面表现出色。

下面,我们使用 RNN 对 “电力生产” 数据集进行预测,特别是针对过去三个月的数据进行验证,以评估模型的预测性能。

import torch
import torch.nn as nn
import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_absolute_percentage_error
from statsmodels.tsa.seasonal import seasonal_decompose
from torch.utils.data import DataLoader, TensorDataset# 假设 `monthly_data` 是包含时间序列列 'IPG2211A2N' 的 DataFrame
tmdata = monthly_data['IPG2211A2N'] 
data = tmdata.values.reshape(-1, 1) # 分解以去除季节性成分
result = seasonal_decompose(tmdata, model='additive', period=12)
deseasonalized = tmdata - result.seasonal# 对数据进行归一化处理
scaler = MinMaxScaler(feature_range=(-1, 1))
data_normalized = scaler.fit_transform(deseasonalized.values.reshape(-1, 1))# 将数据转换为序列
def create_sequences(data, seq_length):xs, ys = [], []for i in range(len(data)-seq_length-1):x = data[i:(i+seq_length)]y = data[i+seq_length]xs.append(x)ys.append(y)return np.array(xs), np.array(ys)seq_length = 12
X, y = create_sequences(data_normalized, seq_length)
X_train, X_test = X[:-3], X[-3-seq_length:-seq_length]
y_train, y_test = y[:-3], y[-3:]# Convert to PyTorch tensors
X_train = torch.FloatTensor(X_train)
y_train = torch.FloatTensor(y_train).view(-1)
X_test = torch.FloatTensor(X_test)
y_test = torch.FloatTensor(y_test).view(-1)class SimpleRNN(nn.Module):def __init__(self, input_size=1, hidden_layer_size=100, output_size=1):super(SimpleRNN, self).__init__()self.hidden_layer_size = hidden_layer_sizeself.rnn = nn.RNN(input_size, hidden_layer_size)self.linear = nn.Linear(hidden_layer_size, output_size)def forward(self, input_seq):rnn_out, _ = self.rnn(input_seq.view(len(input_seq) ,1, -1))predictions = self.linear(rnn_out.view(len(input_seq), -1))return predictions[-1]model = SimpleRNN()
criterion = nn.MSELoss()optimizer = torch.optim.Adam(model.parameters(), lr=0.018)
epochs = 220
for i in range(epochs):for seq, labels in zip(X_train, y_train):optimizer.zero_grad()y_pred = model(seq)single_loss = criterion(y_pred, labels.unsqueeze(-1))single_loss.backward()optimizer.step()if i % 10 == 0:print(f'epoch: {i:3} loss: {single_loss.item():10.8f}')model.eval()
preds_list = []
with torch.no_grad():for i in range(len(X_test)):seq = X_test[i].view(-1, 1, 1)  # Reshape to (seq_len, batch_size=1, features=1)pred = model(seq)preds_list.append(pred.item())# 将预测列表转换为用于反向缩放的 numpy 数组
preds_array = np.array(preds_list).reshape(-1, 1)
preds_inverse = scaler.inverse_transform(preds_array)# 对实际测试标签进行反变换
y_test_inverse = scaler.inverse_transform(y_test.numpy().reshape(-1, 1))# 计算 MAPE
mape = np.mean(np.abs((y_test_inverse - preds_inverse) / y_test_inverse)) * 100
print(f'MAPE: {mape}%')

以下是简化代码概述:

  • 预处理: 调整季节性并规范化数据,为 RNN 做准备。

  • 序列准备: 将数据转换为序列,用于 RNN 训练,模拟时间依赖关系。

  • RNN 架构: 利用 RNN 层进行时间处理,利用线性层进行预测。

  • 训练: 在历时上迭代以最小化损失,并通过反向传播更新模型。

  • 预测: 应用所学模式预测测试集的未来值。

  • 反变换: 将预测值调整回原始比例,以供评估。

  • 准确度评估: 采用 MAPE 量化模型的预测准确性。

利用 LSTM 进行时间序列预测

长短期记忆(LSTM)网络旨在通过更好地管理长期依赖性和异常值来改进递归神经网络(RNN)。然而,LSTM 的真正功效因数据集而异,这凸显了经验验证的必要性。在即将对 “电力生产 ”等数据集进行的研究中,我们的目标是对不同算法进行数据驱动的评估,纯粹关注经验结果而非理论预期。以下是为 LSTM 量身定制的 Python 代码示例:

class LSTMModel(nn.Module):def __init__(self, input_size=1, hidden_layer_size=100, output_size=1):super(LSTMModel, self).__init__()self.lstm = nn.LSTM(input_size, hidden_layer_size)self.linear = nn.Linear(hidden_layer_size, output_size)def forward(self, input_seq):lstm_out, _ = self.lstm(input_seq.view(len(input_seq), 1, -1))predictions = self.linear(lstm_out.view(len(input_seq), -1))return predictions[-1]model = LSTMModel()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
epochs = 180
# 接下来是训练循环和预测生成。

与 RNN 相比,LSTM 在编码方面的显著差异在于模型的构建。LSTM 包括nn.LSTM层,而不是 nn.RNN,专门应对学习时间序列数据中长期依赖关系的挑战。这一结构调整是在实际预测任务中发挥 LSTM 理论优势的关键。

使用 Facebook Prophet 进行时间序列预测

从理论上讲,Facebook Prophet 旨在通过处理非线性趋势、季节性变化和节假日影响来改进预测。它对不同业务预测要求的适应性,尤其是管理缺失数据和适应趋势突变的能力,受到了关注。据报道,Prophet 特别适用于以下业务预测环境:

  • 数据跨度从每月到每年,具有显著的季节性模式。

  • 可预测发生的有影响的节假日。

  • 诱发趋势变化的外部因素,如产品发布。

  • 接近饱和的增长趋势。

以下是将 Prophet 应用于 “电力生产” 数据集的 Python 代码:

start_date = '2020-01-01'
dates = pd.date_range(start=start_date, periods=len(monthly_data['IPG2211A2N']), freq='M')
df_prophet = pd.DataFrame(data={'ds': dates, 'y': monthly_data['IPG2211A2N'].values})# 用额外的季节性成分初始化Prophet模型
model = Prophet(yearly_seasonality=True, seasonality_prior_scale=0.2)# 添加月度季节性的示例
model.add_seasonality(name='monthly', period=30.5, fourier_order=8)  # 用数据帧拟合模型
模型.fit(df_prophet[:-3]) # 排除最后 3 个月进行验证# 为未来预测创建 DataFrame,包括最后 3 个月
future = model.make_future_dataframe(periods=3, freq='M')# 使用模型进行预测
预测 = model.predict(future)# 重点对最近 3 个月进行验证
forecast_last_3_months = forecast['yhat'][-3:].values# 过去 3 个月的实际值
actual_last_3_months = df_prophet['y'][-3:].values# 计算实际值和预测值之间的 MAPE
mape = mean_absolute_percentage_error(actual_last_3_months, forecast_last_3_months)print(f"Forecasted Values: {forecast_last_3_months}")
print(f"Actual Values: {actual_last_3_months}")
print(f"MAPE: {mape}")

影响预测的关键参数:

  • seasonality_prior_scale (0.2) :调整季节性的灵活性。较低的值会收紧季节性,有助于形成一致的模式,同时防止过度拟合。

  • fourier_order (8) :设置季节性模型的复杂性。较高的值可以捕捉到详细的波动,但也有过度拟合的风险。根据数据的季节性变化进行选择。

  • model.add_seasonality中的period(30.5) :定义添加季节性的周期长度,这里近似于一个月,根据数据的季节性频率定制。

使用注意力转换器进行时间序列预测

注意力转换器最初是为自然语言处理(NLP)而开发的,现在正被用于时间序列预测。从理论上讲,注意力变换器能够权衡不同输入数据点的重要性,从而能够细致入微地理解复杂的时间关系,这与 RNN 的顺序处理有所不同。

在时间序列中使用变形器还处于尝试阶段,目的是利用其注意力机制来预测不同数据集的趋势和季节性模式。

在此,我提供了将 Transformers 应用于 “电力生产” 数据集的代码:

class PositionalEncoding(nn.Module):def __init__(self, d_model, dropout=0.1, max_len=5000):super(PositionalEncoding, self).__init__()self.dropout = nn.Dropout(p=dropout)position = torch.arange(0, max_len).unsqueeze(1)div_term = torch.exp(torch.arange(0, d_model, 2) * -(math.log(10000.0) / d_model))pe = torch.zeros(max_len, 1, d_model)pe[:, 0, 0::2] = torch.sin(position * div_term)pe[:, 0, 1::2] = torch.cos(position * div_term)self.register_buffer('pe', pe)def forward(self, x):x = x + self.pe[:x.size(0)]return self.dropout(x)class TransformerModel(nn.Module):def __init__(self, input_dim, d_model, nhead, num_layers, dim_feedforward, dropout=0.1):super(TransformerModel, self).__init__()self.model_type = 'Transformer'self.pos_encoder = PositionalEncoding(d_model, dropout)encoder_layers = nn.TransformerEncoderLayer(d_model, nhead, dim_feedforward, dropout)self.transformer_encoder = nn.TransformerEncoder(encoder_layers, num_layers)self.encoder = nn.Linear(input_dim, d_model)self.d_model = d_modelself.decoder = nn.Linear(d_model, 1)def forward(self, src):src = self.encoder(src) * math.sqrt(self.d_model)src = self.pos_encoder(src)output = self.transformer_encoder(src)output = self.decoder(output)return outputmodel = TransformerModel(input_dim=1, d_model=64, nhead=4, num_layers=4, dim_feedforward=256, dropout=0.2)
train_data = TensorDataset(torch.FloatTensor(X_train), torch.FloatTensor(y_train))
train_loader = DataLoader(train_data, batch_size=16, shuffle=False)optimizer = optim.Adam(model.parameters(), lr=0.001)
criterion = nn.MSELoss()# Training loop
for epoch in range(120):model.train()total_loss = 0for batch, (data, targets) in enumerate(train_loader):optimizer.zero_grad()data = data.permute(1, 0, 2)  # Reshape for the transformer [seq_len, batch_size, features]output = model(data)loss = criterion(output.view(-1), targets)loss.backward()optimizer.step()total_loss += loss.item()if epoch % 10 == 0:print(f'Epoch: {epoch}, Loss: {total_loss / len(train_loader)}')# 预测和重新分级预测
model.eval()
preds = []
with torch.no_grad():for seq in torch.FloatTensor(X_test):seq = seq.unsqueeze(1)  # Shape to [seq_len, batch_size=1, features]pred = model(seq)pred_last = pred[-1, :, :].squeeze().item()preds.append(pred_last)preds_inverse = scaler.inverse_transform(np.array(preds).reshape(-1, 1))
seasonal_component = result.seasonal[-len(preds):].values.reshape(-1, 1)
final_predictions = preds_inverse + seasonal_componenty_test_actual = monthly_data['IPG2211A2N'][-len(preds):].values.reshape(-1, 1)
mape = np.mean(np.abs((y_test_actual - final_predictions) / y_test_actual)) * 100
print(f'MAPE: {mape}%')

以下是使用 Transformers 进行时间序列预测的关键步骤:

  • 位置编码: 为数据添加唯一的位置信息,帮助模型掌握序列顺序,而无需像 RNN 那样逐步处理数据。

  • transformer模型设置: 包括处理数据(编码器)和生成预测(解码器)的层,并根据时间序列的具体情况进行调整。

  • 模型训练: 包括在训练数据上优化模型,以减少预测误差。

  • 预测: 应用训练有素的模型预测未来值,重塑输入数据以符合转换器的预期。

  • 重新添加季节性: 将之前去除的季节性模式与预测重新整合,以准确反映现实世界的相关性。

  • 模型评估: 使用平均绝对百分比误差 (MAPE) 评估模型的性能。

结果与比较

在研究中,我们对一系列时间序列数据集采用了五种不同的预测方法。根据每个数据集的独特属性和初步验证的结果,对这些方法进行了微调。对于 RNN 和 LSTM 等神经网络方法,我们进行了多次迭代以减少训练过程的随机性,并采用平均 MAPE 来确定其性能。

所提供的 MAPE(平均绝对误差)值表总结了每种预测方法在不同数据集上的有效表现:

表(2) 模型性能 (MAPE)

研究结果摘要
  • RNN 和 Prophet: 这两种方法在准确性和一致性方面表现突出。RNN 尤其擅长处理复杂的数据集,而 Prophet 则在处理季节性较强的数据集时表现出色。

  • Transformers: 尽管 Transformers 在 NLP 中取得了成功,但在时间序列预测中的效果有限,这表明在应用于这一领域时需要进一步改进。

  • SARIMAX 和 Prophet: 这些方法适用于具有确定的 ARIMA 结构或较小规模的数据集,因为它们不太容易出现与神经网络相关的过拟合风险。

  • 周期/周期处理: 准确识别和整合周期/循环信息至关重要。与需要手动输入的 RNN 和 LSTM 不同,Prophet 和 SARIMAX 能够更好地自动考虑季节效应。

  • 参数重要性: 对于 Prophet,季节性先验尺度、周期和傅立叶阶数等参数对其季节性建模能力有很大影响。在 RNN 和 LSTM 中,学习率和 dropout=0.2 对实现有效学习和泛化起着至关重要的作用。

  • 计算速度: Prophet 和 SARIMAX 的计算速度更快,与基于神经网络的方法(如 RNN 和 LSTM)相比具有明显优势,后者需要更多时间对大型数据集进行训练。

其他见解

LSTM vs. RNN: 我们预期 LSTM 的表现会比 RNN 好,但我们的测试并没有清楚地表明这一点。这让我们再次思考 LSTM 是否更擅长处理长期模式和意外数据。即使在调整设置后,RNN 也能很好地适应,尤其是当我们改变学习率时,这对 LSTM 的影响并不大。

这些令人惊讶的结果让我很好奇,因此我创建了一个特殊的数据集,以测试 LSTM 在它们应该擅长的情况下是否比 RNN 更好。这个数据集具有长期重复模式和突发偏差(异常值),为 LSTM 的能力提供了严格的测试。

数据生成代码:
# 生成时间序列:用 70 个数据点模拟时间序列
n_points = 70
t = np.arange(n_points)
# 正弦波 + 线性趋势 + 噪音
data = 2 * np.sin(t / 8) + 0.1 * t + np.random.normal(0, 0.5, n_points)  
data[-5:] += np.array([3, -1, 2, -1, 2])  # Introducing outliers

在这个生成的数据集上运行 RNN 和 LSTM 模型后,我得到了以下结果:

LSTM MAPE:23.32%
RNN MAPE:33.65%

这些结果符合理论预期,即 LSTM 可增强长期依赖性管理和异常值处理能力。该实验强调了根据数据的具体特征选择正确模型的重要性。未来的研究将寻求用真实世界的数据场景来证实这些发现。

写在最后

在对 SARIMAX、RNN、LSTM、Prophet 和 Transformer 等时间序列预测方法的比较分析中,我们发现方法的选择对不同数据集的预测准确性有显著影响。RNN 和 Prophet 分别在处理复杂数据和季节性数据方面表现出色,而 LSTM 并不总是如预期那样优于 RNN。Transformers 在其 NLP 大本营以外的领域举步维艰,这表明它们需要适应时间序列预测。

我们的研究结果强调了选择适当模型和微调参数以适应当前数据集具体特征的重要性。尽管预计 LSTM 在管理长期依赖性方面具有优势,但我们的研究结果主张采用更细致的方法来选择模型。这一探索不仅挑战了现有的假设,还为进一步研究开辟了道路,从而在不断发展的时间序列分析领域提高预测精度。

相关文章:

时间序列预测模型比较分析:SARIMAX、RNN、LSTM、Prophet 及 Transformer

时间序列预测根据过去的模式预测未来事件。我们的目标是找出最佳预测方法,因为不同的技术在特定条件下表现出色。本文章将探讨各种方法在不同数据集上的表现,为你在任何情况下选择和微调正确的预测方法提供真知灼见。 我们将探讨五种主要方法&#xff1…...

快速了解redis,个人笔记

更多个人笔记:(仅供参考,非盈利) gitee: https://gitee.com/harryhack/it_note github: https://github.com/ZHLOVEYY/IT_note (基于mac展示,别的可以参考)接下来将直接…...

Dify依赖管理poetry切换为uv

Dify升级 1.3.0 后api的依赖管理从poetry切换为了 uv管理,但是官网暂时还没有更新。 升级 tag:Dify 1.3.0版本 在此记录一下 uv 依赖管理操作 使用方法 [重要事项] 在 v1.3.0 版本中,poetry 已被[ uv ](https://docs.astral.sh/uv/) 替代…...

VGA 接口静电防护方案

VGA(Video Graphics Array)即视频图形阵列,具有分辨率高、显示速 率快、颜色丰富等优点,亦称为 D-Sub 接口,在彩色显示器领域得到了广 泛的应用, 如笔记本、投影仪、LCD 液晶显示屏 等。VGA 接口主要用于连接 计算机与显示设备。当…...

MySQL 详解之用户、权限与审计:保障数据安全的基石

在数据库系统中,数据是核心资产,对其的访问必须受到严格控制。谁能连接到数据库?他们能看到哪些数据?能执行哪些操作(读、写、修改结构)?系统中的所有操作是否被记录以便追溯?这正是用户管理、权限系统和审计机制需要解决的问题。 在 MySQL 中: 用户 (Users): 负责认…...

力扣面试150题--环形链表和两数相加

Day 32 题目描述 思路 采取快慢指针 /*** Definition for singly-linked list.* class ListNode {* int val;* ListNode next;* ListNode(int x) {* val x;* next null;* }* }*/ public class Solution {public boolean hasCycle(ListNod…...

HMI与组态,自动化的“灵珠”和“魔丸”

在现代工业自动化领域,组态(Configuration)和人机界面(HMI,Human-Machine Interface)是两个核心概念,它们在智能化控制系统中发挥着至关重要的作用。尽管这两者看似简单,但它们的功能…...

AbMole| CU-CPT-8m(CAS号125079-83-6;目录号M9746)

CU-CPT-8m是一种特异性的TLR8(toll-like receptor 8)拮抗剂,其IC50值为67 nM,Kd值为220 nM。 生物活性 CU-CPT-8m是一种特异性的TLR8(toll-like receptor 8)拮抗剂,其IC50值为67 nM,…...

【网络入侵检测】基于源码分析Suricata的PCAP模式

【作者主页】只道当时是寻常 【专栏介绍】Suricata入侵检测。专注网络、主机安全,欢迎关注与评论。 1. 概要 👋 本文聚焦于 Suricata 7.0.10 版本源码,深入剖析其 PCAP 模式的实现原理。通过系统性拆解初始化阶段的配置流程、PCAP 数据包接收线程的创建与运行机制,以及数据…...

【滑动窗口+哈希表/数组记录】Leetcode 438. 找到字符串中所有字母异位词

题目要求 给定两个字符串 s 和 p,找到 s 中所有 p 的异位词的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 字母异位词是通过重新排列不同单词或短语的字母而形成的单词或短语,并使用所有原字母一次。 示例 1 输入:s…...

uniapp自定义封装tabbar

uniapp自定义封装tabbar 开发原因: 有很多时候 小程序并没有其类目 需要通过配置发布审核&#xff0c; ps&#xff1a;需要去掉项目pages.json tabbar配置&#xff0c;不然重进会显示默认&#xff0c;跳转页面不能uni.switchTab。 组件tabbar <template><viewclass&…...

uni-app云开发总结

uni-app云开发总结 云开发无非就三个概念&#xff1a;云数据库、云函数、云存储 uni-app中新增了一个概念叫做云对象&#xff0c;它其实就是云函数的加强版&#xff0c;它是导出的一个对象&#xff0c;对象中可以包含多个操作数据库的函数&#xff0c;接下来咱们就详细对uni-…...

uniapp-商城-37-shop 购物车 选好了 进行订单确认3 支付栏

支付栏 就是前面用的 car-Layout 在shop也用来这个组件 只是在那里用来的是购物车。 1、 样式 我们开始进入这个页面是点击的shop的购物篮 到这里就变成了支付栏 其实他们是同一个组件 只是做了样式区分 2、具体看看样式和代码 2.1 消失了购物车和改变了按钮名字 如何…...

搜索二叉树-key的搜索模型

二叉搜索树(Binary Search Tree, BST)是一种重要的数据结构&#xff0c;它有两种基本模型&#xff1a;Key模型和Key/Value模型。 一、Key模型 1.基本概念 Key模型是二叉搜索树中最简单的形式&#xff0c;每个节点只存储一个键值(key)&#xff0c;没有额外的数据值(value)。这…...

Qt ModbusSlave多线程实践总结

最近项目中用到了ModbusSlave&#xff0c;也就是Modbus从设备的功能&#xff0c;之前用的基本都是master设备&#xff0c;所以读取数据啥的用单线程就行了&#xff0c;用 void WaitHelper::WaitImplByEventloop(int msec) {QEventLoop loop;QTimer::singleShot(msec, &loop…...

Leetcode刷题记录18——接雨水

题源&#xff1a;https://leetcode.cn/problems/trapping-rain-water/description/?envTypestudy-plan-v2&envIdtop-100-liked 题目描述&#xff1a; 思路一&#xff1a; &#x1f31f; 本题核心思想&#xff1a;木桶效应 每个位置的“桶”&#xff1a;假设每个柱子的位…...

IntelliJ IDEA 中配置 Spring MVC 环境的详细步骤

以下是在 IntelliJ IDEA 中配置 Spring MVC 环境的详细步骤&#xff1a; 步骤 1&#xff1a;创建 Maven Web 项目 新建项目 File -> New -> Project → 选择 Maven → 勾选 Create from archetype → 选择 maven-archetype-webapp。输入 GroupId&#xff08;如 com.examp…...

全球玻璃纸市场深度洞察:环保浪潮下的材料革命与产业重构(2025-2031)

一、行业全景&#xff1a;从传统包装到绿色经济的战略支点 玻璃纸&#xff08;Cellulose Film&#xff09;&#xff0c;即再生纤维素薄膜&#xff0c;以木浆、棉浆等天然纤维素为原料&#xff0c;通过碱化、黄化、成型等工艺制成&#xff0c;兼具透明性、柔韧性及100%生物降解性…...

提示js方法未定义,但是确实<textarea>标签未闭合。

1、问题现象。 Uncaught ReferenceError: showOtherDismantleFn is not defined 但是这个方法&#xff0c;在代码中明明存在。 #if($!{isNewEnergy})#if($!{batteryName} 宁德时代)<button class"btn btn-info btn-xs" onclick"showNingDismantleFn()&quo…...

spring中的@bean注解详解

在Spring框架中&#xff0c;Bean注解是用于显式声明一个Bean的核心方式之一&#xff0c;尤其在基于Java的配置中。Spring框架中的Bean注解实现原理涉及多个核心机制&#xff0c;包括配置类解析、Bean定义注册、动态代理及依赖注入等 一、Bean注解的作用 Bean用于标注在方法上&…...

计算机网络中的DHCP是什么呀? 详情解答

目录 DHCP 是什么&#xff1f; DHCP 的工作原理 主要功能 DHCP 与网络安全的关系 1. 正面作用 2. 潜在安全风险 DHCP 的已知漏洞 1. 协议设计缺陷 2. 软件实现漏洞 3. 配置错误导致的漏洞 4. 已知漏洞总结 举例说明 DHCP 与网络安全 如何提升 DHCP 安全性 总结 D…...

uniapp-商城-38-shop 购物车 选好了 进行订单确认4 配送方式1

配送方式在订单确认页面最上方&#xff0c;可以进行选中配送还是自提&#xff0c;这里先看看配送。 代码样式&#xff1a; 可以看出来是通过组件来实现的。组件名字是&#xff1a;delivery-layout 1、建立组件文件夹和页面&#xff0c;delivery-layout这里就只有配送 2、具体…...

粒子群优化算法(Particle Swarm Optimization, PSO)的详细解读

最近研究基于进化算法的神经网络架构搜索&#xff0c;仔细阅读了TEVC2023年发表的一篇NAS搜索的文章&#xff0c;觉得收益颇多&#xff0c;对比NSGA-2&#xff0c;这里给出PSO的详细解释。【本人目前研究的是多目标进化算法&#xff0c;欢迎交流、留言】 文章题目是&#xff1…...

大模型在直肠癌预测及治疗方案制定中的应用研究

目录 一、引言 1.1 研究背景与意义 1.2 研究目的 1.3 研究方法与创新点 二、大模型技术概述 2.1 大模型的基本原理 2.2 常见大模型类型及特点 2.3 在医疗领域的应用进展 三、直肠癌预测相关数据收集与处理 3.1 数据来源 3.2 数据清洗与预处理 3.3 特征工程 四、大…...

【C++】继承----下篇

文章目录 前言一、实现一个不能继承的类二、友元与继承三、继承与静态成员四、多继承以及菱形继承问题1.继承模型&#xff1a;2.菱形继承的问题3.虚拟继承解决数据冗余和二义性的原理4.虚拟继承的原理 五、继承的总结和反思1.继承和组合 总结 前言 各位好呀!今天呢我们接着讲继…...

windows安装jax和jaxlib的教程(cuda)成功安装

本文你将解决3个问题&#xff1a;1、jaxlib没有安装的问题&#xff1b;2、python3.9以上&#xff08;不可忽略&#xff09;、cuda12.1&#xff08;可忽略&#xff09;以上配置要求不满足的问题&#xff1b;3、numpy版本太高的问题。 1、问题描述 当你直接pip install jax或者c…...

软考【网络工程师】2023年5月上午题答案解析

1、固态硬盘的存储介质是()。 A 光盘 B 闪存 C 软盘 D 磁盘 答案是 B。 固态硬盘(Solid State Drive),简称 SSD,是用固态电子存储芯片阵列制成的硬盘,其存储介质是闪存(Flash Memory)。闪存具有非易失性,即在断电后仍能保留存储的数据,且读写速度快、抗震性强、能…...

支付场景下,乐观锁的实现(简洁版)

1、问题描述 看到一个同事建的数据库表&#xff0c;好奇打开看看。 create table db_paycenter.t_pay_order_divide (id bigint auto_increment comment 主键id|20250402|XXXprimary key,user_id bigint not null comment user…...

AI视频技术赋能幼儿园安全——教师离岗报警系统的智慧守护

教师离岗报警系统如一位无形的守护者&#xff0c;实时监测教室动态&#xff0c;一旦发现教师离岗超30秒&#xff0c;立即通知园方&#xff0c;确保幼儿不被忽视。这套开源系统以高效检测和即时报警为核心&#xff0c;助力园所优化管理&#xff0c;增强家长信心&#xff0c;开启…...

SCI论文结构笔记

摘要五要素(Abstract)&#xff1a; 背景和研究问题研究目的研究方法研究结果结论和意义 引言&#xff08;Introduction)&#xff1a; 研究背景研究问题研究现状现有的研究的问题与不足本研究的研究目标文章结构 研究综述(Literature review): 选题的理由现存文献中可借鉴的…...

《修仙家族模拟器2》:游戏背景故事介绍!

《修仙家族模拟器2》构建了一个以修仙文明为根基的宗族传承世界&#xff0c;玩家将扮演家族初代掌舵者&#xff0c;在动态演变的修仙江湖中完成从凡俗世家到仙道巨擘的蜕变。以下为具体背景设定解析&#xff1a; 一、世界观架构&#xff1a;仙凡交织的修真宇宙 空间维度 游戏…...

Linux部署ragflow,从安装docker开始~

安装docker https://download.docker.com/linux/static/stable/x86_64/docker-28.0.1.tgz #首先创建一个文件夹&#xff0c;存放我们需要的各类文件,并切换到该目录 mkdir /project && cd /project #此时我们的工作目录已经切换到刚刚创建的文件夹下了&#xff0c;接…...

苹果iosApp提交审核常见问题--内购订阅篇

常见问题1- 准则2.1.1 Guideline 2.1 - Information Needed The app binary includes the PassKit framework for implementing Apple Pay, but we were unable to verify any integration of Apple Pay within the app. Next Steps If the app integrates the functionali…...

从代码学习深度学习 - 微调 PyTorch 版

文章目录 前言一、迁移学习与微调概念二、微调步骤解析三、实战案例:热狗识别3.1 数据集准备3.2 图像增强处理3.3 加载预训练模型3.4 模型重构3.5 差异化学习率训练3.6 对比实验分析总结前言 深度学习模型训练通常需要大量数据,但在实际应用中,我们往往难以获得足够的标记数…...

Registry镜像仓库的安装与使用

任务目标 &#xff08;1&#xff09;了解目前主流的镜像仓库 &#xff08;2&#xff09;掌握registry私有镜像仓库的部署与使用 任务实施 基础信息 Docker私有仓库个宿主机配置信息 主机名 IP地址 节点角色 registry 192.168.110.80 私有仓库 node1 192.168.110.9…...

java多线程(6.0)

目录 ​编辑 阻塞队列 阻塞队列概念 生产者消费者模型 阻塞队列的作用 阻塞队列的使用 阻塞队列的实现 阻塞队列 阻塞队列概念 阻塞队列是一种特殊的队列&#xff0c;同样遵循“先进先出”的原则&#xff0c;支持入队操作和出队操作和一些基础方法。在此基础上&#…...

tkinter的文件对话框:filedialog

诸神缄默不语-个人技术博文与视频目录 文章目录 一、前言二、tkinter.filedialog模块详解2.1 模块导入方式2.2 通用参数说明 三、五大核心函数实战3.1 选择单个文件 - askopenfilename()3.2 多文件选择 - askopenfilenames()3.3 保存文件对话框 - asksaveasfilename()3.4 选择目…...

HOW - 如何模拟实现 gpt 展示答案的交互效果

文章目录 产品设计维度核心目标实现方式主要靠一些技巧1. 用 emoji 做语义锚点2. 每个段落只传达一件事3. 有节奏地对话式切换4. 使用 Markdown 风格来排版5. 用“你”而不是“用户”说话 如果想实现类似体验&#xff08;比如写文档、教程、产品介绍&#xff09; 前端开发维度想…...

达梦数据库压力测试报错超出全局hash join空间,适当增加HJ_BUF_GLOBAL_SIZE解决

1.名词解释&#xff1a;达梦数据库中的HJ_BUF_GLOBAL_SIZE是所有哈希连接操作可用的最大哈希缓冲区大小&#xff0c;单位为兆字节&#xff08;MB&#xff09; 2.达梦压测报错&#xff1a; 3.找到达梦数据库安装文件 4.压力测试脚本 import http.client import multiprocessi…...

第11章 面向分类任务的表示模型微调

​​​​​​第1章 对大型语言模型的介绍第2章 分词和嵌入第3章 解析大型语言模型的内部机制第4章 文本分类第5章 文本聚类与主题建模第6章 提示工程第7章 高级文本生成技术与工具第8章 语义搜索与检索增强生成第9章 多模态大语言模型第10章 构建文本嵌入模型第12章 微调生成模…...

c#加密证件号的中间部分,改为*号

前言 使用场景&#xff1a;在我项目中&#xff0c;我需要给前端提供接口&#xff0c;所以我要吧证件号进行加密。例如&#xff1a;411421199510225612&#xff0c;这是一个身份证号&#xff0c;18为的&#xff0c;那么我加密完成之后就会是 411421********5612&#xff0c;类似…...

qt中写一个简易的计算器

以下是添加了详细代码注释的版本&#xff1a; cpp #include <iostream>using namespace std;定义加法函数&#xff08;已注释掉&#xff09; //int add(int a, int b) { // return a b; //}定义减法函数&#xff08;已注释掉&#xff09; //int min(int a, int b) {…...

[特殊字符] Docker 从入门到实战:全流程教程 + 项目部署指南(含镜像加速)

Docker 是现代 DevOps 的基石&#xff0c;应用广泛于微服务、CI/CD、K8s、云原生等场景。本文将从 0 到 1 手把手带你掌握 Docker 的核心知识点&#xff0c;并完成 Java Nginx 项目部署&#xff0c;适合新手与进阶开发者阅读与实战。 &#x1f4da; 目录 Docker 快速入门 入门…...

《R语言SCI期刊论文绘图专题计划》大纲

今天开始&#xff0c;我将和大家分享系统且详细的《R语言SCI期刊绘图专题教程》&#xff0c;内容会从基础到高阶应用&#xff0c;从配色美学到顶刊风格复现&#xff0c;确保大家可以学到高质量内容&#xff01;下面是大纲。 &#x1f4da;《R语言SCI期刊论文绘图专题计划》 第…...

从氛围到节奏:情绪化配乐网站指南

在影视、短视频、广告甚至游戏开发中&#xff0c;配乐的作用早已超越了简单的背景音效&#xff0c;它能够深刻地影响观众的情绪&#xff0c;为作品注入灵魂。但如何找到那些能够精准传达情绪、完美契合画面的配乐呢&#xff1f;今天&#xff0c;就让我们一起探索那些能够助力你…...

矩阵运营:抢占市场与流量的利器

还在为无法超越行业老大而苦恼&#xff1f;还在为市场份额难以扩大而焦虑&#xff1f;还在为流量匮乏、客资不足而发愁&#xff1f;别担心&#xff0c;矩阵运营就是你突破困局的关键&#xff01; 一、矩阵运营&#xff1a;颠覆传统的运营模式 在当今竞争激烈的商业环境中&…...

【2025最新面试操作系统八股】CPU利用率和load(负载)的区别,CPU利用率怎么算。

总结 负载&#xff08;Load&#xff09;和 CPU 利用率是衡量系统性能的两个不同的指标&#xff0c;它们从不同的角度反映了系统的状态。 CPU 利用率表示 CPU 正在执行指令的时间比例&#xff0c;即 CPU 忙碌的程度。它是一个百分比值&#xff0c;表示在某个时间间隔内&#x…...

ApplicationRunner的run方法与@PostConstruct注解

ApplicationRunner 的 run 方法与 PostConstruct 注解在 Spring Boot 中均用于初始化逻辑&#xff0c;但二者的 执行时机、作用范围 和 功能特性 存在显著差异。以下是详细对比分析&#xff1a; 一、核心差异对比 维度PostConstructApplicationRunner.run()触发时机Bean 实例化…...

【leetcode刷题日记】lc.73-矩阵置零

目录 1.题目 2.代码 1.题目 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]…...

配置 RDP 远程桌面协议连接ubuntu服务器桌面

文章目录 一、简介二、服务安装三、桌面安装小结 一、简介 RDP&#xff08;Remote Desktop Protocol&#xff0c;远程桌面协议&#xff09;是微软开发的一种专有协议&#xff0c;用于在网络上实现远程桌面访问&#xff0c;允许用户通过客户端设备&#xff08;如 Windows、Linu…...