目录

1、单一模型的局限性:混合架构的设计动机

2、LSTM 的时序特征提取:从原始序列到高阶表征

2.1、门控机制的时序过滤能力

2.2、隐藏状态的特征压缩作用

2.3、预训练的特征优化逻辑

3、SVM 的非线性映射:从高阶特征到预测输出

3.1、核函数对非线性关系的建模能力

3.2、小样本场景下的泛化优势

3.3、对冗余特征的 “免疫性”

4、混合模型的协同机制:1+1>2 的核心逻辑

4.1、特征传递的层级性

4.2、误差矫正的互补性

4.3、计算效率的平衡性

5、应用场景与理论延伸

6、完整代码

7、实验结果

8、补充:评估模式和训练模式的区别?

8.1、评估模式与训练模式的核心区别

8.2、特征提取时必须用评估模式的 3 个关键原因

8.2.1、避免特征随机性波动

8.2.2、保证特征分布与训练一致

8.2.3、确保特征完整度


时间序列预测是金融、气象、交通等领域的核心问题,其本质是通过挖掘数据中的时序规律,对未来状态进行推断。传统单一模型(如纯 LSTM 或纯 SVM)在处理复杂时序数据时往往存在局限性:LSTM 虽擅长捕捉长短期依赖,却可能因过度拟合时序噪声导致泛化能力不足;SVM 虽在非线性映射上表现优异,却难以直接处理原始时序序列的动态特征。本文基于 “LSTM+SVM” 混合模型的实现逻辑,从理论层面阐述其设计原理、协同机制及应用价值,揭示混合模型如何突破单一模型的瓶颈。

1、单一模型的局限性:混合架构的设计动机

时间序列数据的核心挑战在于时序依赖性非线性特征的双重复杂性。单一模型在应对这一挑战时存在明显短板:

模型类型核心优势局限性
LSTM(深度学习)1. 通过门控机制捕捉长短期时序依赖
2. 自动学习时序特征的动态演化规律
1. 对噪声敏感,易过度拟合时序波动
2. 高维输出特征的非线性映射能力有限
3. 训练需大量数据,小样本场景泛化性差
SVM(传统机器学习)1. 通过核函数实现低维到高维的非线性映射
2. 基于结构风险最小化,小样本泛化能力强
3. 对高维特征的冗余信息不敏感
1. 无法直接处理原始时序序列的动态依赖
2. 依赖人工特征工程,难以捕捉时序深层规律

混合模型的设计逻辑正是 “取长补短”:利用 LSTM 的时序特征提取能力处理动态依赖,再通过 SVM 的非线性拟合能力优化预测精度,形成 “特征提取 — 非线性映射” 的二级处理流程。

2、LSTM 的时序特征提取:从原始序列到高阶表征

LSTM(长短期记忆网络)作为循环神经网络(RNN)的变种,其核心价值在于通过门控机制解决传统 RNN 的 “梯度消失” 问题,实现对长序列依赖的有效捕捉。在混合模型中,LSTM 的角色是 “时序特征提取器”,其工作原理可分解为三个层次:

2.1、门控机制的时序过滤能力

LSTM 通过遗忘门、输入门和输出门的协同作用,动态筛选时序信息:

  • 遗忘门:过滤无关历史噪声(如股票价格的短期随机波动);
  • 输入门:保留关键新信息(如突发政策对价格的影响);
  • 输出门:生成当前时间步的有效特征表示。
    这种机制使 LSTM 能从原始序列(如代码中的收盘价、成交量、波动率)中提炼出蕴含时序规律的高阶特征(如趋势延续性、波动聚集性)。

2.2、隐藏状态的特征压缩作用

在代码实现中,LSTM 的最终输出是 “最后一层隐藏状态”(hn[-1]),其维度由hidden_size(如 64)控制。这一过程本质是特征压缩:将长度为 20 的原始序列(sequence_length=20)和 5 维特征(收盘价、MA10 等)压缩为 64 维的紧凑向量,既保留核心时序模式,又降低后续模型的计算复杂度。

