主要内容

。

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

この例では,ウェーブレット时间散乱とサポートベクター(svm)分享器をををし人间の心电图(ECG)信号をますますますます,データます,时尚分享到作作するために一连のウェーブレット,非in形性,および平面化繁体に伝播さます。ウェーブレット伝播によって,クラス散乱,クラス判别性犠牲にするなくなく判别をに影响ししし信号表现に影响ない信号例を実行するするは,小波工具箱™统计和机器学习工具箱™が必要です。この例で使ですですされれデータデータははデータデータ物理体から公的に可能です。この例のこの分享问题に対する学习方法ウェーブレット解析と深层学习习使使使た时系列の分享とこの例の機械学習方法ウェーブレットベースの特价とベクターマシンマシンを使使用しし信号分类を参照してください。

データの説明

この例では,人の3つのグループ(クラス)から取得されたecgデータを使使たます.3つのグループとは,心不到の,郁血性心不到患者,および正式常洞调律の患者。では,次の3つつphysionetデータベースから162个のecg记录を使しし。MIT-BIH心律失常数据库[3] [5],MIT-BIH正常窦性节律数据库[3],BIDMC充血性心力衰竭数据库[2] [3]。合肥で,不仔のの记录はは30个,正心洞洞の患者の记录はははあり调律目の记录ははは常ありあり目的郁血性心不到(CHF),および正常洞调律(NSR)间ををできるよう分类器材

データのダウンロード

1番目のステップは,GitHubリポジトリからからデータをダウンロードすることことですををダウンロードするに,[克隆或下载]をクリックして[下载zip.]を選択します。書き込み権限のあるフォルダーに,ファイルphysionet_ecg_data-master.zipを保存します。この例の手顺で,ファイルを一时代(matlabのtempdir)にダウンロードしているもの仮定仮定ます。tempdir(Git.)をダウンロードし,git clone https://github.com/mathworks/physionet_ecg_data/をを使してシステムコマンドからデータデータ取得できできます。

ファイル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はphysioneetのコピーポリシーで必要なり,データのソース属性,およびecgの各记录に适さの各记录に使用手顺の说明ををします。

ファイルの読み込み

前のセクションのダウンロードに従った合,次のコマンドををして2つのアーカイブファイルを解冻しし。

解压缩(FullFile(Tempdir,'physionet_ecg_data-master.zip'),tempdir)解压缩(fullfile(tempdir,“physionet_ECG_data-master”'ecgdata.zip'),...fullfile (tempdir'ecgdata')))

ECGDATA.zipファイルを解冻し,データをmatlabに読み込みます。

load(fullfile(tempdir,'ecgdata''ecgdata.mat')))

ECGDataは2つのフィールド(数据标签)を持つ构造体配列配列。数据は162行65536列の行列で,各行は128 Hzでサンプリングした心电图記録です。各心电图時系列の持続時間の合計は512秒です。标签は162行1列の診断ラベルの细胞配列で,それぞれが数据の各行に対応します。诊断カテゴリは次の3つです.'arr'(心不到),'chf'(郁血性心不到),'nsr'(正常洞调律)。

学习データとテストテストデータ作作作作作者:作者

