主要内容

このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

心电图信号分類のウェーブレット時間散乱

この例では,ウェーブレット時間散乱とサポートベクターマシン(SVM)分類器を使用して人間の心電図(ECG)信号を分類する方法を示します。ウェーブレット散乱で,データは,時系列の低分散表現を作成するために一連のウェーブレット変換,非線形性,および平均化全体に伝播されます。ウェーブレット時間散乱によって,クラス判別性を犠牲にすることなく入力信号へのシフトに影響しない信号表現が得られます。この例を実行するには,小波工具箱™および统计和机器学习工具箱™が必要です。この例で使用されているデータは,生理网から公的に入手可能です。この例のこの分類問題に対する深層学習方法ウェーブレット解析と深層学習を使用した時系列の分類とこの例の機械学習方法ウェーブレットベースの特徴とサポートベクターマシンを使用した信号分類を参照してください。

データの説明

この例では,人の3つのグループ(クラス)から取得された心电图データを使用します。3つのグループとは,心不整脈の患者,鬱血性心不全の患者,および正常洞調律の患者です。この例では,次の3つの生理网データベースから162個の心电图記録を使用します。MIT-BIH心律失常数据库[3][5]、MIT-BIH正常窦性节律数据库[3]、BIDMC充血性心力衰竭数据库[2][3]。合計で,不整脈の患者の記録は96個鬱血性心不全の患者の記録は30個正常洞調律の患者の記録は36個あります。目的は,不整脈(ARR)鬱血性心不全(瑞士法郎),および正常洞調律(NSR)間を区別できるように分類器に学習させることです。

データのダウンロード

1番目のステップは,GitHubリポジトリからデータをダウンロードすることです。データをダウンロードするには,(代码]をクリックして[下载ZIP]を選択します。書き込み権限のあるフォルダーに,ファイルphysionet_ECG_data-master.zipを保存します。この例の手順では,ファイルを一時ディレクトリ(MATLABのtempdir)にダウンロードしているものと仮定します。tempdirとは異なるフォルダーにデータをダウンロードすることを選択した場合は,データの解凍および読み込みに関する後続の手順を変更してください。

ファイルphysionet_ECG_data-master.zipには次のものが含まれています

  • ECGData.zip

  • README.md

また,ECGData.zipには次のものが含まれています

  • ECGData.mat

  • Modified_physionet_data.txt

  • License.txt

ECGData.matは,この例で使用されるデータを保持します。.txt ファイルの Modified_physionet_data.txt は PhysioNet のコピー ポリシーで必要になり、データのソース属性、および ECG の各記録に適用される前処理手順の説明を提供します。

ファイルの読み込み

前のセクションのダウンロード手順に従った場合,次のコマンドを入力して2つのアーカイブファイルを解凍します。

解压缩(fullfile (tempdir,“physionet_ECG_data-master.zip”), tempdir)解压缩(fullfile (tempdir,“physionet_ECG_data-master”“ECGData.zip”),...fullfile (tempdir“ECGData”))

ECGData.zipファイルを解凍したら,データをMATLABに読み込みます。

负载(fullfile (tempdir“ECGData”“ECGData.mat”))

ECGDataは2つのフィールド(数据标签)を持つ構造体配列です。数据は162行65536列の行列で,各行は128 Hzでサンプリングした心电图記録です。各心电图時系列の持続時間の合計は512秒です。标签は162行1列の診断ラベルの细胞配列で,それぞれが数据の各行に対応します。診断カテゴリは次の3つです。“加勒比海盗”(心不整脈)、'CHF' (鬱血性心不全)、'NSR' (正常洞調律)。

学習データとテストデータの作成

データを2つのセット(学習データセットとテストデータセット)に無作為に分割します。補助関数helperRandomSplitは,無作為の分割を実行します。helperRandomSplitは,学習データとECGDataに対して希望する分割割合を受け入れます。関数helperRandomSplitは2つのデータセットと,それぞれのラベルセットを出力します。trainDatatestDataの各行は心电图信号です。trainLabelstestLabelsの各要素には,データ行列の対応する行のクラスラベルが含まれています。この例では,各クラスのデータの70%を無作為に学習セットに割り当てます。残りの30%はテスト(予測)用に取り分けられ,テストセットに割り当てられます。

percent_train = 70;[trainData, testData trainLabels testLabels] =...helperRandomSplit (percent_train ECGData);

trainData113年セットには個のレコード,testDataには49個のレコードがあります。計画的に,学習データにはデータの69.75%(113/162)が含まれています。加勒比海盗クラスはデータの59.26%(96/162),瑞士法郎クラスは18.52%(30/162),そしてNSRクラスは22.22%(36/162)を示すことを思い出してください。学習セットとテストセットに含まれる各クラスの割合を調べます。各クラスの割合はデータセットに含まれるクラスの全体的な割合と一致します。

Ctrain = countcats(分类(trainLabels)。/元素个数(trainLabels)。*100 . Ctest = countcats(categorical(testLabels))./numel(testLabels).*100 . Ctest = countcats(categorical(testLabels))./numel(testLabels). /
Ctrain = 59.2920 18.5841 22.1239 Ctest = 59.1837 18.3673 22.4490

サンプルのプロット

ECGDataから無作為に選択した4個のレコードのうちの最初の数千個のサンプルをプロットします。補助関数helperPlotRandomRecordsがこれを実行します。helperPlotRandomRecordsECGDataとランダムシードを入力として受け入れます。各クラスの少なくとも1つのレコードがプロットされるように,初期シードは14で設定されます。各クラスに関連付けられたさまざまな心电图波形を把握するために,必要に応じて何度でも,ECGDataを唯一の入力引数として指定してhelperPlotRandomRecordsを実行することができます。この補助関数およびすべての補助関数のソースコードは,この例の最後にある”サポート関数”の節で見つけることができます。

helperPlotRandomRecords (ECGData 14)

ウェーブレット時間散乱

ウェーブレット時間散乱ネットワークで指定するキーパラメーターは,時不変のスケール,ウェーブレット変換の数,および各ウェーブレットフィルターバンクのオクターブあたりのウェーブレットの数です。多くのアプリケーションの場合,優れたパフォーマンスを達成するには2つのフィルターバンクのカスケードで十分です。この例では,ウェーブレット時間散乱ネットワークを次の既定のフィルターバンクで構成します。最初のフィルターバンクにオクターブあたり8ウェーブレット,2つ目のフィルターバンクにオクターブあたり1ウェーブレット。不変スケールは150秒に設定されています。

N =大小(ECGData.Data 2);sn = waveletScattering (“SignalLength”N“InvarianceScale”, 150,“SamplingFrequency”, 128);

2つのフィルターバンクのウェーブレットフィルターは以下を使用して可視化できます。

[fb, f, filterparams] = filterbank (sn);Subplot (211) plot(f,fb{2}.psift) xlim([0 128]) grid标题(“第一个滤波器组小波滤波器”);Subplot (212) plot(f,fb{3}.psift) xlim([0 128]) grid标题(第二滤波器组小波滤波器);包含(“赫兹”);

不変スケールを示すには,スケーリング関数の逆フーリエ変換を取得し,時間で0秒にセンタリングします。2つの黒の垂直線は,-75と75秒の境界をマークします。また,最初のフィルターバンクからの最も粗いスケール(最も低い周波数)のウェーブレットについて,実数部と虚数部をプロットします。最も粗いスケールウェーブレットは,スケーリング関数の時間サポートによって決定される不変スケールを超えません。これは,ウェーブレット時間散乱の重要なプロパティです。

图;φ= ifftshift(传输线(神奇动物{1}.phift));psiL1 = ifftshift(传输线(神奇动物{2}.psift (:,)));t = (2 ^ 15:2 ^ 15 - 1) * 1/128;scalplt =情节(t,φ);持有网格ylim(1.6[-1.5军医的军医]);情节(-75[-75],[-1.5 1.6的军医]的军医,“k——”);情节(75[75],[-1.5 1.6的军医]的军医,“k——”);包含(“秒”);ylabel (“振幅”);wavplt = plot(t,[real(psiL1) imag(psiL1)]);传奇([scalplt wavplt (1) wavplt (2)), {“扩展功能”“Wavelet-Real部分”“Wavelet-Imaginary部分”});标题({“扩展功能”“最粗尺度小波第一滤波器组”})举行

散乱ネットワークを構成した後,学習データの散乱係数を行列として取得します。featureMatrixを複数の信号で実行すると,各列は単一信号として取り扱われます。

scat_features_train = featureMatrix (sn, trainData ');

この場合,featureMatrixの出力は,409 x 16 x 113です。各ページのテンソルscat_features_trainは1つの信号の散乱変換です。ウェーブレット散乱変換は,スケーリング関数の帯域幅に基づいて時間で大きくダウンサンプリングされます。この場合409個の散乱パスのそれぞれに対して16個の時間枠になります。

支持向量机分類器と互換性のある行列を取得するために,各列が散乱パスに対応し,各行が散乱時間枠である行列に,多重信号の散乱変換の形状を変更します。この場合,学習データで113個の各信号に対して16個の時間枠があるため,1808行を取得します。

Nwin =大小(scat_features_train, 2);Scat_features_train = permute(Scat_features_train,[2 3 1]);scat_features_train =重塑(scat_features_train,...大小(scat_features_train 1) *大小(scat_features_train, 2), []);

テストデータに対して手順を繰り返します。最初に,学習セットに49心电图波形があるため,scat_features_testは409 x 16 x 49です。支持向量机分類器の形状を変更すると、特徴量行列は 784 x 416 です。

scat_features_test = featureMatrix (sn, testData ');Scat_features_test = permute(Scat_features_test,[2 3 1]);scat_features_test =重塑(scat_features_test,...大小(scat_features_test 1) *大小(scat_features_test, 2), []);

各信号に対して16個の散乱時間枠を取得したため,枠数に一致させるためラベルを作成する必要があります。補助関数createSequenceLabelsは時間枠数を基にこれを実行します。

[sequence_labels_train, sequence_labels_test] = createSequenceLabels (Nwin、trainLabels testLabels);

交差検証

分類の場合2つの解析が実行されます。最初に,散乱データすべてを使用して,マルチクラスSVMを2次カーネルに近似します。合計で,データセット全体で2592個の散乱シーケンス(162信号のそれぞれに16)があります。誤り率,または損失率は,5分割交差検証を使用して推定されます。

scat_features = [scat_features_train;scat_features_test];allLabels_scat = [sequence_labels_train;sequence_labels_test];rng (1);模板= templateSVM (...“KernelFunction”多项式的...“PolynomialOrder”2,...“KernelScale”“汽车”...“BoxConstraint”,1...“标准化”,真正的);classificationSVM = fitcecoc (...scat_features,...allLabels_scat,...“学习者”模板,...“编码”“onevsone”...“类名”, {“加勒比海盗”瑞士法郎的“签约”});kfoldmodel = crossval (classificationSVM,“KFold”5);

損失と混同行列を計算します。精度を表示します。

predLabels = kfoldPredict (kfoldmodel);损失= kfoldLoss (kfoldmodel) * 100;confmatCV = confconfmat (allLabels_scat,predLabels) fprintf('准确度为%2.2f % .\n'100 -损失);
confmatCV = 1535 0 1 2 478 0 0 576准确度为99.88%。

99.88%精度はです。これは,非常に良好ですが,実際の結果は各時間枠が個別に分類されるものよりも良いと考えられます。各信号に対して16個の個別の分類があります。簡単な多数決を使用して,各散乱表現に対して単一のクラス予測を取得します。

类=分类({“加勒比海盗”瑞士法郎的“签约”});[ClassVotes, ClassCounts] = helperMajorityVote (predLabels [trainLabels;testLabels)、类);

散乱時間枠の各設定に対してクラス予測のモードに基づいて実際の交差検証の精度を決定します。モードが指定された設定に対して一意でない場合,helperMajorityVoteは,“NoUniqueMode”によって指定された分類誤差を返します。これは,混同行列の余分の列になります。この場合,散乱予測の各設定に一意のモードが存在するためにすべてゼロになります。

CVaccuracy =总和(eq (ClassVotes分类([trainLabels;testLabels]))) / 162 * 100;流(“真正的交叉验证准确率为%2.2f %。”, CVaccuracy);MVconfmatCV = confusionmat(分类([trainLabels;testLabels]), ClassVotes);MVconfmatCV
真实交叉验证准确率为100.00%。MVconfmatCV = 96 0 0 0 30 0 0 0 36 0 0 0 0 0

散乱は,交差検証済みモデルですべての信号を正しく分類しています。ClassCountsを調べる場合,confmatCVの2つの誤分類された時間枠は,16個の散乱時間枠のうち15個が正しく分類された2つの信号に起因することがわかります。

支持向量机分類

次の解析では,マルチクラスの2次SVMを学習データのみ(70%)に当てはめてから,そのモデルを使用してテスト用に取り分けられた30%のデータに対して予測を行います。テストセットには49個のデータレコードがあります。個々の散乱時間枠で多数決を使用します。

模型= fitcecoc (...scat_features_train,...sequence_labels_train,...“学习者”模板,...“编码”“onevsone”...“类名”, {“加勒比海盗”瑞士法郎的“签约”});predLabels =预测(模型、scat_features_test);[TestVotes, TestCounts] = helperMajorityVote (predLabels、testLabels、类);testaccuracy =总和(eq (TestVotes分类(testLabels))) /元素个数(testLabels) * 100;流(测试准确率为%2.2f %。\ n”, testaccuracy);confusionchart(分类(testLabels)、TestVotes)
试验准确率为97.96%。

テストデータセットに関する分類精度は約98%です。混同行列は1つの瑞士法郎レコードがARRと誤分類されていることを示しています。48個のその他の信号はすべて正しく分類されています。

まとめ

この例では3つの診断クラスのうち1つに心电图波形を分類するためにウェーブレット時間散乱とSVM分類器を使用しました。強力な特徴抽出器であることを実証するウェーブレット散乱です。これには,分類に対してロバスト特徴のセットを得られるようにユーザー指定のパラメーターの最小設定のみが必要でした。これを例ウェーブレットベースの特徴とサポートベクターマシンを使用した信号分類と比較します。この例では分類で使用するための特徴量の作成に多くの専門知識が必要でした。ウェーブレット時間散乱では、時間不変性のスケール、フィルター バンク (またはウェーブレット変換) の数、およびオクターブあたりのウェーブレットの数のみを指定する必要があります。ウェーブレット散乱変換と SVM 分類器の組み合わせによって、交差検証済みモデルで 100% の分類と、ホールドアウトのテスト セットの散乱変換に SVM を適用したときに 98% の正しい分類が得られました。

参考文献

  1. Anden J., Mallat, S. 2014。深散射谱,IEEE信号处理汇刊,62,16,414 -4128页。

  2. Baim DS, Colucci WS, Monrad ES, Smith HS, Wright RF, Lanoue A, Gauthier DF, Ransil BJ, Grossman W, Braunwald E.口服米力农治疗严重充血性心力衰竭患者的生存率。美国心脏病学会1986年3月;7(3): 661 - 670。

  3. Goldberger AL, Amaral LAN, Glass L, Hausdorff JM, Ivanov PCh, Mark RG, miietus JE, Moody GB, Peng C-K, Stanley HE。PhysioBank, PhysioToolkit和PhysioNet:复杂生理信号新研究资源的组成部分。循环.Vol。101, No. 23, 2000年6月13日,页e215-e220。http://circ.ahajournals.org/content/101/23/e215.full

  4. Mallat。2012。集团不变的散射。《纯粹与应用数学通讯》,65,10,1331-1398页。

  5. 穆迪GB,马克RG。MIT-BIH心律失常数据库的影响。IEEE医学与生物学工程20(3):45-50(2001年5- 6月)。(PMID: 11446209)

サポート関数

helperPlotRandomRecords-ECGDataから無作為に選択した4個の心电图信号をプロットします。

函数helperPlotRandomRecords (ECGData randomSeed)%此函数仅用于支持XpwWaveletMLExample。万博1manbetx它可能%更改或在未来的版本中删除。如果输入参数个数= = 2 rng (randomSeed)结束M =大小(ECGData.Data, 1);idxsel = randperm (M, 4);numplot = 1:4 subplot(2,2,numplot) plot(ECGData.Data(idxsel(numplot),1:30)) ylabel(“伏”如果Numplot > 2 xlabel(“样本”结束标题(ECGData.Labels {idxsel (numplot)})结束结束

helperMajorityVote——散乱時間枠の各セットに予測したクラスラベルでモードを探します。関数は,散乱時間枠の各セットにクラス ラベル モードとクラス予測の数の両方を返します。固有のモードがない場合、helperMajorityVoteは散乱時間枠のセットが分類誤差であることを示す”エラー”のクラスラベルを返します。

函数[ClassVotes, ClassCounts] = helperMajorityVote (predLabels、origLabels类)%该函数支持ecgwavettimescat万博1manbetxteringexample。它可能%更改或在未来的版本中删除。%如果标签不是分类的,则创建分类数组predLabels =分类(predLabels);origLabels =分类(origLabels);%要求predLabels和origLabels都是分类向量npr =元素个数(predLabels);Norig =元素个数(origLabels);Nwin = npr / Norig;predLabels =重塑(predLabels Nwin Norig);ClassCounts = countcats (predLabels);[mxcount, idx] = max (ClassCounts);ClassVotes =类(idx);%检查最大值中的任何领带,并确保它们被标记为%错误,如果模式出现多次modecnt = modecount (ClassCounts mxcount);ClassVotes (modecnt > 1) =分类({“错误”});ClassVotes = ClassVotes (:);%-------------------------------------------------------------------------函数modecnt = Inf(size(ClassCounts,2),1); / / mxcount = mdecntc = 1:size(ClassCounts,2) modecnt(nc) = histc(ClassCounts(:,nc),mxcount(nc));结束结束% EOF结束

参考

関連するトピック