2.3、预训练的特征优化逻辑

代码中 LSTM 通过全连接层(nn.Linear(hidden_size, 1))与 MSE 损失函数进行预训练,其目的并非直接预测,而是引导 LSTM 学习 “对预测有价值的特征”。这种 “有监督的特征学习” 确保提取的隐藏状态与目标变量(如收盘价)存在强相关性,为后续 SVM 的预测奠定基础。

3、SVM 的非线性映射:从高阶特征到预测输出

SVM(支持向量机)通过核函数实现低维特征到高维空间的非线性映射,在混合模型中承担 “最终预测器” 的角色。其与 LSTM 的协同逻辑体现在三个方面:

3.1、核函数对非线性关系的建模能力

代码中采用 RBF(径向基函数)核,其本质是通过非线性变换将 LSTM 输出的 64 维特征映射到更高维空间,使原本线性不可分的特征关系变得可分。例如,股票价格的 “趋势反转” 往往依赖于 “波动率放大 + 成交量骤增” 的联合条件,SVM 能通过核函数捕捉这种复杂交互特征,而 LSTM 单独预测时易忽略此类非线性组合。

3.2、小样本场景下的泛化优势

SVM 基于 “结构风险最小化” 原则,通过最大化分类间隔(回归场景中为最小化 ε- 不敏感损失)降低过拟合风险。在金融时间序列等小样本场景中(如代码中仅 500 条数据),SVM 能有效利用 LSTM 提取的紧凑特征,避免深度学习模型对数据量的过度依赖。

3.3、对冗余特征的 “免疫性”

LSTM 输出的高阶特征可能包含少量冗余信息(如重复的趋势特征),而 SVM 通过支持向量的选择机制,仅关注对预测起关键作用的特征组合,进一步提升模型的稳健性。

4、混合模型的协同机制:1+1>2 的核心逻辑

LSTM 与 SVM 的融合并非简单拼接,而是通过 “时序特征提取 — 非线性映射” 的流水线式协同,实现对时间序列复杂性的分层破解。其核心机制可概括为三个层面:

4.1、特征传递的层级性

原始数据(如收盘价、成交量)首先经 LSTM 处理,转化为蕴含时序规律的高阶特征(隐藏状态),再传递给 SVM 进行最终预测。这种 “原始数据→时序特征→预测结果” 的层级传递,使模型能分阶段处理数据的不同属性:LSTM 专注于 “时序动态性”,SVM 专注于 “特征非线性”,避免单一模型同时应对双重复杂性。

4.2、误差矫正的互补性

LSTM 的预测误差往往源于对短期噪声的过度拟合,而 SVM 的误差多源于对长周期趋势的捕捉不足。混合模型中,LSTM 的高阶特征过滤了部分噪声,SVM 的核函数又强化了对趋势的非线性建模,两者误差形成互补,最终降低整体预测偏差(如代码中通过 MSE 和 R² 评估的优化效果)。

4.3、计算效率的平衡性

LSTM 的训练复杂度随序列长度呈线性增长,而 SVM 的复杂度随样本量呈平方增长。混合模型中,LSTM 的特征压缩(如 64 维隐藏状态)大幅降低了 SVM 的输入维度,在保证精度的同时平衡了计算成本,使模型更适用于实时预测场景(如高频交易中的价格预测)。

5、应用场景与理论延伸

LSTM+SVM 混合模型的理论框架不仅适用于金融时间序列,还可推广至其他时序预测领域:

  • 气象预测:LSTM 提取气温、湿度的时序依赖,SVM 捕捉 “温度 - 降水” 的非线性关系;
  • 交通流量预测:LSTM 学习早晚高峰的周期性规律,SVM 建模特殊事件(如节假日)的突发波动;
  • 工业故障预测:LSTM 挖掘设备传感器数据的趋势变化,SVM 识别 “振动 - 温度” 的异常关联。

6、完整代码

