数学建模优秀论文算法-LSTM算法

LSTM算法入门教程:从原理到应用的完整指南

1. 背景溯源:为什么需要LSTM?

在LSTM出现之前,循环神经网络(RNN)是处理序列数据(如文本、时间序列、语音)的主流模型。RNN的核心思想是"带记忆的神经网络"------每个时间步的输出不仅依赖当前输入,还依赖上一时间步的"隐状态"(即模型对过去信息的总结)。

但RNN有个致命缺陷:长序列的梯度消失/爆炸 。假设我们用RNN处理一个长句子(如"我去年在巴黎买的包包,今天不小心丢了"),当模型处理到"丢了"时,需要关联前面的"包包"才能理解语义。但RNN的梯度是通过"链式法则"逐时间步传递的(梯度 = 当前步梯度 × 上一步权重 × ... × 第一步权重)。如果序列很长,梯度会像多米诺骨牌一样快速衰减(趋近于0)或膨胀(趋近于无穷大),导致模型无法学习到长距离依赖关系(即早期信息无法传递到后期)。

为解决这个问题,1997年德国学者Hochreiter和Schmidhuber提出了长短期记忆网络(Long Short-Term Memory, LSTM) 。它通过设计"记忆细胞"和"门控机制",让模型能选择性保留或遗忘信息,从而有效缓解梯度消失,捕捉长序列中的关键依赖。

2. 核心思想:用"记忆细胞+门"控制信息流动

LSTM的核心设计可以用一个通俗比喻理解:

把LSTM想象成一个带"笔记本"和"三个开关"的处理器------

  • 笔记本(Cell State):用于存储长期记忆(如"去年买的包包"),信息沿"笔记本"稳定传递,不会轻易消失;
  • 三个开关(门):控制信息的"遗忘"(要不要删笔记本里的旧内容)、"输入"(要不要加新内容到笔记本)、"输出"(要不要把笔记本里的内容告诉下一个处理器)。

更正式的定义:LSTM通过三个门控单元 (遗忘门、输入门、输出门)和一个记忆细胞 (Cell State),实现对序列信息的选择性记忆与遗忘。其中:

  • 门控单元 :用sigmoid函数输出0~1之间的值(0=完全关闭,1=完全打开),控制信息的"开关";
  • 记忆细胞:用加法更新(而非RNN的乘法),让梯度能直接传递,避免消失。

3. 算法原理:逐模块拆解LSTM

LSTM的结构按**时间步(Time Step)**展开:对于序列x_1, x_2, ..., x_T(如文本中的每个词、时间序列中的每个时刻值),LSTM会逐个处理x_t,并更新自身的"记忆"(细胞状态C_t)和"当前理解"(隐状态h_t)。

以下是每个模块的详细原理(所有公式中的[a, b]表示向量拼接,表示元素-wise乘法,即两个向量对应位置相乘):

3.1 基础符号定义

在开始前,先明确输入、输出和参数的符号:

  • x_t:第t时间步的输入(如文本中第t个词的嵌入向量,维度d_x);
  • h_{t-1}:第t-1时间步的隐状态(模型对x_1~x_{t-1}的"理解",维度d_h);
  • C_{t-1}:第t-1时间步的细胞状态(模型的"长期记忆",维度d_h);
  • W_*:权重矩阵(如W_f是遗忘门的权重,维度d_h × (d_h + d_x));
  • b_*:偏置向量(如b_f是遗忘门的偏置,维度d_h);
  • σ(·):sigmoid激活函数(输出0~1,用于门控);
  • tanh(·):双曲正切函数(输出-1~1,用于生成候选信息,压缩值范围避免梯度爆炸)。

3.2 模块1:遗忘门(Forget Gate)------ 该忘什么?

作用 :决定从旧记忆C_{t-1})中遗忘哪些信息。比如处理文本"我去年买了苹果,今天想吃____"时,遗忘门会学习"遗忘"无关的"去年",保留关键的"苹果"。

计算步骤 :将上一时刻的隐状态h_{t-1}与当前输入x_t拼接,通过sigmoid函数输出遗忘门控值 f_t(0~1):ft=σ(Wf⋅[ht−1,xt]+bf) f_t = \sigma\left(W_f \cdot [h_{t-1}, x_t] + b_f\right) ft=σ(Wf⋅[ht−1,xt]+bf)

  • W_f:遗忘门的权重矩阵,学习"哪些输入/历史信息需要遗忘";
  • b_f:遗忘门的偏置,调整门控的默认状态(如默认更倾向于遗忘还是保留)。

