Виявлення візерунків у хвилях


80

Я намагаюся прочитати зображення з електрокардіографії та виявити кожну з основних хвиль у ньому (зубця Р, комплексу QRS та зубця Т). Тепер я можу прочитати зображення і отримати вектор, подібний до (4.2; 4.4; 4.9; 4.7; ...), що представляє значення в електрокардіографії, що становить половину проблеми. Мені потрібен алгоритм, який може пройти цей вектор і виявити, коли кожна з цих хвиль починається і закінчується.

Ось приклад одного з графіків:

текст заміщення

Було б легко, якби вони завжди мали однаковий розмір, але це не так, як це працює, або якби я знав, скільки хвиль буде мати ЕКГ, але він також може змінюватися. Хтось має якісь ідеї?

Дякую!

Оновлення

Приклад того, чого я намагаюся досягти:

Враховуючи хвилю

текст заміщення

Я можу витягти вектор

[0; 0; 20; 20; 20; 19; 18; 17; 17; 17; 17; 17; 16; 16; 16; 16; 16; 16; 16; 17; 17; 18; 19; 20; 21; 22; 23; 23; 23; 25; 25; 23; 22; 20; 19; 17; 16; 16; 14; 13; 14; 13; 13; 12; 12; 12; 12; 12; 11; 11; 10; 12; 16; 22; 31; 38; 45; 51; 47; 41; 33; 26; 21; 17; 17; 16; 16; 15; 16; 17; 17; 18; 18; 17; 18; 18; 18; 18; 18; 18; 18; 17; 17; 18; 19; 18; 18; 19; 19; 19; 19; 20; 20; 19; 20; 22; 24; 24; 25; 26; 27; 28; 29; 30; 31; 31; 31; 32; 32; 32; 31; 29; 28; 26; 24; 22; 20; 20; 19; 18; 18; 17; 17; 16; 16; 15; 15; 16; 15; 15; 15; 15; 15; 15; 15; 15; 15; 14; 15; 16; 16; 16; 16; 16; 16; 16; 16; 16; 15; 16; 15; 15; 15; 16; 16; 16; 16; 16; 16; 16; 16; 15; 16; 16; 16; 16; 16; 15; 15; 15; 15; 15; 16; 16; 17; 18; 18; 19; 19; 19; 20; 21; 22; 22; 22; 22; 21; 20; 18; 17; 17; 15; 15; 14; 14; 13; 13; 14; 13; 13; 13; 12; 12; 12; 12; 13; 18; 23; 30; 38; 47; 51; 44; 39; 31; 24; 18; 16; 15; 15; 15; 15; 15; 15; 16; 16; 16; 17; 16; 16; 17; 17; 16; 17; 17; 17; 17; 18; 18; 18; 18; 19; 19; 20; 20; 20; 20; 21; 22; 22; 24; 25; 26; 27; 28; 29; 30; 31; 32; 33; 32; 33; 33; 33; 32; 30; 28; 26; 24; 23; 23; 22; 20; 19; 19; 18; 17; 17; 18; 17; 18; 18; 17; 18; 17; 18; 18; 17; 17; 17; 17; 16; 17; 17; 17; 18; 18; 17; 17; 18; 18; 18; 19; 18; 18; 17; 18; 18; 17; 17; 17; 17; 17; 18; 17; 17; 18; 17; 17; 17; 17; 17; 17; 17; 18; 17; 17; 18; 18; 18; 20; 20; 21; 21; 22; 23; 24; 23; 23; 21; 21; 20; 18; 18; 17; 16; 14; 13; 13; 13; 13; 13; 13; 13; 13; 13; 12; 12; 12; 16; 19; 28; 36; 47; 51; 46; 40; 32; 24; 20; 18; 16; 16; 16; 16; 15; 16; 16; 16; 17; 17; 17; 18; 17; 17; 18; 18; 18; 18; 19; 18; 18; 19; 20; 20; 20; 20; 20; 21; 21; 22; 22; 23; 25; 26; 27; 29; 29; 30; 31; 32; 33; 33; 33; 34; 35; 35; 35; 0; 0; 0; 0;] 16; 16; 16; 17; 16; 16; 17; 17; 16; 17; 17; 17; 17; 18; 18; 18; 18; 19; 19; 20; 20; 20; 20; 21; 22; 22; 24; 25; 26; 27; 28; 29; 30; 31; 32; 33; 32; 33; 33; 33; 32; 30; 28; 26; 24; 23; 23; 22; 20; 19; 19; 18; 17; 17; 18; 17; 18; 18; 17; 18; 17; 18; 18; 17; 17; 17; 17; 16; 17; 17; 17; 18; 18; 17; 17; 18; 18; 18; 19; 18; 18; 17; 18; 18; 17; 17; 17; 17; 17; 18; 17; 17; 18; 17; 17; 17; 17; 17; 17; 17; 18; 17; 17; 18; 18; 18; 20; 20; 21; 21; 22; 23; 24; 23; 23; 21; 21; 20; 18; 18; 17; 16; 14; 13; 13; 13; 13; 13; 13; 13; 13; 13; 12; 12; 12; 16; 19; 28; 36; 47; 51; 46; 40; 32; 24; 20; 18; 16; 16; 16; 16; 15; 16; 16; 16; 17; 17; 17; 18; 17; 17; 18; 18; 18; 18; 19; 18; 18; 19; 20; 20; 20; 20; 20; 21; 21; 22; 22; 23; 25; 26; 27; 29; 29; 30; 31; 32; 33; 33; 33; 34; 35; 35; 35; 0; 0; 0; 0;] 16; 16; 16; 17; 16; 16; 17; 17; 16; 17; 17; 17; 17; 18; 18; 18; 18; 19; 19; 20; 20; 20; 20; 21; 22; 22; 24; 25; 26; 27; 28; 29; 30; 31; 32; 33; 32; 33; 33; 33; 32; 30; 28; 26; 24; 23; 23; 22; 20; 19; 19; 18; 17; 17; 18; 17; 18; 18; 17; 18; 17; 18; 18; 17; 17; 17; 17; 16; 17; 17; 17; 18; 18; 17; 17; 18; 18; 18; 19; 18; 18; 17; 18; 18; 17; 17; 17; 17; 17; 18; 17; 17; 18; 17; 17; 17; 17; 17; 17; 17; 18; 17; 17; 18; 18; 18; 20; 20; 21; 21; 22; 23; 24; 23; 23; 21; 21; 20; 18; 18; 17; 16; 14; 13; 13; 13; 13; 13; 13; 13; 13; 13; 12; 12; 12; 16; 19; 28; 36; 47; 51; 46; 40; 32; 24; 20; 18; 16; 16; 16; 16; 15; 16; 16; 16; 17; 17; 17; 18; 17; 17; 18; 18; 18; 18; 19; 18; 18; 19; 20; 20; 20; 20; 20; 21; 21; 22; 22; 23; 25; 26; 27; 29; 29; 30; 31; 32; 33; 33; 33; 34; 35; 35; 35; 0; 0; 0; 0;] 19; 20; 20; 20; 20; 21; 22; 22; 24; 25; 26; 27; 28; 29; 30; 31; 32; 33; 32; 33; 33; 33; 32; 30; 28; 26; 24; 23; 23; 22; 20; 19; 19; 18; 17; 17; 18; 17; 18; 18; 17; 18; 17; 18; 18; 17; 17; 17; 17; 16; 17; 17; 17; 18; 18; 17; 17; 18; 18; 18; 19; 18; 18; 17; 18; 18; 17; 17; 17; 17; 17; 18; 17; 17; 18; 17; 17; 17; 17; 17; 17; 17; 18; 17; 17; 18; 18; 18; 20; 20; 21; 21; 22; 23; 24; 23; 23; 21; 21; 20; 18; 18; 17; 16; 14; 13; 13; 13; 13; 13; 13; 13; 13; 13; 12; 12; 12; 16; 19; 28; 36; 47; 51; 46; 40; 32; 24; 20; 18; 16; 16; 16; 16; 15; 16; 16; 16; 17; 17; 17; 18; 17; 17; 18; 18; 18; 18; 19; 18; 18; 19; 20; 20; 20; 20; 20; 21; 21; 22; 22; 23; 25; 26; 27; 29; 29; 30; 31; 32; 33; 33; 33; 34; 35; 35; 35; 0; 0; 0; 0;] 19; 20; 20; 20; 20; 21; 22; 22; 24; 25; 26; 27; 28; 29; 30; 31; 32; 33; 32; 33; 33; 33; 32; 30; 28; 26; 24; 23; 23; 22; 20; 19; 19; 18; 17; 17; 18; 17; 18; 18; 17; 18; 17; 18; 18; 17; 17; 17; 17; 16; 17; 17; 17; 18; 18; 17; 17; 18; 18; 18; 19; 18; 18; 17; 18; 18; 17; 17; 17; 17; 17; 18; 17; 17; 18; 17; 17; 17; 17; 17; 17; 17; 18; 17; 17; 18; 18; 18; 20; 20; 21; 21; 22; 23; 24; 23; 23; 21; 21; 20; 18; 18; 17; 16; 14; 13; 13; 13; 13; 13; 13; 13; 13; 13; 12; 12; 12; 16; 19; 28; 36; 47; 51; 46; 40; 32; 24; 20; 18; 16; 16; 16; 16; 15; 16; 16; 16; 17; 17; 17; 18; 17; 17; 18; 18; 18; 18; 19; 18; 18; 19; 20; 20; 20; 20; 20; 21; 21; 22; 22; 23; 25; 26; 27; 29; 29; 30; 31; 32; 33; 33; 33; 34; 35; 35; 35; 0; 0; 0; 0;] 17; 18; 17; 18; 18; 17; 18; 17; 18; 18; 17; 17; 17; 17; 16; 17; 17; 17; 18; 18; 17; 17; 18; 18; 18; 19; 18; 18; 17; 18; 18; 17; 17; 17; 17; 17; 18; 17; 17; 18; 17; 17; 17; 17; 17; 17; 17; 18; 17; 17; 18; 18; 18; 20; 20; 21; 21; 22; 23; 24; 23; 23; 21; 21; 20; 18; 18; 17; 16; 14; 13; 13; 13; 13; 13; 13; 13; 13; 13; 12; 12; 12; 16; 19; 28; 36; 47; 51; 46; 40; 32; 24; 20; 18; 16; 16; 16; 16; 15; 16; 16; 16; 17; 17; 17; 18; 17; 17; 18; 18; 18; 18; 19; 18; 18; 19; 20; 20; 20; 20; 20; 21; 21; 22; 22; 23; 25; 26; 27; 29; 29; 30; 31; 32; 33; 33; 33; 34; 35; 35; 35; 0; 0; 0; 0;] 17; 18; 17; 18; 18; 17; 18; 17; 18; 18; 17; 17; 17; 17; 16; 17; 17; 17; 18; 18; 17; 17; 18; 18; 18; 19; 18; 18; 17; 18; 18; 17; 17; 17; 17; 17; 18; 17; 17; 18; 17; 17; 17; 17; 17; 17; 17; 18; 17; 17; 18; 18; 18; 20; 20; 21; 21; 22; 23; 24; 23; 23; 21; 21; 20; 18; 18; 17; 16; 14; 13; 13; 13; 13; 13; 13; 13; 13; 13; 12; 12; 12; 16; 19; 28; 36; 47; 51; 46; 40; 32; 24; 20; 18; 16; 16; 16; 16; 15; 16; 16; 16; 17; 17; 17; 18; 17; 17; 18; 18; 18; 18; 19; 18; 18; 19; 20; 20; 20; 20; 20; 21; 21; 22; 22; 23; 25; 26; 27; 29; 29; 30; 31; 32; 33; 33; 33; 34; 35; 35; 35; 0; 0; 0; 0;] 13; 13; 13; 13; 13; 13; 13; 13; 12; 12; 12; 16; 19; 28; 36; 47; 51; 46; 40; 32; 24; 20; 18; 16; 16; 16; 16; 15; 16; 16; 16; 17; 17; 17; 18; 17; 17; 18; 18; 18; 18; 19; 18; 18; 19; 20; 20; 20; 20; 20; 21; 21; 22; 22; 23; 25; 26; 27; 29; 29; 30; 31; 32; 33; 33; 33; 34; 35; 35; 35; 0; 0; 0; 0;] 13; 13; 13; 13; 13; 13; 13; 13; 12; 12; 12; 16; 19; 28; 36; 47; 51; 46; 40; 32; 24; 20; 18; 16; 16; 16; 16; 15; 16; 16; 16; 17; 17; 17; 18; 17; 17; 18; 18; 18; 18; 19; 18; 18; 19; 20; 20; 20; 20; 20; 21; 21; 22; 22; 23; 25; 26; 27; 29; 29; 30; 31; 32; 33; 33; 33; 34; 35; 35; 35; 0; 0; 0; 0;]

