Выявление закономерности в волнах

Я пытаюсь прочитать изображение из электрокардиографии и обнаружить каждую из основных волн в нем (P волна, комплекс QRS и волна T). Теперь я могу прочитать изображение и получить вектор как (4.2; 4.4; 4.9; 4.7;...) представитель значений в электрокардиографии, какова половина проблемы. Мне нужен алгоритм, который может идти через этот вектор и обнаружить, когда каждое из этого махает, запускаются и заканчиваются.

Вот пример одного из его графиков:

alt text

Было бы легко, если бы у них всегда был тот же размер, но он не похож на это работы, или если бы я знал, сколько волн ЭКГ имела бы, но он может варьироваться также. У кого-либо есть некоторые идеи?

Спасибо!

Обновление

Пример того, чего я пытаюсь достигнуть:

Учитывая волну

alt text

Я могу извлечь вектор

[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;]

Я хотел бы обнаружить, например

P волна в [19 - 37]

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

и т.д...

75
задан Nick Craver 24 December 2012 в 10:37
поделиться

12 ответов

Первое, что сделал бы я , это посмотрел, что уже есть . Действительно, эта конкретная проблема уже серьезно исследована. Вот краткий обзор некоторых действительно простых методов: ссылка .

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

Один из подходов, который может хорошо работать для обнаружения QRS (но не обязательно для обнаружения начала нот), - это динамическое искажение времени. Когда характеристики во временной области остаются неизменными, DTW может работать замечательно. Вот небольшая статья IEEE, в которой для решения этой проблемы используется DTW: ссылка .

Это хорошая статья в журнале IEEE, в которой сравниваются многие методы: ссылка . Вы увидите, что было испробовано много распространенных моделей обработки сигналов. Просмотрите лист и попробуйте тот, который вам понятен на базовом уровне.

РЕДАКТИРОВАТЬ: После просмотра этих статей подход, основанный на вейвлетах, мне кажется наиболее интуитивным. DTW тоже будет работать хорошо, и существуют модули DTW, но мне кажется, что лучше всего подходит вейвлет-подход. Кто-то другой ответил, используя производные сигнала.Моя первая ссылка исследует методы до 1990 года, которые это делают, но я подозреваю, что они не так надежны, как более современные методы.

РЕДАКТИРОВАТЬ: Я постараюсь дать простое решение, когда у меня будет возможность, но причина , почему , я думаю, здесь подходят вейвлеты, заключается в том, что они полезны для параметризации широкого разнообразия форм независимо от масштабирование времени или амплитуды . Другими словами, если у вас есть сигнал с той же повторяющейся временной формой, но с разными временными масштабами и амплитудами, вейвлет-анализ все равно может распознать эти формы как похожие (грубо говоря). Также обратите внимание, что я как бы объединяю банки фильтров в эту категорию. Подобные вещи.

53
ответ дан 24 November 2019 в 11:42
поделиться

Ответ Мэтта заставил меня задуматься об этом:

public class Foo
{
    private readonly Subject<string> _doValues = new Subject<string>();

    public IObservable<string> DoValues { get { return _doValues; } }

    public string Do(int param)
    {
        var ret = (param * 2).ToString();
        _doValues.OnNext(ret);
        return ret;
    }
}


var foo = new Foo();
foo.DoValues.Subscribe(Console.WriteLine);
foo.Do(2);
-121--2484731-

Шаг 1

Прочитать сообщение adatopost.

Шаг 2

Проверьте проект Apache Commons FileUpload .

O 'Reily предлагает аналогичное решение, но его лицензия на использование требует, чтобы вы купили книгу, и даже это требование настолько плохо сформулировано, что я не выиграю от этого с помощью еще одной ссылки.

-121--3823419-

Я не прочитал друг друга ответ тщательно, но я отсканировал их и заметил, что никто не рекомендовал смотреть на преобразование Фурье, чтобы сегментировать эти волны.

Мне кажется, что это явное применение гармонического анализа в математике. Может быть несколько тонких моментов, которые я могу упустить.

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

Я могу пропустить что-то здесь, хотя...

0
ответ дан 24 November 2019 в 11:42
поделиться

Кусочком этой головоломки является " обнаружение начала ", и для решения этой задачи был написан ряд сложных алгоритмов. Более подробная информация по установкам onsets.

