-
/scripts(сам код):preprocessing.pyсодержит функции загрузки и предобработки данных.forecasting.py- программа, предсказывающая K новых точек сигнала по N предыдущим.main.py- основная программа.train_basic_model.py- программа, обучающая модель предсказывать K новых точек сигнала по N предыдущим, в ней имеется возможность дообучить уже существующую модель, если она была сохранена в нужном формате.plotting.pyотрисовывает график со сравнением исходного и исправленного сигналов PPG.compute_distance.pyвычисляет пороговое значение оценки качества сигнала при помощи DTW.requirements.txtсодержит писок необходимых библиотек и их версий для работы проекта.rate_model_quality.py- оценка качества итоговой модели с помощью оценок MAE и MSE.
-
/test_data(тестовые данные): -
/unusedсодержит файлы, не использующиеся в нынешней реализации.
Идея предлагаемого алгоритма, следующая - пусть у нас есть N известных точек сигнала, тогда попытаемся предсказать K следующих точек. Если предсказание достаточно близко к реальному сигналу, значит он не выбивается от предыдущих форм волн. Если же оно отличается, значит форма полученного сигнала является выбросом в сравнении с предыдущими. Тогда мы можем либо пометить этот участок как некачественный, либо заменить его на предсказание.
Вообще сигнал PPG сильно напоминает данные вроде продаж или посещаемости некоего места итп. В основе этого сравнения лежит свойство сезонности, что для нас проявляется в наличии периодичной компоненты в данных. Ввиду этого есть возможность воспользоваться богатым набором методов для предсказания.
Строго говоря, данная задача называется forecasting. Начать бы предложил с ARIMA, а потом попытаться найти методы побыстрее. Большинство моделей либо использует авторегрессию, либо учат предсказывать на обучающей выборке. Первые модели не нужно предварительно обучать, они это делают в процессе, однако это влияет на скорость их работы. Было бы идеально, чтобы методика работала в real-time. Из библиотек могу предложить эту, но есть и другие
https://nixtlaverse.nixtla.io/
Теперь про нюансы.
Как по мне лучше пытаться предсказывать один период сигнала, впрочем, можно и некоторое фиксированное число точек. Также советую снижать частоту сэмплирования сигнала до 50 (если она и так не ниже), форму волны критично не ухудшите, и снизите время работы алгоритмов. Также из-за естественной вариабельности во времени между сердечными сокращениями, предсказанная форма волны может совпадать с полученной, но из-за смещения во времени выдавать слабые метрики. Если такая проблема действительно будет возникать, рекомендую посмотреть в сторону DWT (Dynamic Time Warping), по сути обычное выравнивание, которое Вы знаете. К слову о метриках. Саму точность предсказания можно оценить, например, MAE или тем же расстоянием DWT. Однако, если пойти на шаг дальше, то есть смысл сравнивать оценку ЧСС в течение некоторого времени с применением предложенной техники и без. Для этого будет достаточно heartpy.