3.3 模块2:输入门(Input Gate)------ 该记什么?

作用 :决定将新信息x_t)中的哪些内容存入新记忆C_t)。输入门分两步:先"选内容"(哪些新信息重要),再"生成候选内容"(具体的新信息)。

步骤1:输入门控(选内容)

sigmoid函数输出输入门控值 i_t(0~1),控制哪些新信息可以进入记忆细胞:it=σ(Wi⋅[ht−1,xt]+bi) i_t = \sigma\left(W_i \cdot [h_{t-1}, x_t] + b_i\right) it=σ(Wi⋅[ht−1,xt]+bi)

步骤2:候选记忆(生成内容)

tanh函数生成候选细胞状态 \tilde{C}_t(-1~1),代表"第t时间步的新候选信息":C~∗t=tanh⁡(WC⋅[h∗t−1,xt]+bC) \tilde{C}*t = \tanh\left(W_C \cdot [h*{t-1}, x_t] + b_C\right) C~∗t=tanh(WC⋅[h∗t−1,xt]+bC)

  • tanh的作用:将值压缩到-1~1之间,避免数值过大导致梯度爆炸;
  • W_C:候选记忆的权重矩阵,学习"如何从输入/历史中提取新信息"。

3.4 模块3:细胞状态更新------ 整合旧记忆与新信息

作用 :将"遗忘后的旧记忆"与"筛选后的新信息"整合,得到新的长期记忆 C_t。这是LSTM的核心创新 :用加法(而非RNN的乘法)更新记忆,让梯度能直接传递,避免消失。

计算公式:Ct=ft⊙Ct−1+it⊙C~t C_t = f_t \odot C_{t-1} + i_t \odot \tilde{C}_t Ct=ft⊙Ct−1+it⊙C~t

  • 第一项f_t ⊙ C_{t-1}:旧记忆中"被保留的部分"(f_t接近1则保留,接近0则遗忘);
  • 第二项i_t ⊙ \tilde{C}_t:新信息中"被选中的部分"(i_t接近1则加入,接近0则忽略);
  • 加法:将旧记忆与新信息叠加,而非覆盖,确保长期信息不丢失。

3.5 模块4:输出门(Output Gate)------ 该输出什么?

作用 :决定从新记忆C_t)中提取哪些信息,作为当前时间步的输出 (隐状态h_t)。隐状态h_t是模型对"到第t步为止的序列"的浓缩理解 ,会传递给下一时间步(h_{t+1}),或作为任务的输出(如文本分类取最后一步的h_T)。

计算步骤

  1. sigmoid函数输出输出门控值 o_t(0~1),控制哪些记忆可以输出:ot=σ(Wo⋅[ht−1,xt]+bo) o_t = \sigma\left(W_o \cdot [h_{t-1}, x_t] + b_o\right) ot=σ(Wo⋅[ht−1,xt]+bo)
  2. 将新细胞状态C_ttanh压缩到-1~1,再乘以输出门控值o_t,得到当前隐状态 h_t:ht=ot⊙tanh⁡(Ct) h_t = o_t \odot \tanh\left(C_t\right) ht=ot⊙tanh(Ct)

4. 完整模型求解步骤:从输入到输出

LSTM的求解过程是逐时间步迭代 的:从第1步到第T步,依次处理每个输入x_t,更新记忆C_t和隐状态h_t

以下是完整步骤 (以序列x_1~x_T为例):

4.1 步骤1:初始化参数与状态

在处理序列前,需要初始化模型参数初始状态

  • 参数初始化 :权重矩阵W_f, W_i, W_C, W_o随机小值 (如Xavier初始化),偏置b_f, b_i, b_C, b_o初始化为0(或小值);
  • 状态初始化 :初始细胞状态C_0和初始隐状态h_0均初始化为全0向量(或根据任务调整,如用预训练的词嵌入初始化)。

4.2 步骤2:逐时间步迭代(关键!)

对每个时间步t = 1, 2, ..., T,执行以下操作:

1. 拼接输入与历史隐状态

将上一时刻的隐状态h_{t-1}与当前输入x_t拼接,得到向量[h_{t-1}, x_t](维度为d_h + d_x)。

2. 计算遗忘门f_t

用公式(3.2)计算遗忘门控值,决定遗忘哪些旧记忆。

