【脑电信号】基于matlab SVM分期睡眠监测【含Matlab源码 611期】

⛄一、SVM分期睡眠监测简介

0 引言
良好的睡眠是人类健康的重要基础, 睡眠不好会带来一系列的健康问题, 如记忆力下降、免疫力变差等。此外, 许多疾病, 如抑郁症、打鼾, 也会严重地降低人的睡眠质量。在这些情况下, 对睡眠质量的监测有着重要的意义, 它可以深入了解病情, 以提出切实可行的治疗方案来提升睡眠质量。目前最常用的睡眠监测是多导睡眠监测, 医生根据多种仪器监测所得的脑电波、心电波、肌电波、呼吸情况等一系列生理信号的数据进行睡眠分析, 但往往因为仪器昂贵、操作复杂、地点局限于医院中, 此外还需医学专家根据脑电图的特征人工将睡眠分期进而分析睡眠质量, 因此这种方法易受个人经验影响且实时性差。

本文设计了基于支持向量机 (support vector machines, SVM) 的便携式睡眠监测系统, 这种系统由用户端设备和服务器端设备组成, 用户端设备获取的信息可以通过无线通信网络与服务器公共网络通信, 达到远距离家庭监测的目的, 因为减小了用户端的设备体积, 提高了便携型。服务器端提供自动睡眠分析功能及一些系列的管理功能, 达到了实时反馈结果系统及系统管理结果等功能。

1 基于SVM的睡眠分期算法
美国睡眠医学学会的最新的标准将睡眠分为两个时相, 即非快动眼睡眠 (non-rapid eye movement, NREM) 和快动眼睡眠 (rapid eye movement, REM) 。NREM又可以进一步分成阶段一 (stage I, N1) , 阶段二 (stage II, N2) , 阶段三 (stage III, N3) 。目前的研究中, 有多种自动睡眠分期算法, 如隐形马尔科夫链 (Hidden Markov model, HMM) , 簇类 (clustering) , 人工神经网络 (artificial neural network, ANN) , 支持向量机 (support vector machine, SVM) 等。在这其中, 支持向量机因为理论基础完备的、鲁棒性良好、算法简单等优点而备受关注。早在2002年, D.Gorur将SVM应用于睡眠纺锤波 (N2阶段的特征波形) 的提取中, 其正确率比ANN方法高7%, 充分证明了SVM应用于睡眠分期有着良好的效果。因此, 本系统采用SVM作为自动睡眠分期算法。整体算法框架如图3所示。当算法系统收到用户的数据后, 以30 s每帧分割, 从这些数据中提取出特征值, 输入到SVM分类中, 得到睡眠分期结果返回用户。

1.1 提取特征值
特征是用来表示EEG所包含的信息。本文从频域特征、时域特征、其他特征等三个方面提取特征值。

1.1.1 频域特征
已有研究表明, 随着睡眠的深度, EEG的频率降低。EEG频段通常分为4个频段:σ (0.5~4Hz) , θ (4~8 Hz) , α (8~13 Hz) , β (13~30 Hz) 。在本研究中, 采用快速傅里叶 (fast frequency transform, FFT) 变换来获取频域信息, 如下:式中:xk为时域采样值;xn为频域变换值;N为采样点数。本研究中取N=128。
经过FFT变换后, 提取出频域平均能量、各个频带的相对能量、各个频带的绝对能量、频带能量比、各个频带的局部均差值以及频带幅度最大值。其中, 频带局部均差值是局部最大最小值的和的均值, 定义如方程 (2) 所示。
式中:x[n]为EEG频域变换值。

1.1.2 时域特征
本研究中主要提取了信号时域均值、均方根、方差、偏度及峰态特征。

1.1.3 其他特征
除了上述特征外, 还提取了一些频带时长、频谱熵、频带熵等。频带时长基于短时傅里叶变化 (the short-time Fourier transform, STFT) , 其定义式为:
式中:w (t) 是窗函数;τ为窗大小, 在本研究中, 取τ=100。
定义频带时长为在一定的频率范围内, 信号幅度超过阈值的时间长度。其定义式如方程 (4) 所示。
式中:STFT (t, f) 为STFT变换结果;L为频率下限;H为频率上限;thld为阈值。在本研究中, σ段thldδ=50μV, θ段thldθ=25μV, α段thldθ=25μV, β段thldθ=25μV。

1.2 SVM分类器
支持向量机 (SVM) [9]的基本原理是统计学习理论, 通过寻求结构化风险最小将算法, 从而实现在最小化经验风险和置信范围的基础上, 使分类具备最强的泛化能力。它将数据映射到高维度的空间, 寻找一个分隔平面使得其有最大间隔。设有m个训练样本的样本集{xi, yi}, i=1, 2, …, m, yi∈{-1, 1}, xi∈Rd。SVM的损失函数及约束条件如下:
式中:w为超平面的法向量;ξk为松弛变量, 表示在线性不可分的情况下, 数据点的偏离量, 是一个需要优化的量;C为惩罚因数, 控制对于错分样本的惩罚程度, 是一个确定正值。Φ (xk) 为一个映射函数, 主要解决线性不可分问题下向量的空间映射问题。映射去取决于所选择的核函数, 两者关系如方程 (6) 所示。
式中:k (x, x’) 为核函数;Φ (x) 为映射函数。
常见的核函数有线性核函数、多项式核函数、高斯核函数、sigmoid核函数等。本文实验将选择高斯核RBF核函数。
对于任意的SVM的决策 (预测) 函数如下:

式中:w为超平面的法向量;Φ (x) 为映射函数。
SVM算法通常适用于二分类问题。对于多分类问题, 就需要以二分类为基础构造多分类器。有向无环图SVM (directed acyclic graph SVM, DAG-SVM) 是其中常用的方法。对于N分类问题, DAG_SVM包括N (N-1) /2个节点, 每个节点是一个一对一的二分类器。这些分类器按层排列为N-1层有向非循环图 (DAG) [10]。

2 讨论与结论
在睡眠监测领域, 国内外都主要采用多导睡眠监测仪在医院中完成。该方法方便性差、代价高、耗时长。对于采集的数据, 主要依靠医生人工分析, 容易因为个人的经验、标准不同而造成结果的误差。本文提出基于SVM的便携式睡眠监测系统, 系统由小型用户端设备和服务器端设备组成, 用户端设备通过无线通信网络与服务器公共网络通信, 既达到远距离家庭监测的目的, 也减小了监测设备体积, 提高了便携型和整体管理能力。在服务端采用SVM作为自动睡眠分期算法, 能够较好较快地分析睡眠, 实验表明, 平均每帧的分析时间为1.45s, 正确率为81%, 达到了实时准确睡眠监测的目的, 相比于多导睡眠监测仪的人工睡眠分析, 提高了实时性。系统的用户端设备仅由采集设备和无线传输设备 (通常为手机) 组成, 体积小, 具有良好的便携性。系统除了能够自动睡眠分期外, 还实现医院管理、医生管理、患者管理等各种系统管理功能, 提高提升了用户体验。因此, 本系统在家用睡眠监测领域拥有着良好的应用前景。

⛄二、部分源代码

function [model,H] = lssvmMATLAB(model)
% Only for intern LS-SVMlab use;
%
% MATLAB implementation of the LS-SVM algorithm. This is slower
% than the C-mex implementation, but it is more reliable and flexible;
%
%
% This implementation is quite straightforward, based on MATLAB’s
% backslash matrix division (or PCG if available) and total kernel
% matrix construction. It has some extensions towards advanced
% techniques, especially applicable on small datasets (weighed
% LS-SVM, gamma-per-datapoint)

% Copyright © 2002, KULeuven-ESAT-SCD, License & help @ http://www.esat.kuleuven.ac.be/sista/lssvmlab

%fprintf(‘~’);
%
% is it weighted LS-SVM ?
%
weighted = (length(model.gam)>model.y_dim);
if and(weighted,length(model.gam)~=model.nb_data),
warning(‘not enough gamma’‘s for Weighted LS-SVMs, simple LS-SVM applied’);
weighted=0;
end

% computation omega and H
omega = kernel_matrix(model.xtrain(model.selector, 1:model.x_dim), …
model.kernel_type, model.kernel_pars);

% initiate alpha and b
model.b = zeros(1,model.y_dim);
model.alpha = zeros(model.nb_data,model.y_dim);

for i=1:model.y_dim,
H = omega;
model.selector=~isnan(model.ytrain(:,i));
nb_data=sum(model.selector);
if size(model.gam,2)==model.nb_data,
try invgam = model.gam(i,:).^-1; catch, invgam = model.gam(1,:).^-1;end
for t=1:model.nb_data, H(t,t) = H(t,t)+invgam(t); end
else
try invgam = model.gam(i,1).^-1; catch, invgam = model.gam(1,1).^-1;end
for t=1:model.nb_data, H(t,t) = H(t,t)+invgam; end
end

