생리적 신호에서 분류 특징 추출하기
이 예제에서는 midcross
및 dtw
함수를 사용하여 걸음걸이 신호 데이터에서 특징을 추출하는 방법을 다룹니다. 걸음걸이 신호는 신경퇴행성 질환이 있는 환자의 걷기 패턴을 연구하는 데 사용됩니다. 건강한 사람과 환자는 서로 걸음과 걸음 사이의 시간이 다르게 나타나는 것으로 보고된 바 있습니다. midcross
를 사용하면 이 시간을 간편하게 계산할 수 있습니다. 사람의 걷기 속도 또한 시간이 경과함에 따라 달라집니다. dtw
는 워핑을 사용하여 걸음걸이 신호의 시간을 정렬하고 정량적으로 비교하는 간편한 방법을 제공합니다. 이 예제에서는 midcross
를 사용하여 걸음걸이 신호에서 각각의 발걸음을 찾고 dtw
를 사용하여 걸음걸이 신호의 세그먼트 간 거리를 계산합니다. 이렇게 구한 결과는 신호 분류를 위한 잠재적인 특징으로 검토됩니다. 이 예제에서는 걸음걸이 신호만을 다루지만, 여기에 소개된 함수를 사용하여 심전도(ECG)나 광용정맥파(PPG)와 같은 그 밖의 생리적 신호를 분석할 수도 있습니다.
걸음 간 시간 간격 측정하기
이 예제에서 분석하는 데이터셋은 근위축성 측삭경화증(ALS)이 있는 환자들과 대조군이 걸을 때 수집된 힘 데이터를 포함합니다. ALS는 루 게릭, 스티븐 호킹, 그리고 2014년에 '아이스 버킷 챌린지'로 유명해진 질환입니다.
환자 1명에 대한 걸음걸이 신호 데이터의 처음 30초를 불러온 후 플로팅합니다.
helperGaitPlot('als1m');
xlim([0 30])
이 데이터셋은 한쪽 발이 압력 감지 센서(Force Sensitive Resistor)에 가한 힘을 나타냅니다. 힘은 밀리볼트 단위로 측정됩니다. 각 기록의 길이는 1분이고 연구대상자의 왼발과 오른발에 대한 별도의 채널을 포함합니다. 데이터셋에서 각각의 발걸음은 발이 지면에 힘을 가한 후 발이 지면에서 떨어질 때의 힘의 급격한 변화로 특징지어집니다. ALS 환자 1명에 대해 급격한 변화를 찾으려면 midcross
를 사용하십시오.
midcross
를 사용하여 ALS 환자 1명의 왼발에 대해 각 교차를 찾아서 플로팅합니다. 모든 교차를 검출할 수 있도록 허용오차를 25%로 선택합니다.
Fs = 300; gaitSignal = helperGaitImport('als1m'); midcross(gaitSignal(1,:),Fs,'tolerance',25); xlim([0 30]) xlabel('Sample Number') ylabel('mV')
midcross
가 교차를 올바르게 식별합니다. 이번에는 이 함수를 사용하여 환자 10명으로 이루어진 그룹의 걸음 간 시간을 계산합니다. 5명은 대조군 연구대상자이고, 나머지 5명은 ALS 환자입니다. 각 환자의 왼발 기록을 사용하고, 처음 8개의 교차를 배제하여 과도를 제거합니다.
pnames = helperGaitImport(); for i = 1:10 gaitSignal = helperGaitImport(pnames{i}); IND2 = midcross(gaitSignal(1,:),Fs,'Tolerance',25); IST{i} = diff(IND2(9:2:end)); varIST(i) = var(IST{i}); end
걸음 간 시간을 플로팅합니다.
figure hold on for i = 1:5 plot(1:length(IST{i}),IST{i},'.-r') plot(1:length(IST{i+5}),IST{i+5},'.-b') end xlabel('Stride Number') ylabel('Time Between Strides (sec)') legend('ALS','Control')
걸음 간 시간의 분산은 ALS 환자 쪽이 전반적으로 높습니다.
걷기 패턴의 유사도 측정하기
발걸음 간 거리를 수량화했으니 이제 발걸음 간 변화와는 독립적으로 걸음걸이 신호 데이터의 모양을 분석하겠습니다. dtw
를 사용하여 신호의 두 세그먼트를 비교합니다. 이상적인 경우라면 치료나 질병이 진행됨에 따라 시간 경과에 따른 걸음걸이 신호의 모양을 비교할 것입니다. 여기서는 동일한 기록 중 두 세그먼트를 비교합니다. 한 세그먼트는 기록의 초반에서 가져온 것이고(sigsInitialLeft
), 다른 한 세그먼트는 끝부분에서 가져온 것입니다(sigsFinalLeft
). 각 세그먼트에는 여섯 걸음에 대한 기록이 있습니다.
걸음걸이 신호 데이터의 세그먼트를 불러옵니다.
load PNGaitSegments.mat
이 환자는 기록의 처음부터 끝까지 동일한 속도로 걷지 않습니다. dtw
는 워핑을 사용하여 세그먼트 간 거리의 시간을 정렬함으로써 세그먼트 간 거리에 대한 측정값을 제공합니다. dtw
를 사용하여 두 세그먼트를 비교합니다.
figure dtw(sigsInitialLeft{1},sigsFinalLeft{1}); legend('Early segment','Later segment','location','southeast')
두 세그먼트의 시간이 정렬되었습니다. 원래 신호의 오프셋에서 볼 수 있듯이 환자의 걸음 속도가 시간의 경과에 따라 변하는 것처럼 보이지만, dtw
는 두 세그먼트의 샘플이 반복되도록 허용함으로써 두 세그먼트를 맞춥니다. 걸음 간 시간의 분산과 함께 dtw
를 통해 측정된 거리가 걸음걸이 신호 분류기에 사용할 특징이 됩니다.
신호 분류를 위한 특징 벡터 생성하기
환자의 걸음걸이 신호를 바탕으로 환자가 건강한지 여부를 판단하는 분류기를 만든다고 가정하겠습니다. 걸음 간 시간의 분산 feature1
과 dtw
를 통해 측정된 초반 신호 세그먼트와 끝부분 신호 세그먼트의 거리 차 feature2
를 분류 특징으로 살펴봅니다.
특징 1은 앞에서 midcross
를 사용하여 계산되었습니다.
feature1 = varIST;
ALS 환자와 대조군에 대해 특징 2를 추출합니다.
feature2 = zeros(10,1); for i = 1:length(sigsInitialLeft) feature2(i) = dtw(sigsInitialLeft{i},sigsFinalLeft{i}); end
ALS 연구대상자와 대조군 연구대상자에 대한 특징을 플로팅합니다.
figure plot(feature1(1:5),feature2(1:5),'r*',... feature1(6:10),feature2(6:10),'b+',... 'MarkerSize',10,'LineWidth',1) xlabel('Variance of Inter-Stride Times') ylabel('Distance Between Segments') legend('ALS','Control')
ALS 환자가 걸음 간 시간 분산은 더 크지만 dtw
를 통해 측정된 세그먼트 간 거리는 더 적은 것으로 보입니다. 이들 특징은 상호 보완적이며, 신경망이나 서포트 벡터 머신과 같은 분류기에서 사용되는 것이 고려될 수 있습니다.
결론
midcross
와 dtw
는 걸음걸이 신호, 그리고 동작이나 활동의 서로 다른 속도로 인해 시간이 경과함에 따라 불규칙적으로 반복되는 기타 생리적 데이터를 비교하는 간편한 방법을 제공합니다. 이 예제에서는 midcross
를 사용하여 각 걸음의 시간을 찾았고 dtw
를 사용하여 세그먼트의 거리를 계산했습니다. dtw
는 midcross
거리가 측정하는 시간적 변화를 제거했기 때문에 이 두 값은 상호 보완적입니다. 특징으로서 이 두 메트릭은 이 데이터셋에 대한 대조군과 ALS 환자간을 분리할 수 있었습니다. 이와 마찬가지로, 활동의 함수로서 모양이 변하는 기타 생리적 신호를 검토하는 데 midcross
와 dtw
를 사용할 수 있습니다.
참고 문헌
[1] Goldberger, A. L., L. A. N. Amaral, L. Glass, J. M. Hausdorff, P. Ch. Ivanov, R. G. Mark, R. G. Mietus, G. B. Moody, C.-K. Peng, and H. E. Stanley. "PhysioBank, PhysioToolkit, and PhysioNet: Components of a New Research Resource for Complex Physiologic Signals." Circulation. Vol. 101, Number 23, 2000, pp. e215-e200.