Я хотів би виявити, наприклад

P-хвиля в [19 - 37]

Комплекс QRS у [51 - 64]

тощо ...


12
Це справді цікава проблема!
jonnii

15
Це один раз, коли я дуже сподіваюся, що це питання - домашнє завдання!
кафе

Подивіться на мою редакцію, я відповів на ваші правки ...
грак

1
Це питання ДИВУЄ, мені довелося бігти назад до свого комп’ютера, щоб оновити своє рішення. Сподіваюсь, вам подобається :)
грак

Я знаю хлопця, який працював на цій ниві. Тут ви можете знайти список його публікацій . Якщо я добре пам’ятаю, він використовує приховані моделі Маркова, щоб надійно виявляти хвилі проти навчального набору відомих фігур, але більше деталей ви знайдете в роботах.
Стефано Боріні

Відповіді:


55

Перше, що я б зробив, це побачити, що вже є там . Дійсно, ця конкретна проблема вже була широко досліджена. Ось короткий огляд деяких справді простих методів: посилання .

Я повинен відповісти і на іншу відповідь. Я займаюся дослідженнями обробки сигналів та пошуку музичної інформації. На перший погляд, ця проблема дійсно схожа на виявлення початку, але контекст проблеми неоднаковий. Цей тип біологічної обробки сигналів, тобто виявлення фаз P, QRS і T, може використовувати знання про конкретні характеристики часової області кожної з цих форм хвиль. Виявлення початку в MIR насправді не робить. (Принаймні не надійно.)

