Практическое задание № 13

дисциплина: Информационные технологии в медицине

на тему: Искусственные нейронные сети в медицине

обучающегося: Ахмедова Л.З.

7 факультета 2 курса 24-ЛД-37/2 группы

по специальности: Лечебное дело

номер варианта: 001

дата выполнения: 22.06.26 г.


Вопрос 1. Пример использования условных конструкций

На данном занятии мы разберем создание простейшей системы поддержки принятия решения (СППР). Это упрощенная разновидность нейронной сети, позволяющая использовать накопленный опыт для упрощения принятия решений.

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

Решим задачу дифференциальной диагностики инсультов различного вида по данным таблицы дифференциальной диагностики:

Признак Ишемический инсульт Геморрагический инсульт Субарахноидальное кровоизлияние
Начало болезни постепенное внезапное внезапное
Вид больного бледность гиперемия лица гиперемия лица
Нарушение сознания постепенное длительное кратковременное
Головная боль (тошнота) редко часто часто
Менингеальные признаки нет выражены выражены
Двигательное возбуждение редко часто часто

Построим граф состояний

Для создания автоматической схемы диагностики необходимо использовать условную конструкцию if(условие){действия1}else{действия2} . Смысл ее работы прост - если выполняется условие происходит переход к выполнению действия1, если условие не выполняется происходит переход к выполнению действия2. Элемент else необязателен и может быть пропущен, тогда программа перейдет к следующей строке. Пример простого условия приведен ниже. Здесь на экран выводится сообщение в зависимости от содержимого переменной symptom_nachalo

#задаем значение симптома, изменяя значение в кавычках
symptom_nachalo <- "постепенное"
#проверяем условие, знак "==" обозначает сравнение
if (symptom_nachalo=="постепенное") {
  "Начало заболевания постепенное"
#прописываем действие, которое произойдет при невыполнении условия   
} else {
  "Иначе"
}
## [1] "Начало заболевания постепенное"

Записывая значение в переменную, отвечающую за симптом мы создаем предпосылку для выбора одного из вариантов решения. Когда программа переберет все переменные (симптомы) она получит однозначный диагноз, так как набор симптомов уникален. Если же набор симптомов не подойдет ни под один из указанных в карте диагнозов, мы сделаем вывод о том, что необходимо дополнительное обследование для уточнения данных.

Пример СППР для решения задачи дифференциальной диагностики инсульта

  1. Зададим симптомы. Переменные можем называть, как угодно, но чтобы нам было понятно, что они в себе содержат. Количество переменных должно соответствовать количеству признаков, приведенных в таблице.
#изменяя в данном чанке содержимое симптомов (записывая в кавычках другие значения) мы будем получать результат в зависимости от общей симптоматической картины
symptom_nachalo <- "внезапное" 
symptom_vid <- "гиперемия лица"
symptom_soznanie <-  "кратковременное"
symptom_gbol <- "часто"
symptom_mprizn <- "выражены"
symptom_dvigat <- "часто"
# обнуляем переменную, отвечающую за результат, чтобы обеспечить отсутствие ошибок при многократном запуске программы
Result <- 0
  1. Опишем алгоритм проверки на ишемический инсульт. Здесь и далее количество проверяемых условий, также соответсвует количеству признаков в таблице
#Если мы хотим обеспечить проверку нескольких условий, то необходимо использовать объединяющие знаки: &-логическое "и", т.е. действие выполнится только если все условия, объединеннные этим знаком выполнились.
#Существует еще знак "|"-логическое "или", т.е. действие выполнится  если хотя бы одно из  условий, объединенннх этим знаком выполнилось.
if ((symptom_nachalo=="постепенное")&
    (symptom_vid=="бледность")&
    (symptom_soznanie=="постепенное")&
    (symptom_gbol=="редко")&
    (symptom_mprizn=="нет")&
    (symptom_dvigat=="редко"))
  {Result <- 1}
  1. Опишем алгоритм проверки на геморрагический инсульт
