基于BP神经网络的信号分类系统
项目简介
本项目是一个基于MATLAB开发的机器学习应用,旨在利用误差反向传播(BP)神经网络算法对含噪信号进行自动分类。系统通过模拟生成多种类型的时序信号,提取关键的时域特征,并构建多层前馈神经网络模型进行训练和预测。该项目展示了从数据生成、特征工程、数据预处理、模型构建、训练优化到结果可视化分析的完整机器学习工作流。
功能特性
- 多类型信号模拟:能够自动生成正弦波、方波和线性调频(Chirp)信号,并叠加高斯白噪声以模拟真实环境中的信号干扰。
- 时域特征提取:自动计算信号的六维统计特征(均值、标准差、RMS、峭度、偏度、波形因子),将高维时序数据转换为低维特征向量。
- 智能数据预处理:包含数据集的随机划分(训练集/测试集)、标签的独热编码(One-Hot)处理以及数据的归一化操作。
- BP神经网络分类器:构建包含隐含层和输出层的前馈神经网络,使用Softmax函数输出分类概率,适应多分类任务。
- 高性能训练算法:采用Levenberg-Marquardt算法加速网络收敛,结合均方误差(MSE)作为性能指标。
- 多维度可视化分析:提供原始波形展示、训练收敛曲线、混淆矩阵热力图以及预测标签对比图,全方位评估模型性能。
系统环境要求
- MATLAB R2018b 或更高版本
- Deep Learning Toolbox (原 Neural Network Toolbox)
- Signal Processing Toolbox
使用方法
- 确保MATLAB路径中包含本项目的脚本文件。
- 直接运行主函数。
- 系统将自动执行数据生成、处理、训练和测试全过程。
- 运行结束后,控制台会输出训练集MSE误差和测试集准确率,并弹出两个图形窗口:一个展示部分特征的散点分布,另一个展示详细的系统性能分析图表。
---
实际上线功能与实现逻辑
本项目的主程序严格按照以下逻辑流程执行:
1. 信号生成与数据集构建
程序首先设置随机种子以确保结果可复现。随后生成三类基础信号,每类150个样本,信号长度为1024点:
- 正弦波 (Sine):频率在10Hz至12Hz之间随机波动。
- 方波 (Square):频率在5Hz至6Hz之间随机波动。
- 线性调频信号 (Chirp):频率随时间线性变化。
- 噪声叠加:所有信号均叠加了强度为0.5的高斯白噪声,增加了分类的挑战性。
2. 特征提取工程
系统不直接使用原始波形数据作为网络输入,而是通过自定义函数提取每条信号的6个时域特征,形成特征矩阵:
- 均值:反映信号的直流分量。
- 标准差:反映信号的波动程度。
- 均方根 (RMS):反映信号的能量大小。
- 峭度 (Kurtosis):衡量信号分布的尖尾程度,对冲击成分敏感。
- 偏度 (Skewness):衡量信号分布的不对称性。
- 波形因子:RMS与绝对平均值的比值,反映波形形状。
此外,程序会绘制标准差与峭度的二维散点图,以此直观展示不同类别信号在特征空间中的分布情况。
3. 数据预处理
- 数据转置:将数据调整为神经网络工具箱所需的格式(列代表样本)。
- 独热编码:将类别标签(1, 2, 3)转换为One-Hot向量(如 [1;0;0]),以便于多分类网络训练。
- 数据集划分:随机打乱数据顺序,按70%作为训练集,30%作为测试集。
- 归一化:使用 MapMinMax 算法将训练数据映射到 [-1, 1] 区间,并将相同的映射参数应用于测试集,消除特征量纲差异对网络权重更新的影响。
4. BP网络模型构建与配置
- 使用
feedforwardnet 构建前馈神经网络。 - 网络结构:设有一个隐含层,包含15个神经元。
- 激活函数:隐含层使用正切S型函数 (
tansig),输出层使用Softmax函数 (softmax),确保输出结果不仅能分类,还能表示属于各类别的概率。 - 训练算法:指定
trainlm (Levenberg-Marquardt) 算法,该算法结合了梯度下降和牛顿法的优点,收敛速度快且精度高。 - 参数设定:最大迭代次数设为1000,目标误差设为1e-5,为了便于自定义绘图,关闭了默认的训练弹窗。
5. 模型训练与测试
- 利用训练集数据和标签对网络进行迭代训练,不断更新权值和阈值以最小化均方误差。
- 将预处理后的测试集输入训练好的网络,获取预测输出。
- 通过寻找输出向量中的最大值索引确定预测类别,并与真实标签对比计算分类准确率。
6. 结果可视化
系统最终生成一个综合分析图表,包含四个子图:
- 原始波形片段:展示三类信号在含噪情况下的时域波形。
- 训练收敛曲线:对数坐标下展示MSE随迭代次数(Epochs)下降的趋势。
- 混淆矩阵:以热力图形式展示真实类别与预测类别的对应关系,并在格点中显示具体样本数,用于分析误判情况。
- 预测对比图:选取部分测试样本,在同一坐标系中绘制真实标签和预测标签,直观展示分类吻合度。
---
关键代码分析
extract_features 函数
该函数是特征工程的核心。它接收原始信号矩阵(NxL),通过循环遍历每一个样本,分别计算Mean、Std、RMS、Kurtosis、Skewness和Shape Factor。这些特征不仅涵盖了信号的基本统计特性,还包含的高阶统计量(峭度和偏度),能够有效区分不同形态的波形(如方波和正弦波在峭度上有显著差异)。
神经网络配置细节
代码中显式设置了
net.layers{2}.transferFcn = 'softmax'。这是多分类问题的关键配置,它保证了输出层的输出值总和为1,且每个值介于0和1之间,从而可以解释为样本属于某一类的概率。配合 One-Hot 编码的目标向量,使得网络能够通过交叉熵(隐含在性能评估中)或MSE有效地学习分类边界。
visualize_results 函数
该函数采用了高级绘图技巧,利用
subplot 将多维度的评估指标整合在一个窗口中。特别是在绘制混淆矩阵时,没有简单调用工具箱函数,而是手动计算混淆矩阵数值,并使用
imagesc 和
text 函数绘制热力图,展示了自定义数据可视化的实现能力。