Следующий отрывок - Hamming Distance . Эти алгоритмы позволяют проводить нечеткие сравнения, на входе - 2 массива, на выходе - целое "расстояние" или разница между 2 наборами данных. Чем меньше число, тем больше похожи 2. Это очень близко к тому, что вам нужно, но не точно. Я пошел дальше и внес некоторые изменения в алгоритм Hamming Distance, чтобы вычислить новое расстояние, оно, вероятно, имеет название, но я не знаю, что это такое. В основном он суммирует абсолютное расстояние между каждым элементом массива и возвращает итог. Вот код для него на питоне.

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 массивами.

Теперь, чтобы собрать эти части. С помощью определения Onset можно найти начало всех волн в наборе данных. Затем можно выполнить цикл через эти места, сравнивая каждую волну с образцом P-Wave. Если вы попадете в QRS комплекс, то расстояние будет наибольшим. Если вы попали в другую P-Wave, то число не будет равно нулю, а будет намного меньше. Расстояние между любой P-волной и любой T-волной будет довольно маленьким, КАК КАК это не является проблемой, если вы сделаете следующее предположение:

Расстояние между любой p-волной и любой другой p-волной будет меньше расстояния между любой p-волной и любой t-волной.

Серия выглядит примерно так: pQtpQtpQt... p-волна и t-волна находятся прямо рядом друг с другом, но так как эта последовательность предсказуема, ее будет легче прочитать.

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

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

15
ответ дан 24 November 2019 в 11:42
поделиться

Первая вещь, которую я сделал бы, упрощают данные.

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

Вот быстрый один лайнер, который возьмет ; разделенные данные, как введено, и производят дельту тех данных.

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;;;

The 20 and -35 data points result from the original data starting and ending with 0.

To find the other data points you will have to rely on pattern matching.


If you look at the first p wave, you can clearly see a pattern.

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 _________/

It isn't as easy to see the pattern on the second p wave though. This is because the second one is spread out further

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 ________________/

The third p wave is a little more erratic than the other two.

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 __________/

You would find the t waves in a similar manner to the p waves. The main difference is when they occur.


This should be enough information to get you started.

The two one-liners are for example only, not recommended for daily use.