"""
文件名: LSTM+SVM
作者: 墨尘
日期: 2025/7/27
项目名: d2l_learning
备注: 基于LSTM和SVM的混合模型进行时间序列预测,结合了深度学习和传统机器学习的优势
"""
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import torch
import torch.nn as nn
from sklearn.svm import SVR
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error, r2_score# 设置中文字体,确保图表中的中文正常显示
plt.rcParams["font.family"] = ["SimHei"]  # 指定默认中文字体
plt.rcParams["axes.unicode_minus"] = False  # 解决负号显示问题class LSTMFeatureExtractor(nn.Module):"""LSTM特征提取器:将时序数据转换为固定维度的特征向量,用于后续的SVM回归"""def __init__(self, input_size, hidden_size, num_layers=1, dropout=0.0):"""初始化LSTM特征提取器参数:input_size: 输入特征的维度hidden_size: LSTM隐藏层的维度num_layers: LSTM层数dropout: Dropout概率,用于防止过拟合"""super().__init__()# 定义LSTM层,batch_first=True表示输入格式为(batch, seq_len, feature)self.lstm = nn.LSTM(input_size=input_size,hidden_size=hidden_size,num_layers=num_layers,batch_first=True,dropout=dropout,bidirectional=False  # 使用单向LSTM)# 添加全连接层,将LSTM的隐藏状态映射到与目标变量相同的维度# 这用于训练LSTM学习有意义的特征表示self.fc = nn.Linear(hidden_size, 1)def forward(self, x):"""前向传播函数,定义数据如何通过网络参数:x: 输入张量,形状为(batch_size, sequence_length, input_size)返回:output: 预测值,形状为(batch_size, 1)"""# LSTM的输出格式为(output, (h_n, c_n))# output: 每个时间步的隐藏状态,形状为(batch_size, seq_len, hidden_size)# h_n: 最后一个时间步的隐藏状态,形状为(num_layers, batch_size, hidden_size)# c_n: 最后一个时间步的细胞状态,形状同上_, (hn, _) = self.lstm(x)# 提取最后一层的隐藏状态,形状调整为(batch_size, hidden_size)last_hidden = hn[-1]# 通过全连接层得到最终输出,形状为(batch_size, 1)output = self.fc(last_hidden)return outputdef create_sequences(df, target_col="Close", seq_len=20):"""将时间序列数据转换为监督学习格式(序列-目标对)参数:df: 包含特征的DataFrametarget_col: 目标变量列名seq_len: 序列长度(用于预测的历史时间步数)返回:X: 特征序列,形状为(samples, seq_len, features)y: 目标值,形状为(samples,)"""X, y = [], []for i in range(seq_len, len(df)):X.append(df.iloc[i - seq_len:i].values)  # 历史特征序列y.append(df.iloc[i][target_col])         # 对应的目标值return np.array(X), np.array(y)def plot_training_loss(losses, epochs):"""可视化训练过程中的损失变化"""plt.figure(figsize=(10, 5))plt.plot(range(epochs), losses, 'b-', linewidth=2)plt.title('训练损失变化')plt.xlabel('Epoch')plt.ylabel('损失值 (MSE)')plt.grid(True, linestyle='--', alpha=0.7)plt.tight_layout()plt.savefig('training_loss.png')  # 保存图表plt.close()def plot_prediction_vs_actual(dates, actual, predicted, title="预测值与真实值对比"):"""可视化预测结果与真实值对比"""plt.figure(figsize=(14, 6))plt.plot(dates, actual, 'g-', label='真实值', linewidth=2)plt.plot(dates, predicted, 'r--', label='预测值', linewidth=2)plt.title(title)plt.xlabel('日期')plt.ylabel('价格 (标准化后)')plt.legend()plt.grid(True, linestyle='--', alpha=0.7)plt.tight_layout()plt.savefig('prediction_results.png')  # 保存图表plt.close()def main():"""主函数:协调数据处理、模型训练和评估的整个流程"""# 步骤1: 生成虚拟金融数据print("正在生成虚拟金融数据...")date_range = pd.date_range(start="2023-01-01", periods=500, freq="D")price = np.cumsum(np.random.randn(500)) + 100  # 随机游走模拟股票价格volume = np.random.randint(100, 1000, size=500)  # 随机成交量data = pd.DataFrame({"Date": date_range,"Close": price,"Volume": volume}).set_index("Date")  # 设置日期为索引# 步骤2: 添加技术指标print("正在计算技术指标...")data["MA10"] = data["Close"].rolling(window=10).mean()  # 10日移动平均线data["Return"] = data["Close"].pct_change()  # 每日收益率data["Volatility"] = data["Return"].rolling(window=10).std()  # 10日滚动波动率data.dropna(inplace=True)  # 删除包含NaN的行,确保数据完整性# 步骤3: 数据可视化print("正在生成数据可视化图表...")# 可视化1: 收盘价与MA10plt.figure(figsize=(12, 5))plt.plot(data.index, data["Close"], label="收盘价", color="red")plt.plot(data.index, data["MA10"], label="10日移动平均线", color="green")plt.title("收盘价 vs. 10日移动平均线")plt.legend()plt.tight_layout()plt.savefig("price_vs_ma10.png")plt.close()# 可视化2: 成交量plt.figure(figsize=(12, 3))plt.bar(data.index, data["Volume"], color="blue")plt.title("成交量随时间变化")plt.tight_layout()plt.savefig("volume.png")plt.close()# 可视化3: 收益率分布plt.figure(figsize=(8, 4))sns.histplot(data["Return"], bins=50, kde=True, color="purple")plt.title("收益率分布")plt.tight_layout()plt.savefig("return_distribution.png")plt.close()# 可视化4: 波动率plt.figure(figsize=(12, 3))plt.plot(data.index, data["Volatility"], color="green")plt.title("波动率随时间变化 (10日滚动标准差)")plt.tight_layout()plt.savefig("volatility.png")plt.close()# 步骤4: 数据预处理print("正在进行数据预处理...")features = ["Close", "MA10", "Return", "Volatility", "Volume"]  # 选择用于预测的特征sequence_length = 20  # 使用前20天的数据预测下一天# 数据标准化:将所有特征缩放到均值为0,标准差为1的分布scaler = StandardScaler()scaled_data = scaler.fit_transform(data[features])scaled_df = pd.DataFrame(scaled_data, index=data.index, columns=features)# 构造序列数据:将时间序列转换为监督学习格式X, y = create_sequences(scaled_df, "Close", sequence_length)# 划分训练集和测试集(按时间顺序划分,保持数据的时序性)test_size = 0.2split_idx = int(len(X) * (1 - test_size))X_train, X_test = X[:split_idx], X[split_idx:]y_train, y_test = y[:split_idx], y[split_idx:]test_dates = data.index[-len(y_test):]  # 记录测试集对应的日期print(f"训练集大小: {len(X_train)}, 测试集大小: {len(X_test)}")# 步骤5: 转换为PyTorch张量X_train_tensor = torch.tensor(X_train, dtype=torch.float32)X_test_tensor = torch.tensor(X_test, dtype=torch.float32)# 增加一个维度,使其形状为(batch_size, 1),与模型输出匹配y_train_tensor = torch.tensor(y_train, dtype=torch.float32).unsqueeze(1)# 步骤6: 定义并训练LSTM特征提取器print("正在训练LSTM特征提取器...")input_size = len(features)  # 输入特征维度hidden_size = 64  # LSTM隐藏层维度lstm = LSTMFeatureExtractor(input_size, hidden_size)optimizer = torch.optim.Adam(lstm.parameters(), lr=0.001)  # Adam优化器loss_fn = nn.MSELoss()  # 均方误差损失函数,用于回归问题n_epochs = 30  # 训练轮数training_losses = []  # 记录每轮的训练损失for epoch in range(n_epochs):lstm.train()  # 设置为训练模式optimizer.zero_grad()  # 梯度清零output = lstm(X_train_tensor)  # 前向传播loss = loss_fn(output, y_train_tensor)  # 计算损失loss.backward()  # 反向传播optimizer.step()  # 更新参数training_losses.append(loss.item())if epoch % 5 == 0:print(f"[Epoch {epoch+1}/{n_epochs}] Loss: {loss.item():.4f}")# 可视化训练损失变化plot_training_loss(training_losses, n_epochs)# 步骤7: 提取LSTM特征print("正在提取LSTM特征...")lstm.eval()  # 设置为评估模式with torch.no_grad():  # 不计算梯度,节省内存和计算资源# 提取LSTM最后一层的隐藏状态作为特征# 这些特征将被用于训练SVM模型_, (train_feats, _) = lstm.lstm(X_train_tensor)train_feats = train_feats[-1].numpy()  # 取最后一层的隐藏状态_, (test_feats, _) = lstm.lstm(X_test_tensor)test_feats = test_feats[-1].numpy()# 步骤8: 训练SVM回归模型print("正在训练SVM回归模型...")# 使用RBF核函数的SVM回归器,C是正则化参数,epsilon控制允许的误差范围svm = SVR(kernel="rbf", C=100, epsilon=0.01)svm.fit(train_feats, y_train)  # 训练SVM模型# 步骤9: 模型评估print("正在评估模型性能...")predictions = svm.predict(test_feats)  # 预测测试集# 计算评估指标mse = mean_squared_error(y_test, predictions)  # 均方误差r2 = r2_score(y_test, predictions)  # 决定系数,解释方差的比例print(f"\nSVM模型评估结果:")print(f"MSE: {mse:.4f}, R²: {r2:.4f}")# 步骤10: 可视化预测结果plot_prediction_vs_actual(test_dates, y_test, predictions, "标准化价格预测值与真实值对比")print("模型训练和评估完成!")print("图表已保存至当前目录下的PNG文件中")if __name__ == "__main__":main()  # 程序入口点