Одним із підходів, який би добре працював для виявлення QRS (але не обов'язково для виявлення початку нот), є динамічне перекручування часу. Коли характеристики часової області залишаються незмінними, DTW може працювати надзвичайно добре. Ось короткий документ IEEE, який використовує DTW для цієї проблеми: посилання .

Це приємна стаття журналу IEEE, яка порівнює багато методів: посилання . Ви побачите, що було випробувано багато поширених моделей обробки сигналів. Знежиріть папір і спробуйте той, який ви розумієте на базовому рівні.

EDIT: Після перегляду цих статей підхід, заснований на вейвлеті, здається мені найбільш інтуїтивним. DTW теж буде добре працювати, і там існують модулі DTW, але вейвлет-підхід мені здається найкращим. Хтось інший відповів, використовуючи похідні сигналу. У моєму першому посиланні розглядаються методи до 1990 року, які це роблять, але я підозрюю, що вони не настільки надійні, як сучасніші методи.

РЕДАГУВАТИ: Я спробую дати просте рішення, коли мені випаде така можливість, але причина, по якій, на мою думку, тут підходять вейвлети, полягає в тому, що вони корисні при параметризації різноманітних форм незалежно від масштабування часу та амплітуди . Іншими словами, якщо у вас є сигнал з однаковою повторюваною тимчасовою формою, але при різних масштабах часу та амплітудах, вейвлет-аналіз все одно може розпізнати ці форми як подібні (грубо кажучи). Також зауважте, що я начебто відношу банки фільтрів до цієї категорії. Подібні речі.


Я знаю, що про це багато просять, але я все одно доживу до простого рішення.
Дієго,

Мої вибачення. Я був зайнятий. Це знову в моєму списку справ.
Steve Tjoa,

4
Топ-посилання вже мертве :(
basickarl

Вибачте. Дві верхні посилання тепер виправлені.
Steve Tjoa

Перше посилання знову не працює, але я знайшов його тут . І це IEEE, тож я мав би це продовжувати працювати. Звичайно, якщо існує бар’єр витрат, є багато робіт на подібні теми.
Asaaj

17

Частиною цієї загадки є " виявлення початку ", і для вирішення цієї проблеми було написано ряд складних алгоритмів. Ось додаткова інформація про наступні дії .

Наступний фрагмент - відстань Хеммінга . Ці алгоритми дозволяють робити нечіткі порівняння, вхідні дані складають 2 масиви, а вихідні дані - ціле число "відстань" або різниця між 2 наборами даних. Чим менше число, тим більше подібні 2. Це дуже близько до того, що вам потрібно, але це не зовсім точно. Я пішов далі і вніс деякі модифікації в алгоритм відстані Хеммінга для розрахунку нової відстані, він, ймовірно, має назву, але я не знаю, що це таке. В основному він додає абсолютну відстань між кожним елементом масиву і повертає загальну. Ось код для нього на python.

import math

def absolute_distance(a1, a2, length):
       total_distance=0
       for x in range(0,length):
               total_distance+=math.fabs(a1[x]-a2[x])
       return total_distance

print(absolute_distance([1,3,9,10],[1,3,8,11],4))

Цей скрипт виводить 2, що є відстанню між цими 2 масивами.

Тепер для складання цих частин. Ви можете використовувати виявлення початку, щоб знайти початок усіх хвиль у наборі даних. Потім ви можете зациклювати ці місця, порівнюючи кожну хвилю із зразком P-хвилі. Якщо ви потрапили в комплекс QRS, відстань буде найбільшою. Якщо ви натиснете іншу P-хвилю, число не буде нульовим, але воно буде набагато меншим. Відстань між будь-якою P-хвилею і будь-якою T-хвилею буде досить малою, Втім, це не проблема, якщо ви зробите наступне припущення:

The distance between any p-wave and any other p-wave will be smaller than the distance between any p-wave and any t-wave.

Серія виглядає приблизно так: pQtpQtpQt ... Зубець p і t-хвиля знаходяться поруч один з одним, але оскільки ця послідовність передбачувана, її буде легше прочитати.

З іншого боку, це, мабуть, рішення на основі числення. Однак, на мою думку, підгонка кривих та інтеграли роблять цю проблему більш безладною. Функція відстані, яку я написав, знайде різницю площ, яка дуже схожа, віднімаючи інтеграл обох кривих.

Можливо, можна пожертвувати початковими обчисленнями на користь повторення по 1 точці за раз і, таким чином, виконувати обчислення відстані O (n), де n - кількість точок на графіку. Якби у вас був перелік усіх цих розрахунків відстані і ви знали там, де 50 послідовностей pQt, тоді ви знали б 50 найкоротших відстаней, які не перекриваються, де знаходяться всі місця розташування p-хвиль. Бінго! як це для простоти? Однак компромісом є втрата ефективності через збільшення кількості розрахунків відстані.


Простіші методи, такі як виявлення збільшення амплітуди часової області, як правило, можуть призвести до незадовільно великої кількості помилкових спрацьовувань чи помилкових негативних результатів. Ось чого я боявся. Я запропонував те саме в своєму (менш ніж оптимальному) рішенні.
Vivin Paliath

3
Так, ваш альго цікавий, і ви можете мати обмежений успіх. Це справді складна проблема, де немає ідеального рішення.
грак

Дякую за вашу відповідь, Майкл, я думаю над цим і незабаром надішлю відгук!
Alaor

8

Ви можете використовувати перехресну кореляцію . Візьміть модельний зразок кожного зразків і порівняйте їх із сигналом. Ви отримаєте піки, де кореляція висока. Я би очікував хороших результатів за допомогою цієї техніки, що витягує qrs та t хвилі. Після цього ви можете витягти p-хвилі, шукаючи піки сигналу кореляції, які передують qrs.

Перехресна кореляція - це досить простий у реалізації алгоритм. В основному:

x is array with your signal of length Lx
y is an array containing a sample of the signal you want to recognize of length Ly
r is the resulting correlation

for (i=0; i<Lx - Ly; i++){
  r[i] = 0;
  for (j=0; j<Ly ; j++){
    r[i] += x[i+j]*y[j];
  }
}

І шукайте піки в r (наприклад, значення, що перевищують порогове значення)


Це хороший перший підхід для спроб, оскільки хвиля завжди дотримується певної моделі. Але для цієї проблеми як масштабування часу, так і масштабування амплітуди можуть варіюватися, тому, зрештою, цей підхід не буде надійним у різних суб’єктів.
Steve Tjoa

Так, це лише перший підхід. Не надійний, але досить простий для кодування, щоб спробувати. Зіставлення зразків, як правило, є найпростішою технікою, і все ж дає певні результати. Хвилясті, безумовно, набагато кращі, звичайно.
nacmartin

7

Перше, що я б зробив, це спростити дані.

Замість аналізу абсолютних даних проаналізуйте обсяг змін від однієї точки до іншої.

Ось швидкий вкладиш, який буде приймати ;відокремлені дані як вхідні дані та виводити дельту цих даних.

perl -0x3b -ple'( $last, $_ ) = ( $_, $_-$last )' < test.in > test.out

Виконуючи його на наданих вами даних, виводиться такий результат:

0; 0; 20; 0; 0; -1; -1; -1; 0; 0; 0; 0; -1; 0; 0; 0; 0; 0; 0; 1; 0; 1; 1; 1; 1; 1; 1; 0; 0; 2; 0; -2; -1; -2; -1; -2; -1; 0; -2; -1; 1; -1; 0; - 1; 0; 0; 0; 0; -1; 0; -1; 2; 4; 6; 9; 7; 7; 6; -4; -6; -8; -7; -5; -4; 0; -1; 0; - 1; 1; 1; 0; 1; 0; -1; 1; 0; 0; 0; 0; 0; 0; -1; 0; 1; 1; -1; 0; 1; 0; 0; 0 ; 1; 0; -1; 1; 2; 2; 0; 1; 1; 1; 1; 1; 1; 1; 0; 0; 1; 0; 0; -1; -2; -1; -2; -2; -2; -2 ; 0; -1; -1; 0; -1; 0; -1; 0; -1; 0; 1; -1; 0; 0; 0; 0; 0; 0; 0; 0; -1; 1; 1; 0; 0; 0; 0; 0; 0; 0; 0; -1; 1; -1; 0; 0; 1; 0; 0; 0; 0; 0; 0; 0; -1; 1; 0; 0; 0; 0 ; -1; 0; 0; 0; 0; 1; 0; 1; 1; 0; 1; 0; 0; 1; 1; 1; 0; 0; 0; -1; -1; -2; - 1; 0; -2; 0; -1; 0; -1; 0; 1; -1; 0; 0; -1; 0; 0; 0; 1; 5; 5; 7; 8; 9; 4; -7; -5; -8 ; -7; -6; -2; -1; 0; 0; 0; 0; 0; 1; 0; 0; 1; -1; 0; 1; 0; -1; 1; 0; 0; 0 ; 1; 0; 0; 0; 1; 0; 1; 0; 0; 0; 1; 1; 0; 2; 1; 1; 1; 1; 1; 1; 1; 1; 1; -1; 1; 0; 0; -1; -2; -2; -2; -2; -1; 0; -1; -2; -1; 0; -1; -1; 0; 1; -1; 1; 0; -1; 1; -1; 1; 0; -1; 0; 0; 0; -1; 1; 0; 0; 1; 0; -1; 0; 1; 0; 0; 1; -1; 0; -1; 1; 0; -1; 0; 0 ; 0; 0; 1; -1; 0; 1; -1; 0; 0; 0; 0; 0; 0; 1; -1; 0; 1; 0; 0; 2; 0; 1; 0; 1; 1; 1; -1; 0; -2; 0; -1; -2; 0; -1; -1; -2; -1; 0; 0; 0; 0; 0; 0; 0; 0; -1; 0; 0; 4; 3; 9; 8; 11; 4; -5; -6; -8; -8; -4; -2; -2; 0; 0; 0; -1; 1; 0; 0; 1; 0; 0; 1; -1; 0; 1; 0; 0; 0; 1; -1; 0; 1; 1; 0; 0; 0; 0; 1; 0; 1; 0; 1; 2; 1; 1; 2; 0; 1 ; 1; 1; 1; 0; 0; 1; 1; 0; 0; -35; 0; 0; 0;

У наведеному вище тексті є нові рядки, які спочатку не містяться у вихідних даних.


Після того, як ви зробили це, тривіально знайти комплекс qrs.

perl -F';' -ane'@F = map { abs($_) > 2 and $_ } @F; print join ";", @F'< test.out

;; 20 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; 4; 6; 9; 7; 7; 6; -4; -6; -8; -7; -5; -4;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;; 5; 5; 7; 8; 9; 4; -7; -5; -8; -7; -6
;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;; 4; 3; 9; 8; 11; 4; -5; -6; -8; -8; -4;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - 35 ;;;

20І -35точки даних випливають з вихідних даних , починаючи і закінчуючи 0.

Щоб знайти інші точки даних, вам доведеться покладатися на узгодження шаблонів.


Якщо ви подивитесь на першу хвилю p, ви зможете чітко побачити закономірність.

0;0;0;0;0;0;1;0;1;1;1;1;1;1;0;0;2;0;-2;-1;-2;-1;-2;-1;0;-2;-1;1;-1;0;-1;0;0;0;0;
#           \________ up _______/   \________ down _________/

Однак не так просто побачити візерунок на другій хвилі p. Це тому, що другий поширюється далі

0;0;0;1;0;1;1;0;1;0;0;1;1;1;0;0;0;-1;-1;-2;-1;0;-2;0;-1;0;-1;0;1;-1;0;0;-1;0;0;0;
#     \________ up _______/       \________________ down ________________/

Третя хвиля р трохи нестабільна, ніж дві інші.

0;0;0;0;0;1;-1;0;1;0;0;2;0;1;0;1;1;1;-1;0;-2;0;-1;-2;0;-1;-1;-2;-1;0;0;0;0;0;
#                \_______ up ______/  \__________ down __________/

Ви знайшли б хвилі t подібним чином до p-хвиль. Головна відмінність полягає в тому, коли вони виникають.


Цього має бути достатньо для того, щоб розпочати.

Два однокласники лише для прикладу, не рекомендуються для щоденного використання.


Я відредагував це, щоб видалити нецензурно довгий рядок, який ламав сторінку. : P
GManNickG

@GMan Для мене це працювало нормально, який браузер ви використовуєте?
Бред Гілберт,

Firefox 3.5, ця лінія розтягнула сторінку по горизонталі. Я думаю, це відома помилка.
GManNickG

1
-1: Я бачу лише ручний підхід до вирішення проблеми, який користувачі могли зробити, просто побудувавши дані та вибравши вихідні точки.
Hannes Ovrén

4

Ці дві інші різкі вершини та долини також є комплексами QRS?

Зверху в моїй голові, я думаю, що вам потрібно зробити, це обчислити нахил цього графіка в кожній точці. Тоді вам також потрібно побачити, як швидко змінюється нахил (2-а похідна ???). Якщо у вас різкі зміни, ви знаєте, що досягли якоїсь різкої вершини. Звичайно, ви хочете обмежити виявлення змін, тому, можливо, ви захочете зробити щось на зразок "якщо нахил змінюється на X за часовий проміжок T", щоб ви не збирали крихітні нерівності на графіку.

Минув якийсь час з того часу, як я займався математикою ... і це здається математичним запитанням;) Ох, і аналізу сигналів я теж не робив :).