7
ответ дан 24 November 2019 в 11:42
поделиться

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

  • Разделите непрерывную волну на интервалы (вероятно, лучше всего иметь границы интервалов примерно на полпути между острые пики комплексов 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
ответ дан 24 November 2019 в 11:42
поделиться

Во-первых, на любом заданном графике могут отсутствовать различные компоненты стандартной волны электрокардиограммы. Такой сюжет обычно ненормален и обычно указывает на какую-то проблему, но вам нельзя обещать, что они есть.

Во-вторых, их признание - это такое же искусство, как и наука, особенно в тех случаях, когда что-то идет не так.

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

  1. Где началась самая последняя волна P
  2. Где закончилась последняя волна P
  3. Рейтинг аномальности последней волны P с одним крайним «отсутствием».
  4. Где начался самый последний комплекс QRS
  5. Где часть Q самого последнего комплекса QRS превратилась в часть R.
  6. Где R-часть самого последнего комплекса QRS превратилась в S-часть.
  7. Где закончился последний комплекс QRS.
  8. Рейтинг ненормальности последнего комплекса QRS с одним крайним «отсутствием».
  9. Где начался последний зубец T.
  10. Где закончился последний зубец T.
  11. Рейтинг ненормальности последнего зубца T с одним крайним значением «отсутствие».

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

Конечно, это подробное описание нейронной сети не следует воспринимать как предписывающее. Я уверен, что я не обязательно выбирал самые оптимальные результаты, например, я просто подбросил некоторые идеи о том, какими они могут быть.

0
ответ дан 24 November 2019 в 11:42
поделиться

Вы имеете право на ключ? Используйте клавишу, чтобы извлечь значение из карты, и у вас есть все сопоставления. Например, в Java со последовательностью в качестве типа для ключа

for (String key : map.keySet()) {
    System.out.println(key + ":" + map.get(key));
}

.

-121--3783493-

Хэш-таблица реализует карту . Функция Map.entureSet возвращает коллекцию ( Наборы ) экземпляров Map.Entry , имеющих методы getKey и getValue .

Итак:

Iterator<Map.Entry>  it;
Map.Entry            entry;

it = yourTable.entrySet().iterator();
while (it.hasNext()) {
    entry = it.next();
    System.out.println(
        entry.getKey().toString() + " " +
        entry.getValue().toString());
}

Если известны типы записей в хэш-таблице, можно использовать шаблоны для исключения вызовов toString выше. Например, запись может быть объявлена как Map.Entry < Последовательность, Последовательность > , если хэш-таблица объявлена как Хэш-таблица < Последовательность, Последовательность > .

Если вы можете комбинировать шаблоны с дженериками, это просто коротко:

for (Map.Entry<String,String> entry : yourTable.entrySet()) {
    System.out.println(entry.getKey() + " " + entry.getValue());
}

Это предполагает, что ваша таблица является хэш-таблицей < Последовательность, Последовательность > . Просто покажет, как далеко Ява зашла за последние несколько лет, в значительной степени не потеряв свой существенный Java-ness.

Немного OT: Если синхронизация не требуется, используйте HashMap вместо Hashtable . В этом случае используйте ConcurrentHashMap (спасибо, акаппа!).

-121--3783495-

Было показано, что вейвлеты являются лучшим инструментом для определения пиков в данных этого типа, где пики имеют «разные размеры» - свойства масштабирования вейвлетов делают их идеальным инструментом для этого типа многомерного обнаружения пиков. Это выглядит как нестационарный сигнал, поэтому использование DFT не было бы правильным инструментом, как некоторые предлагали, но если это исследовательский проект, вы могли бы посмотреть, используя спектр сигнала (оценивается, по существу, с использованием БПФ автокорреляции сигнала.)

Вот отличная статья с обзором нескольких методов обнаружения пиков - это было бы хорошим местом для начала.

-Paul

1
ответ дан 24 November 2019 в 11:42
поделиться

Я не эксперт в этой конкретной проблеме, но просто не в себе из более общих знаний: допустим, вы знаете комплекс QRS (или одна из других функций, но я буду использовать комплекс QRS для этого примера) происходит примерно в некоторый фиксированный период времени длиной L. Интересно, можно ли рассматривать это как проблему классификации следующим образом:

  1. Разделите ваш сигнал в перекрывающиеся окна длиной L. В каждом окне есть или нет полный комплекс QRS.
  2. Преобразование Фурье в каждом окне. Ваши особенности - это мощность сигнала на каждой частоте.
  3. Обучите дерево решений, машину опорных векторов и т. Д. На некоторых аннотированных вручную данных.
4
ответ дан 24 November 2019 в 11:42
поделиться

Эти два других острых пика и впадины также являются комплексами qrs?

Совершенно верно, я думаю, что вам нужно вычислить наклон этого графика в каждой точке. Тогда вам также нужно посмотреть, как быстро меняется наклон (2-я производная ???). Если у вас резкое изменение, значит, вы достигли какой-то резкой вершины.Конечно, вы хотите ограничить обнаружение изменения, поэтому вы можете сделать что-то вроде «если наклон изменяется на X в течение интервала времени T», чтобы вы не заметили крошечные выпуклости на графике.

Прошло много времени с тех пор, как я занимался математикой ... и это похоже на математический вопрос;) Да, и я не проводил никакого анализа сигналов :).

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

4
ответ дан 24 November 2019 в 11:42
поделиться

Вы можете использовать взаимную корреляцию . Возьмите образец каждой модели и сопоставьте их с сигналом. Вы получите пики с высокой корреляцией. Я ожидал бы хороших результатов от этого метода извлечения волн 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 (например, значения выше порога)

8
ответ дан 24 November 2019 в 11:42
поделиться

"Вейвлет-преобразование " может быть соответствующим ключевым словом. Однажды я присутствовал на презентации человека, который использовал эту методику для обнаружения различных фаз сердцебиения в шумном экг.

В моем ограниченном понимании это в некоторой степени похоже на преобразование Фурье, но с использованием (масштабированных) копий пульса, в вашем случае, в форме сердцебиения.

1
ответ дан 24 November 2019 в 11:42
поделиться

Это замечательный вопрос! У меня есть несколько мыслей:

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

Другой вариант - комбинированная обработка сигнала/алгоритм машинного обучения. Снова разбейте сигнал на "куски". Снова сделайте "шаблоны" (вам понадобится дюжина или около того для каждого класса), возьмите БПФ каждого куска/шаблона, а затем используйте классификатор Наива Байеса (или другой классификатор ML, но NB должен подходить) для классификации для каждого из трех классов. Я также пробовал это на данных о походке и смог получить точность и отзыв до 98% при относительно сложных сигналах. Дайте мне знать, как это работает, это очень интересная проблема.

3
ответ дан 24 November 2019 в 11:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: