Добавил:
kiopkiopkiop18@yandex.ru Вовсе не секретарь, но почту проверяю Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

5 курс / ОЗИЗО Общественное здоровье и здравоохранение / Проектирование_мультимодальных_интерфейсов_мозг_компьютер

.pdf
Скачиваний:
1
Добавлен:
24.03.2024
Размер:
10.34 Mб
Скачать

Получение данных из набора данных MNE EEG

plt.plot(list(range(0, eeg_sample_length)), positive_ testing_data[2], color = "g")

plt.show()

plt.plot(list(range(0, eeg_sample_length)), negative_ testing_data[0], color = "black")

plt.plot(list(range(0, eeg_sample_length)), negative_ testing_data[1], color = "r")

plt.plot(list(range(0, eeg_sample_length)), negative_ testing_data[2], color = "r")

plt.show()

Получим график с результатами, как на рис. 58.

а

б

Рис. 58. Пример правильного набора данных Р300 (а) и ошибки набора данных Р300 (б)

Черная линия на рис. 58, б — наш нарушитель. Визуально он выглядит достаточно похожим на положительные образцы, поэтому его легко спутать с ними. Нейронной сети потребовалось бы значительно больше примеров, прежде чем она смогла бы отличать такие образцы.

Как правило, рекомендуется иметь не менее 100 образцов для обучения каждого класса. В данном случае у нас было только 9 — недо-

109

Рекомендовано к покупке и изучению сайтом МедУнивер - https://meduniver.com/

Глава 5. Применение методов машинного обучения для ИМК

статочно для настоящего приложения, но достаточно для проверки концепции. С большим количеством образцов сеть может разработать более сложное и надежное решение для классификации данных P300.

Таким образом, нейронная сеть смогла получить некоторые знания из тестовых данных, предоставленных через базу данных MNE. Используя эти знания, она смогла предсказать P300 по данным ЭЭГ, которые никогда раньше не видела, и решила первоначальную проблему.

Итак, мы решили проблему классификации ЭЭГ, используя нейронную сеть, обученную на реальных тестовых данных. К сожалению, небольшой объем данных (по 9 данных ЭЭГ для каждого класса), который нам был доступен, означает, что решение было не очень устойчивым к новым уникальным данным. Вот сводка всех данных «не P300», которые мы использовали из базы данных, и их классификация сети:

средний отрицательный балл — 37.7 9%;

доля правильно классифицированных «неP300» — 61.73%. Обученная нейронная сеть работает лучше, чем случайный вы-

бор (50%), однако очевидно, что есть возможности для ее дальнейшего улучшения. Это является результатом того, что сеть недостаточно сложна, чтобы изучить структурные тонкости исследуемых нами данных, а также не получила достаточного количества примеров того, как выглядят P300. Усредненные графики легко различимы, но отдельные испытания значительно более неоднозначны. Есть несколько методов, доступных нам, если хотим улучшить производительность сети и оценить мультимодальные данные для реальной клинической задачи. О них мы поговорим в следующей главе.

Вопросы к главе 5

1.Какие типы исследований проводят с помощью ИМК?

2.Какие различные парадигмы ЭЭГ используются для ИМК?

3.Какие методы используются для ИМК на основе машинного обучения разных классов?

4.Какие методы машинного обучения используются для ИМК на базе P300?

5.Какие методы машинного обучения используются для ИМК на основе SSVEP?

110

Вопросы к главе 5

6.КаковыосновныепроблемыдляпостроенияИМКна основеЭЭГ?

7.Каково будущее направление ИМК с использованием машинного обучения?

8.Объясните роль глубокого обучения в проектировании и разработке ИМК.

9.Какие ограничения связаны с различными стратегиями машинного обучения для ИМК?

10.Какие методы используются для применения конкретной парадигмы при проектировании ИМК?

11.Какие наборы данных общедоступны для ИМК на основе ЭЭГ?

111

Рекомендовано к покупке и изучению сайтом МедУнивер - https://meduniver.com/

Глава 6. Мультимодальная обработка сигналов на примере данных полисомнографии

В главе рассматривается прикладная задача выполнения анализа данных полисомнографии на практическом примере [75]. Для этого возьмем данные двух обезличенных субъектов из набора данных Sleep Physionet [76] и назовем их Алиса и Боб. В рамках данной задачи мы рассмотрим вопрос, возможно ли и насколько хорошо мы можем предсказать стадии сна Боба на основе данных Алисы? Данная проблема решается как задача контролируемой мультиклассовой классификации, чтобы предсказать стадию сна из 5 возможных стадий для каждого фрагмента 30 секундных данных.