Просто додавши ще одну точку. Я також можу спробувати усереднити сигнал. Наприклад, усереднення останніх 3 або 4 точок даних. Я думаю , ви можете виявити , що різкі зміни занадто.


+1 за цікавий альго. Але я думаю, що ця проблема дещо складніша.
грак

Так, дві інші вершини та долини - це комплекси qrs. На зображенні насправді є 3 p хвилі, 3 qrs комплекси та 3 t хвилі. Це цікавий підхід, але я не бачу, як я можу обчислити 2-ю похідну, якщо у мене немає функції. Я думаю, ви говорите, щоб дати оцінку змінам значень і вибрати ті зміни, які мають високі бали, такі як початок і закінчення чогось, чи не так? Я спробую це, і я опублікую оновлення, коли отримаю якісь результати. Дякую за відповідь.
Алаор

Так, майже. Ви як би підрахуєте його, але робите це, обчислюючи нахил або бачачи, як амплітуда змінюється з часом.
Vivin Paliath

4

Я не фахівець у цій конкретній проблемі, але трохи загальніші відомості: скажімо, ви знаєте комплекс QRS (або одну з інших функцій, але для цього прикладу я буду використовувати комплекс QRS) відбувається приблизно за деякий фіксований часовий проміжок довжини L. Цікаво, чи можете ви розглянути це як проблему класифікації наступним чином:

  1. Розділіть сигнал на перекриваються вікна довжиною L. У кожному вікні є або немає повного комплексу QRS.
  2. Перетворення Фур'є кожного вікна. Вашими особливостями є потужність сигналу на кожній частоті.
  3. Навчіть дерево рішень, підтримуйте векторну машину тощо за деякими даними, котрі анотуються вручну.

