【心电信号ECG】基于支持向量机SVM心电图心搏检测与分类附Matlab复现含文献

简介: ✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室 👇 关注我领取海量matlab电子书和数学建模资料 🍊个人信条:格物致知,完整Matlab代码获取及仿真咨询内容私信。🔥 内容介绍 摘要——在第三项任务中,我们开发了一种基于支持向量机(SVM)的心电图(ECG)节律分类流程,利用MIT- BIH 心律失常数据库区分正常与异常心搏。通过潘-

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。

🍎 往期回顾关注个人主页:Matlab科研工作室

👇 关注我领取海量matlab电子书和数学建模资料

🍊个人信条:格物致知,完整Matlab代码获取及仿真咨询内容私信。

🔥 内容介绍
摘要——在第三项任务中,我们开发了一种基于支持向量机(SVM)的心电图(ECG)节律分类流程,利用MIT- BIH 心律失常数据库区分正常与异常心搏。通过潘-汤普金斯算法处理五份记录的ECG信号以检测QRS波群,随后提取形态学、时间及频谱特征。评估了两种特征配置:基线配置(8个特征)和扩展配置(12个特征)。采用 RBF 核训练的 SVM 模型在扩展特征集中实现了更高的分类准确率,同时提升了敏感性和特异性。通过混淆矩阵和基于主成分分析(PCA)的特征分离等可视化手段,验证了该方法在真实ECG监测场景中检测心律失常的有效性。

Image

Image

Image

⛳️ 运行结果
Image

Image

Image

📣 部分代码
= 1).';