v = H(model.selector,model.selector)\model.ytrain(model.selector,i);
%eval('v  = pcg(H,model.ytrain(model.selector,i), 100*eps,model.nb_data);','v = H\model.ytrain(model.selector, i);');
nu = H(model.selector,model.selector)\ones(nb_data,1);
%eval('nu = pcg(H,ones(model.nb_data,i), 100*eps,model.nb_data);','nu = H\ones(model.nb_data,i);');
s = ones(1,nb_data)*nu(:,1);
model.b(i) = (nu(:,1)'*model.ytrain(model.selector,i))./s;
model.alpha(model.selector,i) = v(:,1)-(nu(:,1)*model.b(i));

end
% Copyright © 2010, KULeuven-ESAT-SCD, License & help @ http://www.esat.kuleuven.be/sista/lssvmlab

disp(’ This demo illustrates facilities of LS-SVMlab’);
disp(’ with respect to unsupervised learning.');

disp(’ a demo dataset is generated…');
clear yin yang samplesyin samplesyang mema
% initiate variables and construct the data
nb =200;
sig = .20;

% construct data
leng = 1;
for t=1:nb,
yin(t,:) = [2.sin(t/nbpileng) 2.cos(.61t/nbpileng) (t/nbsig)];
yang(t,:) = [-2.sin(t/nbpileng) .45-2.cos(.61t/nbpileng) (t/nbsig)];
samplesyin(t,:) = [yin(t,1)+yin(t,3).*randn yin(t,2)+yin(t,3).*randn];
samplesyang(t,:) = [yang(t,1)+yang(t,3).*randn yang(t,2)+yang(t,3).*randn];
end

% plot the data
figure; hold on;
plot(samplesyin(:,1),samplesyin(:,2),‘+’,‘Color’,[0.6 0.6 0.6]);
plot(samplesyang(:,1),samplesyang(:,2),‘+’,‘Color’,[0.6 0.6 0.6]);
xlabel(‘X_1’);
ylabel(‘X_2’);
title(‘Structured dataset’);
disp(’ (press any key)');
pause

%
% kernel based Principal Component Analysis
%
disp(’ ‘);
disp(’ extract the principal eigenvectors in feature space’);
disp(’ >> nb_pcs=4;‘); nb_pcs = 4;
disp(’ >> sig2 = .8;‘); sig2 = .8;
disp(’ >> [lam,U] = kpca([samplesyin;samplesyang],‘‘RBF_kernel’’,sig2,[],‘‘eigs’’,nb_pcs); ‘);
[lam,U] = kpca([samplesyin;samplesyang],‘RBF_kernel’,sig2,[],‘eigs’,nb_pcs);
disp(’ (press any key)');
pause

%
% make a grid over the inputspace
%
disp(’ ‘);
disp(’ make a grid over the inputspace:‘);
disp(’>> Xax = -3:0.1:3; Yax = -2.0:0.1:2.5;‘); Xax = -3:0.1:3; Yax = -2.0:0.1:2.5;
disp(’>> [A,B] = meshgrid(Xax,Yax);‘); [A,B] = meshgrid(Xax,Yax);
disp(’>> grid = [reshape(A,prod(size(A)),1) reshape(B,1,prod(size(B)))‘’]; ');

⛄三、运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

⛄四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1]林秀晶,钱松荣.基于SVM的便携式睡眠监测系统设计[J].北京生物医学工程. 2015,34(03)

3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除

  • 2
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
svm分类基于Matlab鸽群算法优化支持向量机(SVM)数据分类是一种利用鸽群算法来优化SVM模型参数并进行数据分类的方法。鸽群算法是一种基于自然界鸟群觅食行为的优化算法,通过模拟鸟群中鸟类之间的信息交流和协作,来求解最优化问题。 在使用鸽群算法优化SVM模型之前,我们首先需要了解SVM模型的原理。SVM是一种二分类模型,通过在特征空间中找到一个最优的超平面来实现数据的分类。在SVM模型中,支持向量是决定超平面位置和方向的关键要素。 鸽群算法优化SVM模型的过程如下: 1. 初始化鸽群规模和初始解。 2. 根据当前解,计算每个个体适应度值。适应度值反映了个体解的好坏程度。 3. 选择适应度最好的个体作为当前最佳解,并保存其对应的超平面参数。 4. 利用鸽群的信息交流和协作,更新所有鸽子的位置和速度。 5. 根据更新后的位置和速度,计算新解的适应度值。 6. 根据新解的适应度值,更新当前最佳解。 7. 重复步骤4-6,直至满足停止准则或达到最大迭代次数。 通过鸽群算法优化SVM模型,可以得到一组最佳的超平面参数,从而实现对数据的分类。这种方法能够克服传统的SVM模型由于初始解的不合理和局部最优解的问题,进而改善了分类结果的准确性和鲁棒性。 以下是一个简化的Matlab源码示例(仅供参考): ```matlab % 设置鸽群规模和最大迭代次数 N = 50; MaxIter = 100; % 初始化鸽子位置和速度 X = rand(N, 2); V = rand(N, 2); % 初始化最佳解和适应度值 BestX = zeros(1, 2); BestFitness = inf; % 迭代优化 for iter = 1:MaxIter % 计算适应度值 fitness = CalculateFitness(X); % 更新最佳解 [minFitness, minIndex] = min(fitness); if minFitness < BestFitness BestFitness = minFitness; BestX = X(minIndex, :); end % 更新速度和位置 V = UpdateVelocity(V, X, BestX); X = UpdatePosition(X, V); end % 输出最佳解和适应度值 disp('Best Solution:'); disp(BestX); disp('Best Fitness:'); disp(BestFitness); % 计算适应度值的函数 function fitness = CalculateFitness(X) % 计算每个个体的适应度值 % ... end % 更新速度的函数 function V = UpdateVelocity(V, X, BestX) % 根据鸽子当前位置和最佳解更新速度 % ... end % 更新位置的函数 function X = UpdatePosition(X, V) % 根据鸽子当前速度更新位置 % ... end ``` 以上是关于基于Matlab鸽群算法优化支持向量机(SVM)数据分类的简要介绍和示例源码。这种方法可以提高SVM模型的性能,但在实际应用中还需要根据具体情况进行调试和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海神之光

有机会获得赠送范围1份代码

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值