if ((symptom_nachalo=="внезапное")&
    (symptom_vid=="гиперемия лица")&
    (symptom_soznanie=="длительное")&
    (symptom_gbol=="часто")&
    (symptom_mprizn=="выражены")&
    (symptom_dvigat=="часто"))
  {Result <- 2}
  1. Опишем алгоритм проверки на субарахноидальное кровоизлияние
if ((symptom_nachalo=="внезапное")&
    (symptom_vid=="гиперемия лица")&
    (symptom_soznanie=="кратковременное")&
    (symptom_gbol=="часто")&
    (symptom_mprizn=="выражены")&
    (symptom_dvigat=="часто"))
  {Result <- 3}
  1. Результат получен, интерпретируем его:
if (Result==1){" У пациента ишемический инсульт"}
if (Result==2){" У пациента гемморрагический инсульт"}
if (Result==3){" У пациента субарахноидальное кровоизлияние"}
## [1] " У пациента субарахноидальное кровоизлияние"
if ((Result<1)|(Result>3)){" Диагноз неопределен, требуются дополнительные исследования"}

Вопрос 2. Решите задачу автоматизации диагностики миеломной нефропатии и AL-амилодоза

Имеется карта дифференциальной диагностики

Признак Миеломная нефропатия AL-амилоидоз
Нефротический синдром нет есть
Артериальная гпертензия нет нет
Почечная недостаточность быстропрогрессирующая медленнопрогресирующая
Системность поражения нет да
Характер протеинурии канальцевый клубочковый
Микрогематурия нет нет
Секретируемые лейкоциты смешанные лямбда
Количество секретируемых ЛЦ высокое низкое

Постройте граф состояний:

На основе примера из вопроса 1 разработайте СППР постановки диагноза

  1. Задайте симптомы
# Нефротический синдром: "нет" или "есть"
symptom_nefrotic <- "нет"

# Артериальная гипертензия: "нет" (по таблице у обоих "нет")
symptom_gipertenz <- "нет"

# Почечная недостаточность: "быстропрогрессирующая" или "медленнопрогрессирующая"
symptom_poch_nef <- "быстропрогрессирующая"

# Системность поражения: "нет" или "да"
symptom_sistem <- "нет"

# Характер протеинурии: "канальцевый" или "клубочковый"
symptom_protein <- "канальцевый"

# Микрогематурия: "нет" (по таблице у обоих "нет")
symptom_gematur <- "нет"

# Секретируемые лейкоциты: "смешанные" или "лямбда"
symptom_leyk <- "смешанные"

# Количество секретируемых ЛЦ: "высокое" или "низкое"
symptom_lc <- "высокое"

# Обнуляем переменную для результата
Result <- 0
  1. Опишите алгоритм проверки на миеломную нефропатия
# МИЕЛОМНАЯ НЕФРОПАТИЯ
if ((symptom_nefrotic == "нет") &
    (symptom_gipertenz == "нет") &
    (symptom_poch_nef == "быстропрогрессирующая") &
    (symptom_sistem == "нет") &
    (symptom_protein == "канальцевый") &
    (symptom_gematur == "нет") &
    (symptom_leyk == "смешанные") &
    (symptom_lc == "высокое")) {
  Result <- 1
}
  1. Опишите алгоритм проверки на AL-амилоидоз
# AL-АМИЛОИДОЗ
if ((symptom_nefrotic == "есть") &
    (symptom_gipertenz == "нет") &
    (symptom_poch_nef == "медленнопрогрессирующая") &
    (symptom_sistem == "да") &
    (symptom_protein == "клубочковый") &
    (symptom_gematur == "нет") &
    (symptom_leyk == "лямбда") &
    (symptom_lc == "низкое")) {
  Result <- 2
}
  1. Получите результат:
# Вывод результата
if (Result == 1) {
  "У пациента МИЕЛОМНАЯ НЕФРОПАТИЯ"
} else if (Result == 2) {
  "У пациента AL-АМИЛОИДОЗ"
} else {
  "ДИАГНОЗ НЕОПРЕДЕЛЕН, требуются дополнительные исследования"
}
## [1] "У пациента МИЕЛОМНАЯ НЕФРОПАТИЯ"