7、实验结果

8、补充:评估模式和训练模式的区别?

8.1、评估模式与训练模式的核心区别

模型在训练和评估时的行为存在本质差异,主要体现在随机性操作的启用与否:

模式核心特点典型随机性操作
训练模式(train mode)启用随机性操作,用于模型参数学习1. Dropout 层随机丢弃部分神经元
2. Batch Normalization 使用当前批次的均值和方差
3. 随机数据增强(如随机裁剪、翻转)
评估模式(eval mode)关闭随机性操作,用于稳定推理1. Dropout 层不丢弃神经元(保留全部特征)
2. Batch Normalization 使用训练时保存的全局均值和方差
3. 关闭数据增强(使用原始数据)

8.2、特征提取时必须用评估模式的 3 个关键原因

8.2.1、避免特征随机性波动

训练模式中的Dropout等操作会随机丢弃部分神经元输出,导致同一输入在不同时刻提取的特征不一致。例如:

  • 训练模式下,对同一图像连续提取 10 次特征,会得到 10 个略有差异的特征向量(因 Dropout 随机丢弃的神经元不同);
  • 评估模式下,Dropout 关闭,同一输入始终得到相同的特征向量,保证特征的稳定性。

特征的一致性是后续任务(如分类、聚类、SVM 训练)的基础,否则会因特征波动导致下游模型学习混乱。