% right_ind = find(diff([poss_reg.' 0]) == -1).';

%

% % R, Q, S detection

% R_loc = zeros(numel(left_ind), 1);

% Q_loc = zeros(numel(left_ind), 1);

% S_loc = zeros(numel(left_ind), 1);

% for i = 1:numel(left_ind)

% [~, R_loc(i)] = max(ecg_m(left_ind(i):right_ind(i)));

% R_loc(i) = R_loc(i)-1+left_ind(i);

% [~, Q_loc(i)] = min(ecg_m(left_ind(i):R_loc(i)));

% Q_loc(i) = Q_loc(i)-1+left_ind(i);

% [~, S_loc(i)] = min(ecg_m(R_loc(i):right_ind(i)));

% S_loc(i) = S_loc(i)-1+R_loc(i);

% end

%

% % Clean incomplete edges

% if R_loc(1)*ts < 0.2

% Q_loc(1) = []; R_loc(1) = []; S_loc(1) = [];

% left_ind(1) = []; right_ind(1) = [];

% end

% if (numel(ecg_m)-R_loc(end))*ts < 0.2

% Q_loc(end) = []; R_loc(end) = []; S_loc(end) = [];

% left_ind(end) = []; right_ind(end) = [];

% end

% n_beats_det = numel(R_loc);

%

% % P and T detection

% P_loc = zeros(n_beats_det, 1);

% T_loc = zeros(n_beats_det, 1);

% for i = 1:n_beats_det

% pL = max(1, left_ind(i) - round(0.2 * fs));

% pR = left_ind(i);

% [~, p] = max(ecg_m(pL:pR));

% P_loc(i) = pL + p - 1;

%

% tL = right_ind(i);

% tR = min(numel(ecg_m), tL + round(0.4 * fs));

% [~, t] = max(ecg_m(tL:tR));

% T_loc(i) = tL + t - 1;

% end

%

% % Feature Extraction

% RS_width = ts * (S_loc - R_loc);

% QS_width = ts * (S_loc - Q_loc);

% QR_width = ts * (R_loc - Q_loc);

% pre_RR_int = [0; ts * diff(R_loc)];

% post_RR_int = [pre_RR_int(2:end); 0];

%

% MPSD = zeros(n_beats_det, 1);

% area_QR = zeros(n_beats_det, 1);

% area_RS = zeros(n_beats_det, 1);

% for i = 1:n_beats_det

% MPSD(i) = mean(abs(fft(ecg_m(P_loc(i):T_loc(i)))).^2);

% area_QR(i) = trapz(ecg_m(Q_loc(i):R_loc(i)));

% area_RS(i) = trapz(ecg_m(R_loc(i):S_loc(i)));

% end

%

% features = [QS_width, pre_RR_int, post_RR_int, QR_width, RS_width, MPSD, area_QR, area_RS];

% end

function [features, R_loc, Q_loc, S_loc, P_loc, T_loc, n_beats_det, left_ind, right_ind] = extract_ecg_features(ecg_m, ecg_MW, fs, template_normal)

ts = 1/fs;



% === Thresholding and region detection ===

poss_reg = (ecg_MW > mean(ecg_MW))';

left_ind = find(diff([0 poss_reg.']) == 1).';

right_ind = find(diff([poss_reg.' 0]) == -1).';



% === R, Q, S detection ===

R_loc = zeros(numel(left_ind), 1);

Q_loc = zeros(numel(left_ind), 1);

S_loc = zeros(numel(left_ind), 1);

for i = 1:numel(left_ind)

    [~, R_loc(i)] = max(ecg_m(left_ind(i):right_ind(i)));

    R_loc(i) = R_loc(i) - 1 + left_ind(i);

    [~, Q_loc(i)] = min(ecg_m(left_ind(i):R_loc(i)));

    Q_loc(i) = Q_loc(i) - 1 + left_ind(i);

    [~, S_loc(i)] = min(ecg_m(R_loc(i):right_ind(i)));

    S_loc(i) = S_loc(i) - 1 + R_loc(i);

end



% === Clean boundaries ===

if R_loc(1)*ts < 0.2

    Q_loc(1) = []; R_loc(1) = []; S_loc(1) = [];

    left_ind(1) = []; right_ind(1) = [];

end

if (numel(ecg_m)-R_loc(end))*ts < 0.2

    Q_loc(end) = []; R_loc(end) = []; S_loc(end) = [];

    left_ind(end) = []; right_ind(end) = [];

end

n_beats_det = numel(R_loc);



% === P and T detection ===

P_loc = zeros(n_beats_det, 1);

T_loc = zeros(n_beats_det, 1);

for i = 1:n_beats_det

    pL = max(1, left_ind(i) - round(0.2 * fs));

    pR = left_ind(i);

    [~, p] = max(ecg_m(pL:pR));

    P_loc(i) = pL + p - 1;



    tL = right_ind(i);

    tR = min(numel(ecg_m), tL + round(0.4 * fs));

    [~, t] = max(ecg_m(tL:tR));

    T_loc(i) = tL + t - 1;

end



% === Initialize feature arrays ===

QS_width = zeros(n_beats_det,1);

QR_width = zeros(n_beats_det,1);

RS_width = zeros(n_beats_det,1);

pre_RR_int = [0; ts * diff(R_loc)];

post_RR_int = [pre_RR_int(2:end); 0];

MPSD = zeros(n_beats_det,1);

area_QR = zeros(n_beats_det,1);

area_RS = zeros(n_beats_det,1);

auto_corr_val = zeros(n_beats_det,1);

ST_dev = zeros(n_beats_det,1);

ST_slope = zeros(n_beats_det,1);

template_corr = zeros(n_beats_det,1);



for i = 1:n_beats_det

    % === Duration Features ===

    QS_width(i) = ts * (S_loc(i) - Q_loc(i));

    QR_width(i) = ts * (R_loc(i) - Q_loc(i));

    RS_width(i) = ts * (S_loc(i) - R_loc(i));



    % === MPSD ===

    if P_loc(i) < T_loc(i)

        window = ecg_m(P_loc(i):T_loc(i));

        MPSD(i) = mean(abs(fft(window)).^2);

    else

        MPSD(i) = 0;

    end



    % === Area under QR, RS ===

    if Q_loc(i) < R_loc(i)

        area_QR(i) = trapz(ecg_m(Q_loc(i):R_loc(i)));

    else

        area_QR(i) = 0;

    end

    if R_loc(i) < S_loc(i)

        area_RS(i) = trapz(ecg_m(R_loc(i):S_loc(i)));

    else

        area_RS(i) = 0;

    end



    % === Autocorrelation ===

    if Q_loc(i) < S_loc(i)

        segment = ecg_m(Q_loc(i):S_loc(i));

        if length(segment) >= 2

            acf = xcorr(segment, 'coeff');

            acf(acf == 1 | isnan(acf)) = [];  % Remove trivial peak

            auto_corr_val(i) = max(acf(:), [], 'omitnan');

        else

            auto_corr_val(i) = 0;

        end

    else

        auto_corr_val(i) = 0;

    end



    % === ST deviation and slope ===

    st_start = S_loc(i) + round(0.02 * fs);

    st_end   = min(T_loc(i), numel(ecg_m));

    if st_end > st_start

        y = ecg_m(st_start:st_end);

        x = (st_start:st_end) * ts;

        ST_dev(i) = mean(y);

        p = polyfit(x, y, 1);

        ST_slope(i) = p(1);

    else

        ST_dev(i) = 0;

        ST_slope(i) = 0;

    end



    % === Correlation with normal template ===

    if Q_loc(i) < S_loc(i)

        beat_seg = ecg_m(Q_loc(i):S_loc(i));

        if length(beat_seg) >= 2 && length(template_normal) >= 2

            beat_seg = interp1(1:length(beat_seg), beat_seg, ...

                linspace(1,length(beat_seg), length(template_normal)), 'linear', 'extrap');

            c = corrcoef(beat_seg, template_normal);

            if size(c,1)==2 && size(c,2)==2

                template_corr(i) = c(1,2);

            else

                template_corr(i) = 0;

            end

        else

            template_corr(i) = 0;

        end

    else

        template_corr(i) = 0;

    end

end



% === Final Feature Matrix (12 features) ===

features = [QS_width, pre_RR_int, post_RR_int, ...

            QR_width, RS_width, MPSD, ...

            area_QR, area_RS, auto_corr_val, ...

            ST_dev, ST_slope, template_corr];

end

🔗 参考文献
图片
🏆团队擅长辅导定制多种科研领域MATLAB仿真,助力科研梦:

相关文章
|
6天前
|
人工智能 自然语言处理 Shell
🦞 如何在 Moltbot 配置阿里云百炼 API
本教程指导用户在开源AI助手Clawdbot中集成阿里云百炼API,涵盖安装Clawdbot、获取百炼API Key、配置环境变量与模型参数、验证调用等完整流程,支持Qwen3-max thinking (Qwen3-Max-2026-01-23)/Qwen - Plus等主流模型,助力本地化智能自动化。
🦞 如何在 Moltbot 配置阿里云百炼 API
|
4天前
|
人工智能 JavaScript 应用服务中间件
零门槛部署本地AI助手:Windows系统Moltbot(Clawdbot)保姆级教程
Moltbot(原Clawdbot)是一款功能全面的智能体AI助手,不仅能通过聊天互动响应需求,还具备“动手”和“跑腿”能力——“手”可读写本地文件、执行代码、操控命令行,“脚”能联网搜索、访问网页并分析内容,“大脑”则可接入Qwen、OpenAI等云端API,或利用本地GPU运行模型。本教程专为Windows系统用户打造,从环境搭建到问题排查,详细拆解全流程,即使无技术基础也能顺利部署本地AI助理。
5632 13
|
10天前
|
人工智能 API 开发者
Claude Code 国内保姆级使用指南:实测 GLM-4.7 与 Claude Opus 4.5 全方案解
Claude Code是Anthropic推出的编程AI代理工具。2026年国内开发者可通过配置`ANTHROPIC_BASE_URL`实现本地化接入:①极速平替——用Qwen Code v0.5.0或GLM-4.7,毫秒响应,适合日常编码;②满血原版——经灵芽API中转调用Claude Opus 4.5,胜任复杂架构与深度推理。
7011 11
|
4天前
|
人工智能 JavaScript API
零门槛部署本地 AI 助手:Clawdbot/Meltbot 部署深度保姆级教程
Clawdbot(Moltbot)是一款智能体AI助手,具备“手”(读写文件、执行代码)、“脚”(联网搜索、分析网页)和“脑”(接入Qwen/OpenAI等API或本地GPU模型)。本指南详解Windows下从Node.js环境搭建、一键安装到Token配置的全流程,助你快速部署本地AI助理。(239字)
3502 19
|
2天前
|
人工智能 机器人 Linux
保姆级 OpenClaw (原 Clawdbot)飞书对接教程 手把手教你搭建 AI 助手
OpenClaw(原Clawdbot)是一款开源本地AI智能体,支持飞书等多平台对接。本教程手把手教你Linux下部署,实现数据私有、系统控制、网页浏览与代码编写,全程保姆级操作,240字内搞定专属AI助手搭建!
2763 7
保姆级 OpenClaw (原 Clawdbot)飞书对接教程 手把手教你搭建 AI 助手
|
5天前
|
人工智能 安全 Shell
在 Moltbot (Clawdbot) 里配置调用阿里云百炼 API 完整教程
Moltbot(原Clawdbot)是一款开源AI个人助手,支持通过自然语言控制设备、处理自动化任务,兼容Qwen、Claude、GPT等主流大语言模型。若需在Moltbot中调用阿里云百炼提供的模型能力(如通义千问3系列),需完成API配置、环境变量设置、配置文件编辑等步骤。本文将严格遵循原教程逻辑,用通俗易懂的语言拆解完整流程,涵盖前置条件、安装部署、API获取、配置验证等核心环节,确保不改变原意且无营销表述。
2121 6
|
5天前
|
机器人 API 数据安全/隐私保护
只需3步,无影云电脑一键部署Moltbot(Clawdbot)
本指南详解Moltbot(Clawdbot)部署全流程:一、购买无影云电脑Moltbot专属套餐(含2000核时);二、下载客户端并配置百炼API Key、钉钉APP KEY及QQ通道;三、验证钉钉/群聊交互。支持多端,7×24运行可关闭休眠。
3450 7
|
3天前
|
人工智能 JavaScript 安全
Clawdbot 对接飞书详细教程 手把手搭建你的专属 AI 助手
本教程手把手教你将 Moltbot(原 Clawdbot)部署在 Linux 服务器,并对接飞书打造专属 AI 助手:涵盖环境准备、Node.js/NVM 安装、Moltbot 快速安装(支持 Qwen 模型)、Web 管理面板配置及飞书应用创建、权限设置与事件回调对接,全程图文指引,安全可靠。
2210 3
Clawdbot 对接飞书详细教程 手把手搭建你的专属 AI 助手
|
5天前
|
存储 安全 数据库
使用 Docker 部署 Clawdbot(官方推荐方式)
Clawdbot 是一款开源、本地运行的个人AI助手,支持 WhatsApp、Telegram、Slack 等十余种通信渠道,兼容 macOS/iOS/Android,可渲染实时 Canvas 界面。本文提供基于 Docker Compose 的生产级部署指南,涵盖安全配置、持久化、备份、监控等关键运维实践(官方无预构建镜像,需源码本地构建)。
2426 7
|
5天前
|
人工智能 应用服务中间件 API
刚刚,阿里云上线Clawdbot全套云服务!
阿里云上线Moltbot(原Clawdbot)全套云服务,支持轻量服务器/无影云电脑一键部署,可调用百炼平台百余款千问模型,打通iMessage与钉钉消息通道,打造开箱即用的AI智能体助手。
2742 24
刚刚,阿里云上线Clawdbot全套云服务!