【MATLAB第3期】基于小波時(shí)間散射網(wǎng)絡(luò)(WTSN)和長(zhǎng)短期記憶網(wǎng)絡(luò) (LSTM) 的ECG信號(hào)分類

前沿
1.小波散射網(wǎng)絡(luò)
關(guān)于小波散射網(wǎng)絡(luò),可參考一篇文章:
小波散射網(wǎng)絡(luò)初級(jí)探索 - 哥廷根數(shù)學(xué)學(xué)派的文章 - 知乎 哥廷根數(shù)學(xué)學(xué)派:小波散射網(wǎng)絡(luò)初級(jí)探索
本文講解如何使用小波時(shí)間散射網(wǎng)絡(luò)(WTSN)和長(zhǎng)短期記憶網(wǎng)絡(luò)(LSTM) 對(duì)人體心電圖 (ECG)信號(hào)進(jìn)行分類。在小波散射中,數(shù)據(jù)通過一系列的小波變換、非線性化和平均化過程,以產(chǎn)生時(shí)間序列的低方差表示。小波時(shí)間散射產(chǎn)生了對(duì)輸入信號(hào)微小變化不敏感的信號(hào)表示,而幾乎不會(huì)影響到分類準(zhǔn)確率。本文中使用的數(shù)據(jù)公開,在github網(wǎng)站可以下載。
代碼免費(fèi)下載鏈接:↓↓↓↓↓↓↓↓點(diǎn)擊即可下載,整理不易,求個(gè)關(guān)注~
https://mianbaoduo.com/o/bread/mbd-Y5mWmJdv
2.數(shù)據(jù)描述
本文使用3種 ECG 數(shù)據(jù):心律失常數(shù)據(jù)ARR、充血性心力衰竭數(shù)據(jù)CHF和正常竇性心律數(shù)據(jù)NSR,共使用來自3個(gè) PhysioNet 數(shù)據(jù)庫的162條ECG 記錄:MIT-BIH心律失常數(shù)據(jù)庫、MIT-BIH正常竇性心律數(shù)據(jù)庫和BIDMC充血性心力衰竭數(shù)據(jù)庫。 共有96個(gè)心律失?;颊叩男盘?hào),30個(gè)充血性心力衰竭患者的信號(hào),以及36個(gè)正常竇性心律患者的信號(hào),目標(biāo)就是訓(xùn)練分類器來區(qū)分心律失常 (ARR)、充血性心力衰竭 (CHF)和正常竇性心律 (NSR)3類信號(hào)。
本示例說明如何使用小波時(shí)間散射和LSTM對(duì)人心電圖(ECG)信號(hào)進(jìn)行分類。 我們將訓(xùn)練一個(gè)長(zhǎng)期短期記憶網(wǎng)絡(luò)來識(shí)別以上心律。
————————————————
一、加載和預(yù)處理數(shù)據(jù)
數(shù)據(jù)是162個(gè)采樣信號(hào),以128Hz的頻率(Fs)采樣。
load(fullfile(pwd, "ECGData.mat"))%導(dǎo)入數(shù)據(jù)Fs = 128;
ECGData是一個(gè)結(jié)構(gòu)數(shù)組,包含兩個(gè)字段:Data 和 Labels。數(shù)據(jù)是一個(gè) 162×65536的矩陣,其中每一行是以128Hz采樣的ECG信號(hào)。每個(gè)ECG時(shí)間序列的總持續(xù)時(shí)間為512秒。標(biāo)簽是一個(gè) 162×1 的標(biāo)簽元胞數(shù)組,每行1個(gè)數(shù)據(jù)。
這些信號(hào)分為三類:
unique(ECGData.Labels)%ans = 3×1 cell 數(shù)組 ? ?%{'ARR'} ? ?%{'CHF'} ? ?%{'NSR'}
其中ARR是指心律異常(心律失常)的信號(hào),CHF是指充血性心力衰竭,NSR是指心律正常(正常竇性心律)
讓我們看看其中一些信號(hào)是什么樣的。
M = size(ECGData.Data, 1);%提取數(shù)據(jù)樣本行數(shù)idxsel = randperm(M, 4);%隨機(jī)選取其中4個(gè)樣本編號(hào)tiledlayout(2, 2, "Padding", "compact")%建立2*2的圖像窗口%依次畫出這4個(gè)樣本的信號(hào)數(shù)據(jù)特征(提取前3000個(gè)序列數(shù)據(jù))for numplot = 1:4 ? ?nexttile ? ?plot(ECGData.Data(idxsel(numplot),1:3000)) ? ?ylabel('Volts') ? ?xlabel('Samples') ? ?title(string(ECGData.Labels(idxsel(numplot))))end