8.2.2、保证特征分布与训练一致

Batch Normalization(BN 层) 在训练和评估时的计算方式不同:

  • 训练时,BN 层使用当前批次数据的均值和方差进行归一化;
  • 评估时,BN 层使用训练过程中累计的全局均值和方差(而非当前批次的统计量)。

若特征提取时仍用训练模式,BN 层会用测试数据的批次统计量归一化特征,导致特征分布与模型训练时的分布不一致(分布偏移)。例如,训练时某特征的全局均值为 0.5,而测试批次的均值为 0.8,直接使用测试批次均值会导致特征整体偏移,影响下游任务效果。

8.2.3、确保特征完整度

训练模式中,部分层的设计是为了防止过拟合(如 Dropout),而非特征提取。例如:

  • 若在特征提取时启用 Dropout,会导致部分关键特征被随机丢弃,提取的特征向量缺失重要信息;
  • 评估模式下,所有神经元正常工作,能完整保留模型学到的特征表达,确保特征的完整性和代表性。

 

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

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

相关文章

如何查看docker实例是否挂载目录,以及挂载了哪些目录

一条命令即可一次性列出当前容器里所有挂载点&#xff1a; docker inspect <容器ID或名称> --format{{range .Mounts}}{{printf "%-8s %-35s -> %s\n" .Type .Source .Destination}}{{end}}示例输出&#xff1a; bind /host/owrt/src …