3

Одним із підходів, який, швидше за все, дасть хороші результати, є підгонка кривої:

  • Поділіть безперервну хвилю на інтервали (мабуть, краще, щоб інтервали межували приблизно на половині шляху між різкими піками комплексів qrs). Враховуйте лише один інтервал за раз.
  • Визначте модельну функцію, яка може бути використана для апроксимації всіх можливих варіацій електрокардіографічних кривих. Це не так складно, як здається спочатку. Модельна функція може бути побудована як сума трьох функцій із параметрами для початку (t_), амплітуди (a_) та ширини (w_) кожної хвилі.

       f_model(t) = a_p   *  f_p  ((t-t_p  )/w_p) + 
                    a_qrs *  f_qrs((t-t_qrs)/w_qrs) +
                    a_t   *  f_t  ((t-t_t  )/w_t)
    

    Функції f_p(t), f_qrs(t)- f_t(t)це якась проста функція, яку можна використовувати для моделювання кожної з трьох хвиль.

  • Використовуйте алгоритм підгонки (наприклад, алгоритм Левенберга- Маркуардта http://en.wikipedia.org/wiki/Levenberg%E2%80%93Marquardt_algorithm ) для визначення параметрів підгонки a_p, t_p, w_p, a_qrs, t_qrs, w_qrs, a_t , t_t, w_t для набору даних кожного інтервалу.

    Параметри t_p, t_qrs та t_p - це ті, які вас цікавлять.


3

Це чудове питання! У мене є кілька думок:

Динамічне викривлення часу може бути цікавим інструментом тут. Ви встановите "шаблони" для своїх трьох класів, а потім, використовуючи DTW, зможете побачити кореляцію між вашим шаблоном і "шматками" сигналу (розбийте сигнал на, скажімо, 0,5-бітові біти, тобто 0 -5. 1-.6 .2-.7 ...). Я працював із чимось подібним для аналізу ходи з даними акселерометра, він працював досить добре.

Інший варіант - комбінований алгоритм обробки сигналів / машинного навчання. Знову розбийте свій сигнал на «шматки». Знову зробіть "шаблони" (вам потрібно близько десятка для кожного класу), візьміть ШПФ кожного шматка / шаблону, а потім використовуйте Наївний класифікатор Байєса (або інший класифікатор ML, але NB повинен скоротити його) для класифікації для кожного з твої три класи. Я також спробував це на даних про ходу, і мені вдалося отримати точність до 98% і згадати з відносно складними сигналами. Повідомте мене, як це працює, це дуже хвилююча проблема.


1

" Вейвлет-перетворення " може бути відповідним ключовим словом. Одного разу я відвідував презентацію того, хто використовував цю техніку для виявлення різних фаз серцебиття в галасливій ЕКГ.

Що стосується мого обмеженого розуміння, це дещо схоже на перетворення Фур'є, але з використанням (масштабованих) копій імпульсу у вашому випадку у формі серцебиття.


1

Показано, що вейвлети є найкращим інструментом для визначення піків у даних цього типу, коли піки мають "різний розмір" - масштабовані властивості вейвлетів роблять його ідеальним інструментом для цього типу багатомасштабного виявлення піків. Це виглядає як нестаціонарний сигнал, тому використання DFT не буде правильним інструментом, як припускають деякі, але якщо це дослідницький проект, ви можете подивитися на нього, використовуючи спектр сигналу (оцінений, використовуючи, по суті, ШПФ автокореляції сигналу.)

Ось чудова стаття, в якій розглядаються декілька методів виявлення піків - з цього варто почати.

-Павло


1

за допомогою BioSPPY

в даний час не можливо здійснити аналіз зубців Т, оскільки в даний час він містить лише аналіз зубців R. наприклад, Tstart Tpeak Tend

не отримують автоматичної угоди

потрібно було б скористатися власним аналізом.

моя пропозиція полягала б у спробі реалізувати наведений нижче метод

http://www.ncbi.nlm.nih.gov/pmc/articles/PMC3201026/

який я нещодавно виявив і виявив дуже цікавим

Інший метод аналізу хвиль t, на який варто звернути увагу, - це метод, який проводить команда ECGlib

http://ieeexplore.ieee.org/document/6713536/

сподіваюся, це допоможе


0

Я не читав відповіді одне одному досконально, але просканував їх і помітив, що ніхто не рекомендував дивитися на перетворення Фур'є, щоб сегментувати ці хвилі.

Для мене це здається чітким застосуванням гармонічного аналізу в математиці. Можливо, є кілька тонких моментів, яких я можу пропустити.

Коефіцієнти дискретного перетворення Фур’є дають вам амплітуду та фазу різних синусоїдальних компонентів, що складають ваш дискретний часовий сигнал, що, по суті, і є тим, що стани вашої проблеми ви хочете знайти.

Можливо, мені тут чогось не вистачає ...


Ви маєте рацію в тому, що тут застосовується гармонічний аналіз, але специфічність проблеми дозволяє певним підходам, таким як, можливо, вейвлет-аналіз, працювати краще, ніж загальні, що вивчають лише магнітні відгуки. Для цієї проблеми мають значення відносні зміщення фаз .
Steve Tjoa

0

По-перше, різні компоненти стандартної хвилі електрокардіограми можуть бути відсутніми на будь-якому даному графіку. Такий сюжет, як правило, ненормальний і зазвичай вказує на якусь проблему, але не можна обіцяти, що вони там.

По-друге, їх визнання - це стільки ж мистецтво, скільки наука, особливо в тих випадках, коли щось йде не так.

Моїм підходом може бути спроба навчити нейронну мережу ідентифікувати компоненти. Ви дасте йому попередні 30 секунд даних, нормалізовані, щоб найнижча точка становила 0, а найвища точка - 1,0, і вона мала б 11 виходів. Результати, які не були показниками відхилення від норми, були б ваговими для останніх 10 секунд. 0,0 буде на -10 секунд від теперішнього часу, а 1,0 означатиме зараз. Результатами будуть:

  1. Там, де почалася остання хвиля Р
  2. Там, де закінчилася остання хвиля Р
  3. Рейтинг аномалій останньої хвилі Р, одна крайність - "відсутня".
  4. Де розпочався найновіший комплекс QRS
  5. Де частина Q останнього комплексу QRS перетворилася на частину R.
  6. Де частина R найновішого комплексу QRS перетворилася на частину S.
  7. Там, де закінчився найновіший комплекс QRS.
  8. Рейтинг аномалій найновішого комплексу QRS з однією крайністю, яка відсутня.
  9. Там, де почалася остання хвиля Т.
  10. Де закінчилася остання хвиля Т.
  11. Рейтинг аномалій останньої хвилі Т, одна крайність - "відсутня".

Я міг би ще раз перевірити це на деяких інших видах аналізу, які запропонували люди, або використати ці інші види аналізу разом із результатами роботи нейронної мережі, щоб дати вам свою відповідь.

Звичайно, цей детальний опис нейронної мережі не слід сприймати як приписний. Я впевнений, що я не обов'язково вибирав найбільш оптимальні результати, наприклад, я просто підкинув деякі ідеї про те, якими вони можуть бути.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.