3. 计算输入门与候选记忆

用公式(3.3-1)计算输入门控i_t,用公式(3.3-2)计算候选记忆\tilde{C}_t

4. 更新细胞状态C_t

用公式(3.4)整合旧记忆与新信息,得到新的长期记忆。

5. 计算输出门与当前隐状态h_t

用公式(3.5-1)计算输出门控o_t,再用公式(3.5-2)计算当前隐状态h_t

4.3 步骤3:输出结果

根据任务类型,LSTM的输出可以是:

  • 最后一步的隐状态 h_T:适用于序列分类(如文本情感分析,用整个序列的最终理解判断情感);
  • 所有步的隐状态 h_1~h_T:适用于序列生成/标注(如机器翻译,每个步的输出对应目标序列的一个词;或词性标注,每个词对应一个词性)。

5. 适用边界:LSTM适合解决什么问题?

LSTM不是"万能模型",它的优势和局限性同样明显:

5.1 适合的场景

LSTM的核心优势是捕捉长序列的依赖关系,因此适合以下问题:

(1)序列数据任务
  • 自然语言处理(NLP):文本分类、机器翻译、命名实体识别(如从"我在巴黎买了包包"中识别"巴黎"是地点)、情感分析;
  • 时间序列预测:股票价格预测、天气预测、电力负荷预测(需要用过去多天的数据预测未来);
  • 语音处理:语音识别(将语音序列转为文本序列)、语音合成;
  • 视频分析:动作识别(视频帧是时间序列,需要捕捉动作的连续变化)。

5.2 不适合的场景

以下情况建议优先选择其他模型:

(1)非序列数据
  • 图像分类:图像是空间数据(像素的位置关系是空间的,不是时间的),用CNN更合适;
  • 表格数据(Tabular Data):如信用卡欺诈检测(数据是行/列的表格,无顺序依赖),用XGBoost、LightGBM或MLP更高效。
(2)短序列且无长依赖

如果序列长度很短(如3~5步),且不需要捕捉长距离关系(如"1+2=?"这样的简单序列),RNN甚至MLP(多层感知机)的效果可能与LSTM相当,但计算成本更低。

(3)计算资源受限

LSTM的参数数量比RNN多(三个门+细胞状态),训练时间更长。如果你的数据量小(如<1万条)或算力有限(如只有CPU),可以考虑更轻量的模型(如GRU,LSTM的简化版)。

6. 关键结论与常见误区

6.1 核心结论

  • LSTM的本质 :通过"记忆细胞+门控机制"实现选择性记忆,解决RNN的长依赖问题;
  • LSTM的优势:梯度通过细胞状态的加法直接传递,缓解梯度消失;
  • LSTM的参数共享 :每个时间步的权重(W_f, W_i等)是共享的(所有时间步用同一套参数),因此能泛化到任意长度的序列。

6.2 常见误区纠正

  • 误区1 :LSTM完全解决了梯度消失?不,LSTM缓解了梯度消失,但未完全解决。如果序列极长(如>1000步),梯度仍可能衰减,但比RNN好很多。
  • 误区2 :门控值是手动设置的?不,门控的权重(W_f, W_i等)是模型自动学习的------通过训练数据,模型会学会"哪些信息该忘、该记"。
  • 误区3 :隐状态h_t等于细胞状态C_t?不,C_t长期记忆 (完整的笔记本),h_t当前理解 (笔记本的摘要)。h_tC_t经过输出门筛选后的结果,只包含当前需要的信息。

7. 总结:LSTM的价值

LSTM是序列建模的里程碑模型,它的设计思想(门控机制、记忆细胞)为后续的模型(如GRU、Transformer)奠定了基础。对于刚入门的小白来说,理解LSTM的核心逻辑(选择性记忆),比记住公式更重要------当你能用"笔记本+开关"的比喻解释LSTM时,就真正掌握了它的本质。

下一步建议:找一个简单的序列任务(如用LSTM预测股票价格、或做文本情感分析),尝试手动推导每个时间步的计算,或用可视化工具(如TensorFlow Playground)观察LSTM的门控值变化,加深理解!

案例介绍

用LSTM预测模拟的正弦波时间序列,输入为连续时间步的正弦值,输出为下一时刻的正弦值,验证LSTM对长序列依赖的捕捉能力。

python 复制代码
import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense
from tensorflow.keras.optimizers import Adam
import matplotlib.pyplot as plt