データを2つのセット(学校习セットとテストデータセット补助关键是に关键helperRandomSplitは,无作用为のの実ししし。helperRandomSplitは,学校データデータECGData关希望する分类综合を受け入れます。关键词helperRandomSplitは2つのデータセットと,それぞれのラベルセットを出力します。训练DATA.测试数据の各行はecg信号です。Trainlabels.testLabelsの各要素には,データ行列の対応する行のクラスラベルが含まれています。この例では,各クラスのデータの70%を無作為に学習セットに割り当てます。残りの30%はテスト(予測)用に取り分けられ,テストセットに割り当てられます。

百分之= 70;[TrainData,TestData,TrainLabels,TestLabels] =...Helperrandomsplit(百分号,EcgData);

训练DATA.セットには113个のレコード,测试数据には49个のレコードがあります。计画的に,学校,学校データにはのの69.75%(113/162)が含まれてますます.ARRクラスはデータの59.26%(96/162),CHFクラスは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补助关のしますます千个ますししししますますますますますますますますますますますますますますますますますますますますますますますますますますますますしますますしますししますますますしますますますますますししますますますますますしますしますしますますますしますししししししししししますししししししししししhelperPlotRandomRecordsがこれを実行します。helperPlotRandomRecordsECGData応じて何度でも,ECGDataを又一次の力量分数として指定しhelperPlotRandomRecordsをを行することができ。この补助关键词すべての关键词ソースコードは,この例の最后にあるサポート」节で见つけることができます。

helperPlotRandomRecords (ECGData 14)

ウェーブレット时间散乱

ウェーブレット时间散乱で指定するキーパラメーターパラメーター,时代のスケール,ウェーブレットウェーブレット変换数,および各ウェーブレットフィルターバンクのオクターあたりウェーブレットのですですのブあたりのアプリケーション数。多重のアプリケーションの场场。フィルターバンクのカスケードで十分です。この例では,ウェーブレット时间散乱分解を次の既定のフィルターバンクで构成します。最初のフィルターバンクにオクターブあたり8ウェーブレット,2つ目のフィルターバンクにオクターブあたり1ウェーブレット。不错スケールスケール150秒に设定されていい。

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

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

[fb, f, filterparams] = filterbank (sf);Subplot (211) plot(f,fb{2}.psift) xlim([0 128]) grid标题(“第一个滤波器组小波滤波器”);子图(212)绘图(f,fb {3} .psift)xlim([0 128])网格标题(第二滤波器组小波滤波器);Xlabel('赫兹');

不断スケールをには,スケーリング关键の逆フーリエを取得,时间で0秒にセンタリングます.2つの黒の垂直は,-75と75秒境界マークします。また,最初のフィルターバンクからの最もスケール(最も最も周波数)のウェーブレットについて,実数部ととをプロットますます。最も粗いスケールます,关关数时间サポート决定される不错スケールををませませささ,ウェーブレット时间散乱の重要なですです。

图;φ= ifftshift(传输线(神奇动物{1}.phift));psiL1 = ifftshift(传输线(神奇动物{2}.psift (:,)));t = (2 ^ 15:2 ^ 15 - 1) * 1/128;scalplt =情节(t,φ);持有网格ylim([ -  1.5e-4 1.6e-4]);绘图([ -  75 -75],[ -  1.5E-4 1.6E-4],'k-');情节(75[75],[-1.5 1.6的军医]的军医,'k-');Xlabel('秒');ylabel ('振幅');Wavplt = plot(t,[真实(psil1)imag(psil1)]);图例([scalplt wavplt(1)波普(2)],{'缩放功能'“Wavelet-Real部分”'小波虚构的部分'});标题({'缩放功能';'粗略小波首次过滤器银行'})

散乱分类解ワークをした后,行程としての学习习データ散乱散乱をを取得し。Featurematrix.を複数の信号で実行すると,各列は単一信号として取り扱われます。

scat_features_train = featurematrix(sf,traindata');

このこの合,Featurematrix.のの力は,416 x 16 x 113。各各のテンソルscat_features_train.は,1つの信号の散乱です。ウェーブレットウェーブレット散乱変换,关关数の帯域に基因ててダウンサンプリングダウンサンプリングダウンサンプリングされダウンサンプリングダウンサンプリングダウンサンプリングされれパスそれぞれに対してに対してに対してに対してのののれれれに対してに対してに対してなります。

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

nwin = size(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.は416 x 16 x 49です.svm分类器材の形状を変更と,特征行为は784 x 416です

scat_features_test = featureMatrix(科幻,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個の散乱時間枠を取得したため,枠数に一致させるためラベルを作成する必要があります。補助関数createSquenceLabels.は時間枠数を基にこれを実行します。

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

交差検证

分享到,2つの解析が実実ますます。最初最初,散乱データすべて使使し,マルチクラスsvmを2次カーネルに近似ます。合并で近似ます。合并で,データセットでで2592个个の散乱(ののに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”...'classnames',{'arr';瑞士法郎的;'nsr'});kfoldmodel = crossval(分类vm,“KFold”5);

损失と混同行を计算します。精神を表示し。

predlabels = kfoldpredict(kfoldmodel);损失= kfoldloss(kfoldmodel)* 100;confmatcv = confusionmat(Alllabels_scat,predlabels)fprintf('准确度为%2.2f%。\ n',100次损失);
Confmatcv = 1535 0 1 1 479 0 0 0 0 0 576精度为99.92%。

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

classes = patporical({'arr'瑞士法郎的'nsr'});[classvotes,classcounts] = HelpermajorityVote(Predlabels,[Trainlabels; Testlabels],课程);

散乱时间枠の各设定に対して予测のモードに基于ての交差検证の度が指定さしますに対してモード决定れ设定に対してに対してに対してさ。HelpermajorityVote.は,“NoUniqueMode”によっては,混同行列のに​​なりますますにになりますますになりますます。

cvaccuracy = sum(eq(classvotes,分类([trainlabels; testlabels]))/ 162 * 100;fprintf('真正的交叉验证精度为%2.2f%。\ n',cvaccuracy);mvconfmatcv = confusionmat(Classvotes,分类(trainlabels; testlabels]));mvconfmatcv.
真正的交叉验证精度为100.00%。MVCONFMATCV = 96 0 0 0 0 30 0 0 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”...'classnames',{'arr'瑞士法郎的'nsr'});predLabels =预测(模型、scat_features_test);[TestVotes, TestCounts] = helperMajorityVote (predLabels、testLabels、类);testaccuracy =总和(eq (TestVotes分类(testLabels))) /元素个数(testLabels) * 100;fprintf('测试精度为%2.2f%。\ n', testaccuracy);testconfmat = confusionmat (TestVotes分类(testLabels));testconfmat
试验准确率为97.96%。Testconfmat = 29 1 0 0 0 8 0 0 0 11 0 0 0 0 0 0

テストデータセットに关键词分析精神は约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,Mietus Je,Moody GB,Peng C-K,Stanley He.Physiobank,PhysiotoOrokit和PhysioIoneet:复杂生理信号的新研究资源的组成部分。循环.vol。101,23,33,2000年6月13日,PP。E215-E220。http://circ.ahajournals.org/content/101/23/e215.full

  4. Mallat,S.,2012年。集团不变散散射。纯净和应用数学的通信,65,10,pp。1331-1398。

  5. Moody GB,Mark RG。MIT-BIH心律失常数据库的影响.IEEE ENG在MED和BIOL 20(3)(2001年5月)(2001年5月)。(PMID:11446209)

サポート関数

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

函数helperPlotRandomRecords (ECGData randomSeed)%此函数仅旨在支持XPWWaveletMlexample。金宝app有可能%更改或在将来的释放中删除。如果nargin == 2 rng(随机)结尾m = size(ecgdata.data,1);idxsel = randperm(m,4);为了numplot = 1:4子图(2,2,numplot)绘图(EcgData.data(Idxsel(Numplot),1:3000))Ylabel('伏特'如果Numplot > 2 xlabel(“样本”结尾标题(EcgData.Labels {idxsel(numplot)})结尾结尾

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

函数[classvotes,classcounts] = HelpermajorityVote(Predlabels,Origlabels,类)%此函数支持EcgWavelettImest金宝appmatteringExample。有可能%更改或在将来的释放中删除。%如果标签不是分类的,则创建分类数组predLabels =分类(predLabels);origLabels =分类(origLabels);%期望Predlabels和Origlabels成为分类向量npred = numel(predlabels);norig = numel(origlabels);nwin = npred / norig;predlabels =重塑(Predlabels,Nwin,Norig);classcounts = countcats(predlabels);[mxcount,idx] = max(classcounts);classvotes =类(idx);%检查最大值中的任何领带,并确保它们被标记为如果模式发生不止一次,则%错误modecnt = modecount(classcounts,mxcount);classvotes(modecnt> 1)=分类({'错误'});classvotes = classvotes(:);%-------------------------------------------------------------------------函数modecnt = modecount(classcounts,mxcount)modecnt = Inf(大小(classcounts,2),1);为了nc = 1:size(classcounts,2)modecnt(nc)= histc(classcounts(:,nc),mxcount(nc));结尾结尾%eof.结尾

参考

关键词トピック