Opentrons 模块化平台与AI技术助力智能移液创新,赋能AAW™自动化工作站

在生命科学领域加速拥抱自动化的关键节点&#xff0c;全球开源实验室自动化领导者 Opentrons 携手全球领先生命科学公司默克生命科学&#xff0c;重磅推出 AAW™智能自动化液体处理平台。这一战略合作的核心技术引擎 ——Opentrons Flex 第三代全自动移液工作站&#xff0c;正以…

C++学习笔记(八:函数与变量)

往篇内容&#xff1a; C学习笔记&#xff08;一&#xff09; 一、C编译阶段※ 二、入门案例解析 三、命名空间详解 四、C程序结构 C学习笔记&#xff08;二&#xff09; 五、函数基础 六、标识符 七、数据类型 补充&#xff1a;二进制相关的概念 sizeof 运算符简介 补…

智慧施工:施工流程可视化管理系统

图扑智慧施工全流程可视化管理系统&#xff0c;通过可视化界面&#xff0c;可直观掌握各工序衔接进度、资源调配情况&#xff0c;快速识别违规作业、设备故障等风险点 —— 如塔吊运行半径重叠、深基坑支护位移预警等。同时&#xff0c;系统支持施工方案模拟推演&#xff0c;对…

单链表的冒泡排序实现:从原理到代码详解

单链表的冒泡排序实现&#xff1a;从原理到代码详解 引言 单链表作为一种常见的数据结构&#xff0c;其排序操作因节点无法随机访问&#xff08;需通过指针遍历&#xff09;而与数组排序存在差异。冒泡排序因其实现简单、无需额外空间&#xff08;仅需指针操作&#xff09;&…

如何在 Ubuntu 24.04 或 22.04 上安装和使用 GDebi

APT 是 Ubuntu 上安装需要外部依赖项的 Debian 包的一种方式,但还有另一种选择,即 GDebi。本文将介绍如何在 Ubuntu 24.04 上安装 GDebi,以及如何使用它来安装 .deb 包所需的依赖项。 什么是 GDebi? GDebi 是默认的 .deb 包安装器 DPKG 的轻量级替代品。与 DPKG 不同,GD…

俄罗斯方块游戏开发(面向对象编程)

摘要本设计基于MATLAB面向对象编程技术&#xff0c;开发了一款具备完整游戏逻辑的俄罗斯方块游戏。通过类封装实现游戏核心模块&#xff08;方块管理、游戏板状态、碰撞检测等&#xff09;&#xff0c;采用旋转矩阵实现方块变形&#xff0c;结合MATLAB图形用户界面&#xff08;…

背包DP之多重背包

背包DP之多重背包一、多重背包基础认知1.1 问题定义1.2 核心特征二、基础解法&#xff1a;暴力拆分2.1 核心思路2.2 代码实现2.3 局限性分析三、优化解法&#xff1a;二进制拆分3.1 优化原理3.2 拆分步骤3.3 代码实现3.4 复杂度分析四、二进制拆分过程五、多重背包的变种与应用…

Ansible 变量指南:声明、优先级、作用域与最佳实践(一)

Ansible 变量的声明 前言 全面理解 Ansible 变量是编写高效、可维护 Playbook 的关键。由于最近使用 Ansible 比较多&#xff0c;在变量问题上踩了不少坑&#xff0c;也因此对变量的声明&#xff0c;优先级和作用域有了更深的理解。姑且总结一下&#xff0c;分享给大家&#…

[极客大挑战 2019]FinalSQL--布尔盲注