# 生成模拟时间序列数据
def generate_data(seq_length=50, num_samples=1000):
    """
    生成正弦波时间序列数据
    :param seq_length: 每个样本的输入序列长度
    :param num_samples: 样本总数
    :return: 训练输入X(三维数组: [样本数, 时间步, 特征数])、训练输出y(二维数组: [样本数, 1])
    """
    # 生成连续的时间点
    time_steps = np.linspace(0, num_samples * 0.1, num_samples + seq_length)
    # 生成正弦波数据
    data = np.sin(time_steps)
    data = data.reshape(-1, 1)  # 转为列向量,特征数为1

    X, y = [], []
    # 构造输入序列和对应的目标值
    for i in range(len(data) - seq_length):
        X.append(data[i:i+seq_length])  # 取连续seq_length个点作为输入
        y.append(data[i+seq_length])     # 下一个点作为输出
    # 转为numpy数组
    X = np.array(X)
    y = np.array(y)
    return X, y

# 划分训练集和测试集
def split_data(X, y, test_ratio=0.2):
    """
    划分训练集和测试集
    :param X: 输入数据
    :param y: 输出数据
    :param test_ratio: 测试集比例
    :return: X_train, y_train, X_test, y_test
    """
    split_idx = int(len(X) * (1 - test_ratio))
    X_train, X_test = X[:split_idx], X[split_idx:]
    y_train, y_test = y[:split_idx], y[split_idx:]
    return X_train, y_train, X_test, y_test

# 构建LSTM模型
def build_lstm_model(input_shape):
    """
    构建LSTM回归模型
    :param input_shape: 输入数据的形状(时间步, 特征数)
    :return: LSTM模型
    """
    model = Sequential()
    # 添加LSTM层,隐藏单元数64,输入形状为input_shape
    model.add(LSTM(units=64, input_shape=input_shape, return_sequences=False))
    # 添加全连接输出层,输出维度1
    model.add(Dense(units=1))
    # 编译模型,优化器用Adam,损失函数用均方误差
    model.compile(optimizer=Adam(learning_rate=0.001), loss='mean_squared_error')
    return model

# 训练模型
def train_model(model, X_train, y_train, epochs=50, batch_size=32):
    """
    训练LSTM模型
    :param model: 构建好的LSTM模型
    :param X_train: 训练输入
    :param y_train: 训练输出
    :param epochs: 训练轮数
    :param batch_size: 批次大小
    :return: 训练历史
    """
    history = model.fit(X_train, y_train, epochs=epochs, batch_size=batch_size, validation_split=0.1, verbose=0)
    return history

# 预测并可视化结果
def predict_and_plot(model, X_test, y_test):
    """
    预测测试集并可视化结果
    :param model: 训练好的LSTM模型
    :param X_test: 测试输入
    :param y_test: 测试输出
    :return: None
    """
    # 预测测试集
    y_pred = model.predict(X_test, verbose=0)
    # 可视化
    plt.figure(figsize=(10, 6))
    # 绘制真实值
    plt.plot(y_test, label='True', color='blue')
    # 绘制预测值
    plt.plot(y_pred, label='Predicted', color='red', linestyle='--')
    plt.title('LSTM Time Series Prediction')
    plt.xlabel('Sample Index')
    plt.ylabel('Sine Value')
    plt.legend()
    plt.grid(True)
    plt.show()

# 主程序入口
if __name__ == "__main__":
    # 生成数据
    seq_length = 50  # 输入序列长度
    X, y = generate_data(seq_length=seq_length, num_samples=1000)

    # 划分数据集
    X_train, y_train, X_test, y_test = split_data(X, y, test_ratio=0.2)

    # 构建模型
    input_shape = (seq_length, 1)  # 输入形状: (时间步, 特征数)
    lstm_model = build_lstm_model(input_shape=input_shape)

    # 训练模型
    train_model(lstm_model, X_train, y_train, epochs=50, batch_size=32)

    # 预测并可视化
    predict_and_plot(lstm_model, X_test, y_test)

代码解析:基于LSTM的正弦波时间序列预测


1. 代码整体框架与数学建模背景

这段代码是时间序列单步预测任务 的典型实现,核心目标是验证LSTM对周期性序列(正弦波)长依赖关系的捕捉能力。代码遵循数据生成→数据集划分→模型构建→训练→预测可视化的完整建模流程,结构清晰,符合数学建模竞赛的工程化标准。