編輯切換為居中
二、使用小波散射自動(dòng)特征提取
1.小波散射特征提取
小波散射是一種可用于自動(dòng)提取低方差,緊湊特征的技術(shù),該方法可以最大程度地減少類內(nèi)的差異,同時(shí)保留各個(gè)類之間的可區(qū)分性。我們可以提供這些功能,而不是將原始表示提供給LSTM,以便網(wǎng)絡(luò)可以快速學(xué)習(xí)模式并隨后對(duì)信號(hào)進(jìn)行分類。
sampleSig = ECGData.Data(1,:);%選取第一行樣本sf = waveletScattering('SignalLength',numel(sampleSig),'SamplingFrequency',Fs)feat = featureMatrix(sf,sampleSig);%自動(dòng)提取特征
sf = ? waveletScattering - 屬性:
? ? ? ? ?SignalLength: 65536
? ? ? InvarianceScale: 256
? ? ? ?QualityFactors: [8 1]
? ? ? ? ? ? ?Boundary: "periodic"
? ? SamplingFrequency: 128
? ? ? ? ? ? Precision: "double"
? ?OversamplingFactor: 0
2.提取特征前后特征尺寸對(duì)比
變量 feat 包含從信號(hào)中自動(dòng)提取的特征。 在此示例中,我們使用2層網(wǎng)絡(luò)提取所有要素。
提取特征前sampleSig包含要素:

編輯
提取特征后 feat包含要素:

編輯
與原始信號(hào)的長(zhǎng)度相比,特征尺寸減少了95%
3.可視化提取的特征
我們可以獨(dú)立檢查來自每一層的特征
lev = 1;[S1,U1] = scatteringTransform(sf,ECGData.Data(find(ECGData.Labels=="ARR",1),:));[S2,U2] = scatteringTransform(sf,ECGData.Data(find(ECGData.Labels=="NSR",1),:));scattergram(sf,S1,'FilterBank',lev);title(sprintf('Scattering Level %d: Class I sample',lev));

編輯切換為居中
scattergram(sf,S2,'FilterBank',lev);title(sprintf('Scattering Level %d: Class II sample',lev));