直接看题可以看到题目给了提示盲注&#xff01;那么接下来就是寻找注入点了&#xff01;那么不能发现注入点就是id了&#xff01;注入类型为数值型注入&#xff01;这里直接尝试盲注。但是这里and被过滤了&&也不行。问了几个师傅说用or&#xff0c;但是空格被过滤了&am…

再谈fpga开发(状态机的应用)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】前面说过&#xff0c;fpga上面最基础的部分是寄存器&#xff0c;而所有寄存器存在每一个clock下&#xff0c;都有被翻转的可能性。至于这些寄存器是…

TCP如何解决网络切换问题

一、传统TCP的网络切换问题核心问题&#xff1a;TCP 连接基于四元组&#xff08;源IP、源端口、目的IP、目的端口&#xff09;&#xff0c;IP 变化导致连接失效二、改进方案与技术演进1. MPTCP&#xff08;多路径TCP&#xff09; - 主流解决方案核心机制&#xff1a;单连接多路…

【Linux】常用命令(一)

【Linux】常用命令 一1. ls1.1 ls -a 显示所有文件及其目录1.2 ls -A 不显示当前目录和父目录1.3 ls -d 显示目录本身&#xff0c;而不是显示其内部内容1.4 ls -i 显示文件的inode属性信息1.4.1 实际用途场景1.5 ls -l 显示文件的详细属性信息1.6 ls -R 递归显示所有子文件1.7 …

Window 部署 coze-stdio(coze 开发平台)

参考链接 https://github.com/coze-dev/coze-studio/wiki/2.-%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B https://github.com/coze-dev/coze-studio/wiki/3.-%E6%A8%A1%E5%9E%8B%E9%85%8D%E7%BD%AE 环境说明 Docker&#xff1a;28.3.2 系统&#xff1a;Window 11 配置要求 CP…

【Git】Git LFS的使用

一、简介 Git LFS&#xff08;Git Large File Storage&#xff09;是由 GitHub 开发的一款 Git 扩展工具&#xff0c;旨在帮助开发者更高效地管理仓库中的大文件。传统 Git 会将文件的每个版本完整存储在仓库历史中&#xff0c;导致大文件&#xff08;如音频、视频、数据集、二…

不坑盒子:Word里1秒制作“花括号”题目,多音字组词、形近字组词……

1. 30秒看懂它能干啥 用“不坑盒子”插件&#xff0c;在 Word 里输入&#xff1a; 乐,l(快乐),yu(音乐);长,chng(长短),zhǎng(长大)点一下【总分关系】&#xff0c;瞬间出现左边是“乐”右边并列两行拼音括号的花括号结构&#xff1b;再点【并列关系】&#xff0c;又能做出只…

Gateway网关层灰度方案—xx互联网医院系统灰度发布设计与思路详解

通过之前技术的积累&#xff0c;终于开始了本文的编写&#xff0c;如果对灰度、负载均衡、上下文传递、网关不太理解&#xff0c;可以先学习博主的以下博客内容。共勉&#xff1a; 企业级 Java 应用灰度发布设计方案与实践全解析《Spring 中上下文传递的那些事儿》 Part 1&…

学习游戏制作记录(改进投掷剑的行为)7.27

1.实现剑跟随飞行方向旋转修改剑的预制体使剑的朝向对准右x轴Sword_Skill_Contorl脚本&#xff1a;private void Update(){transform.right rb.velocity;//时刻更新位置}2.实现剑插入地面或者敌人修改预制体为触发器Sword_Skill_Contorl脚本&#xff1a;private bool canRotat…

嵌入式软件面试八股文

目录 一、指针函数和函数指针 二、指针的大小 三、sizeof 和 strlen 区别 四、数组指针和指针数组 五、C语言里面内存分配的方式 六、struct结构体和union联合体的区别 八、数组和链表的区别 九、写一个宏这个红返回输入参数比较小的一个 十&#xff0c;使用#include<…

Gradle#Plugin

查看任务来自那个插件 /gradlew tasks --all <taskName>Java Plugin Java Library Plugin