【TCN与LSTM例程】TCN(时间卷积网络)与LSTM(长短期记忆)训练单输入单输出,用于拟合一段信号,便于降噪。MATLAB

代码实现了基于TCN(时间卷积网络)和LSTM(长短期记忆网络)的信号降噪和拟合,并对两种方法的效果进行对比分析。

文章目录

程序详解

主要实现步骤

  1. 数据生成(第7-10行)
  • 生成2000个点的合成信号:sin(t) + 0.3*sin(3*t)
  • 添加高斯噪声(标准差0.15)模拟真实场景
  • signal_clean:无噪声的理想信号(作为标签)
  • signal_noise:含噪声的观测信号(作为输入)
  1. 数据预处理(第12-20行)
  • 采用滑窗方法构建监督学习样本
  • 窗口大小win=1(代码中较小,实际可调整)
  • 输入X:过去win个时刻的噪声观测值
  • 标签Y:当前时刻的真实无噪声值
  • 目的:训练模型通过历史噪声数据预测当前时刻的干净信号
  1. 训练集与验证集划分(第22-28行)
  • 80%数据用于训练
  • 20%数据用于验证和测试

TCN网络实现

网络架构

复制代码
输入层 → 卷积层1(32滤波器) → ReLU 
      → 卷积层2(32滤波器) → ReLU 
      → 卷积层3(1滤波器) → 展平 → 回归输出

关键特点

  • 使用Padding="causal"(因果填充):确保只使用过去信息,不泄露未来数据
  • 三层卷积逐步提取时序特征
  • 最后一层输出单一预测值

训练配置

  • 优化器:Adam
  • 学习率:0.001
  • 批量大小:32
  • 训练轮数:1000

LSTM网络实现

网络架构

复制代码
序列输入 → LSTM层1(12单元,输出序列) → Dropout(0.3)
        → LSTM层2(6单元,输出最后状态) → 全连接(32) 
        → ReLU → 全连接(1) → 回归输出

关键特点

  • 双层LSTM:第一层提取序列特征,第二层聚合信息
  • Dropout:防止过拟合(随机失活30%神经元)
  • 学习率调度:每40轮衰减到原来的0.3倍

效果评估

  1. 预测对比图
    展示四条曲线:
  • 理想值(无噪声真实信号)
  • 原始观测数据(含噪声)
  • TCN预测结果
  • LSTM预测结果
  1. 误差分析
    计算三种误差:
  • error_:原始噪声误差
  • error_TCN:TCN预测误差
  • error_LSTM:LSTM预测误差
  1. 统计特性
    输出六项指标:
  • 各方法的误差均值(反映系统偏差)
  • 各方法的误差标准差(反映波动性)
  1. CDF曲线(累积分布函数)
  • 通过直方图统计误差分布
  • 绘制累积概率曲线
  • 用于评估误差的概率分布特性

运行结果

两种方法的训练曲线:

信号曲线:

各方法的信号误差曲线:

MATLAB部分代码

部分代码如下:

matlab 复制代码
% TCN(时间卷积网络)与LSTM(长短期记忆)
% 单输入单输出,用于拟合一段信号,便于降噪
% 作者:matlabfilter
% 2025-11-17/Ver1 

clear; clc; close all;
rng(0);
%% 生成时间序列数据(带噪声)
N = 2000;
t = linspace(0, 20*pi, N);
signal_clean = sin(t) + 0.3*sin(3*t);
signal_noise = signal_clean + 0.15*randn(size(t));

% 根据过期的点信息来对当前点滤波
win = 1;

X = zeros(win, 1, 1, N-win);
Y = zeros(1, N-win);

for i = 1:N-win
    X(:,i) = signal_noise(i:i+win-1);
    Y(i) = signal_clean(i+win);   % 用无噪声信号作为标签,模拟"不确定标签"
end

%% 分割训练与验证集
numTrain = floor(0.8*(N-win));
XTrain = X(:,1:numTrain);
YTrain = Y(1:numTrain);

XVal   = X(:,numTrain+1:end);
YVal   = Y(numTrain+1:end);

%% 构建 TCN 网络
numFilters = 32;
filterSize = 3;

layers = [
    sequenceInputLayer(1, "Name","input")

    convolution1dLayer(filterSize, numFilters, "Padding","causal", "Name","conv1")
    reluLayer("Name","relu1")

    convolution1dLayer(filterSize, numFilters, "Padding","causal", "Name","conv2")
    reluLayer("Name","relu2")

    convolution1dLayer(filterSize, 1, "Padding","causal", "Name","conv3")
    flattenLayer("Name","flatten")
    regressionLayer("Name","output")
];

lgraph = layerGraph(layers);

完整代码

如需帮助,或有导航、定位滤波相关的代码定制需求,请点击联系作者:

相关推荐
胖好白1 小时前
【RK3588开发】模型部署全流程
linux·人工智能
橘子真甜~1 小时前
C/C++ Linux网络编程6 - poll解决客户端并发连接问题
服务器·c语言·开发语言·网络·c++·poll
sensen_kiss1 小时前
INT305 Machine Learning 机器学习 Pt.9 Probabilistic Models(概率模型)
人工智能·机器学习·概率论
vvoennvv1 小时前
【Python TensorFlow】 BiTCN-LSTM双向时间序列卷积长短期记忆神经网络时序预测算法(附代码)
python·神经网络·tensorflow·lstm·tcn
非著名架构师1 小时前
智慧气象护航:构建陆海空立体交通气象安全保障体系
大数据·人工智能·安全·疾风气象大模型4.0·疾风气象大模型·风光功率预测
tech-share2 小时前
基于pytorch 自建AI大模型
人工智能·深度学习·机器学习·gpu算力
夏洛克信徒2 小时前
从 “工具” 到 “代理”:Gemini 3.0 重构 AI 能力边界,开启智能协作新纪元
大数据·人工智能·神经网络
AI浩2 小时前
回归基础:让去噪生成模型真正去噪
人工智能·数据挖掘·回归
ekprada2 小时前
DAY 16 数组的常见操作和形状
人工智能·python·机器学习