Первым шагом мы импортируем нужные нам библиотеки и данные.

import numpy as np

import matplotlib.pyplot as plt

import mne

from mne.datasets.sleep_physionet.age import fetch_data

from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import accuracy_score

from sklearn.metrics import confusion_matrix from sklearn.metrics import classification_report from sklearn.pipeline import make_pipeline

from sklearn.preprocessing import FunctionTransformer

Загрузка данных

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

Пакет MNE-Python предоставляет удобную загрузку данных из набора данных Sleep Physionet:.mne.datasets.sleep_physionet.age.fetch_data().

112

Считывание данных из файлов PSG и гипнограммы

Получив список тем и записей, сборщик загружает данные и предоставляет нам для каждой темы пару файлов [77]:

PSG.edf, содержащие полисомнографию. Необработанные данные со шлема ЭЭГ;

Hypnogram.edf, содержащие аннотации, записанные экспертом. Объединив эти два объекта в mne.io.Raw-объект, можем извлекать

события на основе описаний аннотаций для получения эпох.

Считывание данных  из файлов PSG и гипнограммы

Для считывания данных PSG и гипнограммы выполним следующее:

ALICE, BOB = 0, 1

[alice_files, bob_files] = fetch_data(subjects=[ALICE, BOB], recording=[1])

raw_train = mne.io.read_raw_edf(alice_files[0], stim_ channel='Event marker',

misc=['Temp rectal']) annot_train = mne.read_annotations(alice_files[1]) raw_train.set_annotations(annot_train, emit_warning=False)

#plot some data

#scalings were chosen manually to allow for simultaneous visualization of

#different channel types in this specific dataset raw_train.plot(start=60, duration=60,

scalings=dict(eeg=1e 4, resp=1e3, eog=1e 4, emg=1e 7,

misc=1e 1))

Получим график с результатами, как на рис. 59.

Using default location ~/mne_data for PHYSIONET_SLEEP…

Extracting EDF parameters from /home/circleci/mne_data/ physionet-­sleep-data/SC4001E0-PSG.edf…

EDF file detected

Setting channel info structure… Creating raw.info structure…

113

Рекомендовано к покупке и изучению сайтом МедУнивер - https://meduniver.com/

Глава 6. Мультимодальная обработка сигналов на примере данных полисомнографии

Рис. 59. Пример визуализации данных полисомнографии

Извлечение данных событий

Набор данных Sleep Physionet аннотирован с использованием меток: бодрствование (W), этап 1, этап 2, этап 3, этап 4, соответствующие диапазону от легкого до глубокого сна, быстрый сон (R), где REM — это сокращение от Rapid Eye. Подробное описание базы данных сигналов доступно на сайте “Physionet.org”, название базы для поиска —

Sleep-­EDF Database Expanded.

Из всей БД мы будем работать только с пятью стадиями: бодрствованием (W), стадией 1, стадией 2, стадиями 3/4 и быстрым сном (R). Для этого используем event_id_parameter в mne.events_from_annotations()

для выбора интересующих нас событий и связываем идентификатор события с каждым из них.

Записи содержат области долгого бодрствования (W) до и после каждой ночи. Чтобы ограничить влияние дисбаланса классов, мы обрезаем каждую запись, сохраняя только 30 мин от времени бодрство-

114

Извлечение данных событий

вания до первого появления и 30 мин после последнего появления стадии сна.

annotation_desc_2_event_id = {'Sleep stage W': 1, 'Sleep stage 1': 2, 'Sleep stage 2': 3, 'Sleep stage 3': 4, 'Sleep stage 4': 4, 'Sleep stage R': 5}

#сохранить последние 30минутные события пробуждения перед сном ипервые 30минутные события пробуждения после

#переопределять аннотации кнеобработанным данным annot_train.crop(annot_train[1]['onset'] — 30 * 60,

annot_train[–2]['onset'] + 30 * 60) raw_train.set_annotations(annot_train, emit_

warning=False)

events_train, _ = mne.events_from_annotations( raw_train, event_id=annotation_desc_2_event_id,

chunk_duration=30.)

#создайте новый event_id, объединяющий этапы 3 и 4 event_id = {'Sleep stage W': 1,

'Sleep stage 1': 2, 'Sleep stage 2': 3, 'Sleep stage 3/4': 4, 'Sleep stage R': 5}