2. 逐模块深度解析

2.1 生成模拟时间序列数据 generate_data()
python 复制代码
def generate_data(seq_length=50, num_samples=1000):
    time_steps = np.linspace(0, num_samples * 0.1, num_samples + seq_length)
    data = np.sin(time_steps)
    data = data.reshape(-1, 1)  # 特征数=1

    X, y = [], []
    for i in range(len(data) - seq_length):
        X.append(data[i:i+seq_length])  # 输入:连续seq_length个时间步
        y.append(data[i+seq_length])     # 输出:下一个时间步的值
    X = np.array(X)
    y = np.array(y)
    return X, y

数学与建模逻辑解析

  • 时间序列生成
    • time_stepsnp.linspace 生成均匀间隔的时间点,时间范围为 [0, num_samples×0.1],总长度为 num_samples + seq_length(预留足够长的序列构造样本)。
    • data = np.sin(time_steps) 生成周期性正弦波,模拟真实世界的周期类时间序列(如温度、电流等)。
  • 样本构造
    • 输入X :每个样本为连续 seq_length 个时间步的正弦值,形状为 [seq_length, 1](1个特征:正弦值本身)。
    • 输出y :对应样本的下一时刻 正弦值,形状为 [1]
    • 最终 X 为三维数组 [样本数, seq_length, 1](Keras LSTM要求输入必须是3D张量 :样本数×时间步×特征数),y 为二维数组 [样本数, 1](单输出回归任务)。
  • 参数设计seq_length=50 是关键参数,代表模型需要学习的历史依赖长度(捕捉50步内的周期性特征)。

2.2 划分训练集与测试集 split_data()
python 复制代码
def split_data(X, y, test_ratio=0.2):
    split_idx = int(len(X) * (1 - test_ratio))
    X_train, X_test = X[:split_idx], X[split_idx:]
    y_train, y_test = y[:split_idx], y[split_idx:]
    return X_train, y_train, X_test, y_test

关键注意事项

  • 时间序列数据集不能随机划分,必须保持时间顺序(前80%训练,后20%测试),否则会出现"未来信息泄漏"(模型用未来数据训练,导致测试结果虚假优化)。
  • 该划分方式符合时间序列建模的基本准则,确保模型验证的真实性。

2.3 构建LSTM回归模型 build_lstm_model()
python 复制代码
def build_lstm_model(input_shape):
    model = Sequential()  # 序贯模型:层的线性堆叠
    model.add(LSTM(units=64, input_shape=input_shape, return_sequences=False))
    model.add(Dense(units=1))
    model.compile(optimizer=Adam(learning_rate=0.001), loss='mean_squared_error')
    return model

LSTM核心参数与建模逻辑

  • LSTM层参数
    • units=64:LSTM单元的隐藏状态维度(记忆容量),经验取值为2的幂次(64/128/256),平衡模型复杂度与计算效率。
    • input_shape=(seq_length, 1):输入序列的形状,与generate_data的输出匹配。
    • return_sequences=False:仅返回最后一个时间步的输出(用于单步预测;若为多步预测或堆叠LSTM,则需设为True)。
  • 输出层Dense(units=1) 是全连接层,将LSTM的64维输出映射为1维的预测值(回归任务无需激活函数)。
  • 模型编译
    • 优化器Adam(learning_rate=0.001) 是自适应学习率优化器,收敛快且稳定,数学建模中应用最广泛。
    • 损失函数mean_squared_error(MSE) 是回归任务的标准损失,公式为:[
      \text{MSE} = \frac{1}{N} \sum_{i=1}^N (y_{\text{true},i} - y_{\text{pred},i})^2
      ]
      用于衡量预测值与真实值的平方误差,符合本任务的"连续值预测"目标。

2.4 训练模型 train_model()
python 复制代码
def train_model(model, X_train, y_train, epochs=50, batch_size=32):
    history = model.fit(X_train, y_train, epochs=epochs, batch_size=batch_size, validation_split=0.1, verbose=0)
    return history

训练过程解析

  • epochs=50:模型遍历完整训练集的次数,确保充分学习周期性规律。
  • batch_size=32:每次梯度更新所用的样本数,小批量训练可提高收敛稳定性。
  • validation_split=0.1:从训练集随机划分10%作为验证集,用于监控训练过程中的过拟合情况。
  • verbose=0:关闭训练日志输出,保持代码运行简洁。