編輯切換為居中
注意:上面顯示的只是一種可視化提取了哪些特征的方法。 為每個(gè)信號(hào)提取一個(gè)499x8特征矩陣。
三、提取訓(xùn)練和測(cè)試集中所有信號(hào)的特征
讓我們將數(shù)據(jù)集隨機(jī)劃分為訓(xùn)練數(shù)據(jù)集和測(cè)試數(shù)據(jù)集。
1.提取訓(xùn)練和測(cè)試集中所有信號(hào)的特征
讓我們將數(shù)據(jù)集隨機(jī)劃分為訓(xùn)練數(shù)據(jù)集和測(cè)試數(shù)據(jù)集。
%load(fullfile(pwd, "data", "PartitionedData.mat"))idxRandomized = randperm(M);%樣本順序打亂trainSize = 113;%113個(gè)樣本訓(xùn)練testSize = M-trainSize;%162-113=49個(gè)樣本測(cè)試trainData = zeros(trainSize, size(ECGData.Data,2));%113*65536 double數(shù)據(jù)格式trainLabels = cell(trainSize,1);%113*1 cell數(shù)據(jù)格式testData = zeros(testSize, size(ECGData.Data,2));%49*65536 double數(shù)據(jù)格式testLabels = cell(testSize,1);%49*1 cell數(shù)據(jù)格式
使用我們現(xiàn)有的小波散射變換,為訓(xùn)練和測(cè)試數(shù)據(jù)集計(jì)算散射特征。
scat_features_train = cell(trainSize,1);%113*1 cell 數(shù)據(jù)結(jié)構(gòu),每個(gè)cell是499*8scat_features_test = cell(testSize,1);%49*1 cell數(shù)據(jù)結(jié)構(gòu),每個(gè)cell是499*8
四、利用散射特征訓(xùn)練LSTM
1.建立訓(xùn)練模型
現(xiàn)在讓我們建立一個(gè)非常簡(jiǎn)單的LSTM網(wǎng)絡(luò)進(jìn)行訓(xùn)練。
[inputSize,~] = size(scat_features_train{1});YTrain = categorical(trainLabels);numHiddenUnits = 100;%隱含層神經(jīng)元數(shù)numClasses = numel(unique(YTrain));%類別數(shù)量maxEpochs = 125;%訓(xùn)練次數(shù)miniBatchSize = 1000;%最小批處理數(shù)量layers = [ ... ? ?sequenceInputLayer(inputSize) ? ?lstmLayer(numHiddenUnits,'OutputMode','last') ? ?fullyConnectedLayer(numClasses) ? ?softmaxLayer ? ?classificationLayer];
并建立一些通用的訓(xùn)練選項(xiàng)。
options = trainingOptions('adam', ...%adam學(xué)習(xí)器 ? ?'InitialLearnRate',0.01,...%初始學(xué)習(xí)率 ? ?'MaxEpochs',maxEpochs, ... ? ?'MiniBatchSize',miniBatchSize, ... ? ?'SequenceLength','shortest', ...%“最短”—截?cái)嗝總€(gè)小批中的序列,使其長(zhǎng)度與最短序列相同。 ? ?'Shuffle','never',...%不打亂數(shù)據(jù) ? ?'Plots','training-progress');
現(xiàn)在我們準(zhǔn)備訓(xùn)練或者導(dǎo)入已經(jīng)訓(xùn)練好的網(wǎng)絡(luò)。
if true ? ?netScat = trainNetwork(scat_features_train,YTrain,layers,options);else ? ?load(fullfile(pwd, "data", "netScat.mat"))end
2.評(píng)估LSTM模型
現(xiàn)在我們可以測(cè)試我們訓(xùn)練好的模型:
YTest = categorical(testLabels);%提取測(cè)試輸出實(shí)際類別YPred = classify(netScat,scat_features_test, 'MiniBatchSize',miniBatchSize, 'SequenceLength','shortest');accuracy = round((sum(YPred == YTest)./numel(YTest))*100);%正確率confusionchart(YTest, YPred, "RowSummary", "row-normalized");title("Accuracy: " + accuracy + "%")

編輯
3.提高分類準(zhǔn)確度
如果您對(duì)結(jié)果不滿意,則可以對(duì)散射濾波器組中的一個(gè)可選參數(shù)進(jìn)行微調(diào),以獲得所需的結(jié)果。 invariance scale 的默認(rèn)值是信號(hào)長(zhǎng)度的一半(以樣本為單位)。
您始終可以掃描 invariance scale 并使用貝葉斯優(yōu)化來找出LSTM網(wǎng)絡(luò)的超參數(shù)的正確組合。
五、總結(jié)
本示例使用小波時(shí)間散射和LSTM將ECG波形分類為三個(gè)診斷類別之一。 小波散射被證明是功能強(qiáng)大的特征提取器,它只需要一組最少用戶指定的參數(shù)即可產(chǎn)生一組可靠的分類特征。
【MATLAB第3期】基于小波時(shí)間散射網(wǎng)絡(luò)(WTSN)和長(zhǎng)短期記憶網(wǎng)絡(luò) (LSTM) 的ECG信號(hào)分類的評(píng)論 (共 條)