#сюжетные события

fig = mne.viz.plot_events(events_train, event_id=event_ id,

sfreq=raw_train.info['sfreq'], first_samp=events_train[0, 0])

#сохраните цветовой код для дальнейшего построения графика

stage_colors = plt.rcParams['axes.prop_cycle'].by_key() ['color']

#Используемые описания аннотаций: [«Стадия сна 1»,

«Стадия сна 2», «Стадия сна 3», «Стадия сна 4», «Стадия сна R», «Стадия сна W»]

115

Рекомендовано к покупке и изучению сайтом МедУнивер - https://meduniver.com/

Глава 6. Мультимодальная обработка сигналов на примере данных полисомнографии

Получим график с результатами, как на рис. 60.

Рис. 60. Пример извлечения параметров данных полисомнограммы

Создание эпох из данных на основе событий Алисы

Для создания эпох из данных на основе событий Алисы выполним следующие команды:

tmax = 30. — 1. / raw_train.info['sfreq'] # tmax in included

epochs_train = mne.Epochs(raw=raw_train, events=events_train, event_id=event_id, tmin=0.,

tmax=tmax, baseline=None)

print(epochs_train)

Not setting metadata

841 matching events found

No baseline correction applied 0 projection items activated

<Epochs | 841 events (good & bad), 0–29.99 sec, baseline off, ~12 kB, data not loaded,

'Sleep stage W': 188 'Sleep stage 1': 58 'Sleep stage 2': 250 'Sleep stage 3/4': 220 'Sleep stage R': 125>

116

Применение описанных выше шагов к тестовым данным от Боба

Применение описанных выше шагов  к тестовым данным от Боба

Выполним следующие команды для тех же шагов к тестовым данным от Боба:

raw_test = mne.io.read_raw_edf(bob_files[0], stim_ channel='Event marker',

misc=['Temp rectal']) annot_test = mne.read_annotations(bob_files[1]) annot_test.crop(annot_test[1]['onset'] — 30 * 60,

annot_test[–2]['onset'] + 30 * 60) raw_test.set_annotations(annot_test, emit_warning=False) events_test, _ = mne.events_from_annotations(

raw_test, event_id=annotation_desc_2_event_id, chunk_duration=30.)

epochs_test = mne.Epochs(raw=raw_test, events=events_ test, event_id=event_id,

tmin=0., tmax=tmax,

baseline=None)

print(epochs_test)

Extracting EDF parameters from /home/circleci/mne_data/ physionet-­sleep-data/SC4011E0-PSG.edf…

EDF file detected

Setting channel info structure… Creating raw.info structure…

Used Annotations descriptions: ['Sleep stage 1', 'Sleep stage 2', 'Sleep stage 3', 'Sleep stage 4', 'Sleep stage R', 'Sleep stage W']

Not setting metadata

1103 matching events found

No baseline correction applied 0 projection items activated

<Epochs | 1103 events (good & bad), 0–29.99 sec, baseline off, ~12 kB, data not loaded,

'Sleep stage W': 157 'Sleep stage 1': 109 'Sleep stage 2': 562 'Sleep stage 3/4': 105 'Sleep stage R': 170>

117

Рекомендовано к покупке и изучению сайтом МедУнивер - https://meduniver.com/

Глава 6. Мультимодальная обработка сигналов на примере данных полисомнографии

Разработка функций

Наблюдая за графиком спектральной плотности мощности (PSD) эпох, сгруппированных по стадиям сна, мы видим, что разные стадии сна имеют разные сигнатуры (рис. 61). Эти сигнатуры остаются одинаковыми для данных Алисы и Боба. Мы создадим функции ЭЭГ на основе относительной мощности в определенных частотных диапазонах, чтобы зафиксировать разницу между стадиями сна в наших данных.

а

б

Рис. 61. Сравнение параметров стадий сна Алисы (а) и Боба (б)

#визуализируйте PSD Алисы иБоба постадиям сна. fig, (ax1, ax2) = plt.subplots(ncols=2)

#перебирать темы

stages = sorted(event_id.keys())

for ax, title, epochs in zip([ax1, ax2], ['Alice', 'Bob'],

[epochs_train, epochs_test]):

for stage, color in zip(stages, stage_colors):

spectrum = epochs[stage].compute_psd(fmin=0.1, fmax=20.) spectrum.plot(ci=None, color=color, axes=ax,

show=False, average=True, spatial_colors=False) ax.set(title=title, xlabel='Frequency (Hz)')

118