2.5 预测与可视化 predict_and_plot()
python 复制代码
def predict_and_plot(model, X_test, y_test):
    y_pred = model.predict(X_test, verbose=0)
    plt.figure(figsize=(10, 6))
    plt.plot(y_test, label='True', color='blue')
    plt.plot(y_pred, label='Predicted', color='red', linestyle='--')
    plt.title('LSTM Time Series Prediction')
    plt.xlabel('Sample Index')
    plt.ylabel('Sine Value')
    plt.legend()
    plt.grid(True)
    plt.show()

结果呈现逻辑

  • model.predict(X_test) 生成测试集的预测值 y_pred
  • 可视化通过对比蓝色真实值曲线红色虚线预测值曲线,直观展示LSTM对正弦波周期性的捕捉能力:若两条曲线重叠度高,说明模型成功学习了时间序列的长依赖关系。
  • 该图是数学建模论文中结果展示的核心图表,能直接反映模型效果。

2.6 主程序入口
python 复制代码
if __name__ == "__main__":
    # 1. 生成数据:序列长度50,样本数1000
    X, y = generate_data(seq_length=50, num_samples=1000)

    # 2. 划分数据集:训练集80%,测试集20%
    X_train, y_train, X_test, y_test = split_data(X, y, test_ratio=0.2)

    # 3. 构建模型:输入形状(50,1)
    input_shape = (50, 1)
    lstm_model = build_lstm_model(input_shape=input_shape)

    # 4. 训练模型:50轮,批量32
    train_model(lstm_model, X_train, y_train, epochs=50, batch_size=32)

    # 5. 预测并可视化结果
    predict_and_plot(lstm_model, X_test, y_test)

流程串联:主程序按"数据→划分→建模→训练→预测"的顺序调用模块,参数与业务目标(验证LSTM长依赖捕捉能力)严格匹配,确保代码可复现、逻辑清晰。


3. 建模关键技术点与注意事项
  1. LSTM的长依赖优势:正弦波的周期性依赖历史50步的信息,传统的RNN容易出现"梯度消失",无法学习长依赖;LSTM通过输入门、遗忘门、输出门的设计,解决了长序列训练的梯度问题,因此适合本任务。
  2. 输入维度要求 :Keras LSTM强制要求输入为3D张量 (样本数×时间步×特征数),代码中data.reshape(-1,1)X 的三维构造是关键细节,必须严格遵守。
  3. 时间序列划分原则:绝对不能随机打乱时间顺序,否则模型会学习到未来信息,导致测试结果无效。
  4. 模型复杂度平衡units=64 是经验值,若增大至128会提升模型容量,但可能导致过拟合;epochs=50 需结合验证集损失调整,避免训练不足或过拟合。

4. 代码改进方向(数学建模竞赛拓展)
  1. 多步预测:当前为单步预测(预测下一时刻),可修改为多步预测(如预测未来10步),需调整输出层维度和样本构造逻辑。
  2. 特征工程:可加入时间特征(如时间戳、周期项),提升模型对周期性的捕捉能力。
  3. 模型优化 :尝试堆叠LSTM层(需将前层return_sequences=True)、加入Dropout层抑制过拟合、调整学习率策略等。
  4. 评价指标:除MSE外,可加入MAE(平均绝对误差)、RMSE(均方根误差)等回归任务常用指标,更全面评估模型效果。

该代码是时间序列LSTM建模的"模板级"实现,理解其原理后可快速迁移到真实数据集(如股票、气象、工业数据等)的建模任务中。

相关推荐
t198751284 小时前
大规模MIMO系统中最优波束形成编码的解析
数学建模
柯西极限存在准则7 小时前
第二章 数学与工程基础
数学建模
咋吃都不胖lyh7 小时前
多臂老虎机算法(Multi-Armed Bandit, MAB)详解
数学建模
泰迪智能科技9 小时前
分享|高校数学建模实验室建设整体解决方案
数学建模
2301_7644413310 小时前
Python实现深海声弹射路径仿真
python·算法·数学建模
木头左19 小时前
LSTM量化交易策略中时间序列预测的关键输入参数分析与Python实现
人工智能·python·lstm
木头左1 天前
基于LSTM的多维特征融合量化交易策略实现
人工智能·rnn·lstm
我也要当昏君1 天前
时间复杂度
算法·数学建模
您好啊数模君1 天前
数学建模优秀论文算法-广度优先搜索(BFS)
数学建模·广度优先搜索(bfs)