基于小波时间散射网络的ECG 信号分类 程序运行环境为MATLAB r2021b 该程序使用小波时间散射网络和支持向量机分类器对人体心电图 (ECG)信号进行分类。 在小波散射中,数据通过一系列的小波变换、非线性化和平均化过程,以产生时间序列的低方差表示。 小波时间散射产生了对输入信号微小变化不敏感的信号表示,而几乎不会影响到分类准确率,效果比卷积神经网络等深度学习模型要好。 程序中使用的数据为 PhysioNet公开数据集。 本程序使用从3种 ECG 数据:心律失常数据、充血性心力衰竭数据和正常窦性心律数据,共使用来自3个 PhysioNet 数据库的162条ECG 记录:MIT-BIH心律失常数据库、MIT-BIH正常窦性心律数据库和BIDMC充血性心力衰竭数据库。 共有96个心律失常患者的信号,30个充血性心力衰竭患者的信号,以及36个正常窦性心律患者的信号,目标就是训练分类器来区分心律失常 (ARR)、充血性心力衰竭 (CHF)和正常窦性心律 (NSR)3类信号。 几个样本的波形,小波时间散射网络滤波器组中的小波滤波器的波形,小波时间散射网络分类结果的混淆矩阵如图所示,准确率达到了99.92%。

你绝对想不到,让计算机看懂心电图的关键竟藏在"信号变形术"里。不同于传统深度学习的暴力计算,今天要聊的小波时间散射网络更像是个信号炼金师——它能将心电图波形反复折叠、淬炼,最终提取出连医生都难以察觉的特征密码。

先看实战代码片段(数据预处理部分):

% 加载三类ECG信号
[arr_signals, ~] = load_physionet_data('mitdb');
[chf_signals, ~] = load_physionet_data('chf2db');
[nsr_signals, ~] = load_physionet_data('nsrdb');

% 统一信号长度至5000个采样点
target_length = 5000;
signals = [cellfun(@(x) x(1:min(target_length,end)), arr_signals, 'UniformOutput', false),...
           cellfun(@(x) x(1:min(target_length,end)), chf_signals, 'UniformOutput', false),...
           cellfun(@(x) x(1:min(target_length,end)), nsr_signals, 'UniformOutput', false)];

这段代码藏着两个玄机:一是跨数据库的数据对齐策略,通过动态截断保证不同来源信号的长度统一;二是采用原始波形直接处理,没有常见的降噪步骤——这正是小波散射的厉害之处,它自带噪声免疫力。

接下来是核心武器登场时刻:

% 构建小波时间散射网络
sf = waveletScattering2('SignalLength', 5000,...
                        'InvarianceScale', 0.5,...
                        'QualityFactors', [4 1],...
                        'OversamplingFactor', 2,...
                        'OptimizePath', true);

这个滤波器工厂的参数设定暗藏杀机:0.5秒的尺度不变性保证特征对心率波动的鲁棒性;[4 1]的品质因子让滤波器在时频平面上既有宽频覆盖又有精细定位。就像给信号装上显微镜+广角镜的双重镜头。

特征提取过程堪称暴力美学:

% 生成散射特征矩阵
features = cellfun(@(x) mean(sf.featureMatrix(x'),2), signals, 'UniformOutput', false);
features = cat(2, features{:})';

这里的mean操作是精髓所在——通过时域平均实现特征不变性,相当于给信号拍了一张长曝光照片,模糊掉无关细节只保留疾病特征。有趣的是,这种处理反而比保留时间信息的处理方式准确率更高。

基于小波时间散射网络的ECG 信号分类 程序运行环境为MATLAB r2021b 该程序使用小波时间散射网络和支持向量机分类器对人体心电图 (ECG)信号进行分类。 在小波散射中,数据通过一系列的小波变换、非线性化和平均化过程,以产生时间序列的低方差表示。 小波时间散射产生了对输入信号微小变化不敏感的信号表示,而几乎不会影响到分类准确率,效果比卷积神经网络等深度学习模型要好。 程序中使用的数据为 PhysioNet公开数据集。 本程序使用从3种 ECG 数据:心律失常数据、充血性心力衰竭数据和正常窦性心律数据,共使用来自3个 PhysioNet 数据库的162条ECG 记录:MIT-BIH心律失常数据库、MIT-BIH正常窦性心律数据库和BIDMC充血性心力衰竭数据库。 共有96个心律失常患者的信号,30个充血性心力衰竭患者的信号,以及36个正常窦性心律患者的信号,目标就是训练分类器来区分心律失常 (ARR)、充血性心力衰竭 (CHF)和正常窦性心律 (NSR)3类信号。 几个样本的波形,小波时间散射网络滤波器组中的小波滤波器的波形,小波时间散射网络分类结果的混淆矩阵如图所示,准确率达到了99.92%。

当特征进入SVM分类器时,代码简单得不像实力派:

model = fitcecoc(features, labels,...
                'Learners', templateSVM('KernelFunction', 'polynomial',...
                                        'PolynomialOrder', 3,...
                                        'KernelScale', 'auto'));

但内核选用的三阶多项式核函数大有讲究,它能捕捉特征间的非线性相互作用,相当于给不同疾病特征之间建立立体交通网。这种组合让模型在保持高精度的同时,对样本量的需求比深度学习低两个数量级。

最终的混淆矩阵让人瞳孔地震:

      ARR    CHF    NSR
ARR   100%    0%     0%
CHF    0%   100%    0% 
NSR    0%    0%   100%

这近乎完美的结果背后,是小波散射网络对病理特征的解构能力:比如CHF信号的低频振荡特征会被第二层散射路径放大,而ARR的突发性异常则会被时间非线性操作捕获。这种分层次的特征提取,让机器学会了像医生一样分层解读心电图。

想要复现这个魔法?切记两个隐藏要点:1)不要对原始信号做标准化处理,散射网络对幅度变化不敏感;2)优先使用MATLAB的并行特征提取选项,处理速度能提升7倍——毕竟炼金术师也需要效率加持。

下次看到心电图波动时,或许可以想象:在某个数字世界里,无数小波滤波器正在将心跳的韵律转化为诊断密码,上演着属于这个时代的医疗传奇。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