【脑电信号】基于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 (c) 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;endfor t=1:model.nb_data, H(t,t) = H(t,t)+invgam(t); endelsetry invgam = model.gam(i,1).^-1; catch, invgam = model.gam(1,1).^-1;endfor t=1:model.nb_data, H(t,t) = H(t,t)+invgam; endend 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 (c) 2010, KULeuven-ESAT-SCD, License & help @ http://www.esat.kuleuven.be/sista/lssvmlabdisp(' 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/nb*pi*leng) 2.*cos(.61*t/nb*pi*leng) (t/nb*sig)]; yang(t,:) = [-2.*sin(t/nb*pi*leng) .45-2.*cos(.61*t/nb*pi*leng) (t/nb*sig)]; 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] 沈再陽.精通MATLAB信號處理[M].清華大學出版社,2015.
[2]高寶建,彭進業,王琳,潘建壽.信號與系統——使用MATLAB分析與實現[M].清華大學出版社,2020.
[3]王文光,魏少明,任欣.信號處理與系統分析的MATLAB實現[M].電子工業出版社,2018.
[4]林秀晶,錢松榮.基于SVM的便攜式睡眠監測系統設計[J].北京生物醫學工程. 2015,34(03)
總結
以上是生活随笔為你收集整理的【脑电信号】基于matlab SVM分期睡眠监测【含Matlab源码 611期】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MATLAB图像处理学习日记之__图像的
- 下一篇: 485接口EMC电路设计方案