Главная Искуственный интеллект » Файлы » Методички » Искуственный интеллект [ Добавить материал ]

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

Расскажу, как сделать CBR-систему (система рассуждения по прецедентам, в данном случае, на основе онтологий).

Тема этого примера: диагностика типа ОРВИ по симптомам.

Я работаю с Protege 3.4 ( http://protege.stanford.edu/ ) и JColibri 1.1 ( http://sourceforge.net/projects/jcolibri-cbr/ ).

Шаг 1 Создание классов

Необходимо выделить так называемые классы, т.е. параметры каждого из прецедентов.

У нас будет 8 параметров заболевания (прецедента) и 1 результирующий параметр, значение которого должно будет вычисляться из этих 8, т.е. Диагноз пациента.

Мы будем определять вид ОРВИ по следующим параметрам:

  • Начало болезни: острое, постепенное, внезапное, тяжёлое;
  • Температура: невысокая, нормальная, не выше 38 С, 38-39 С, высокая до 39-40 С;
  • Длительность температуры: 2-4 дня, 3-5 дней, 3-7 дней, 5-10 дней;
  • Общая интоксикация организма: выраженная, невыраженная, средне выраженная, слабовыраженная.
  • Кашель: сухой, лающий, влажный;
  • Поражения дыхательных путей: насморк, ларингит, трахеит, бронхит, бронхиолит, пневмония, ангина, фарингит, сильный насморк, конъюнктивит;
  • Лихорадка: была, не было.

И в итоге мы получим один из диагнозов типа ОРВИ:

  • Грипп
  • Парагрипп
  • рс-инфекция
  • аденовирусная инфекция

Создадим в Protege проект типа "OWL/RDF Files". Замечу, что после создания нужно сразу сохранить его через "Save as..."

Переходим во вкладку OWLClasses, в окошке Asserted Hierarchy для суперкласса owl:Thing создадим подклассы:

  • CBR_DESCRIPTION
  • CBR_INDEX
  • CBR_CASE

У класса CBR_INDEX создаём подклассы, названные соответственно параметрам заболевания (т.е. температура, кашель и т.д.).

 Далее в классе CBR_DESCRIPTION создаём подкласс "Диагноз ОРВИ". Затем выделяем этот класс и справа в  "Asserted Conditions"  нажимаем на кнопку "Add named class..." и выбираем CBR_CASE. В CBR_CASE тоже появился "Диагноз ОРВИ”. Если справа нет такой кнопки, как нет и области "Asserted Conditions", стоит переключиться с  "Properties View"  на "Logic View".

В итоге на вкладке OWLClasses должно получиться что-то вроде этого:

Шаг 2. Заполнение свойств

На вкладке "Properties" добавляем свойства. Свойств столько же, сколько и классов в CBR_INDEX. И называются они похожим образом.

Далее, переходим во вкладку OWL Classes, выделяем подкласс "Диагноз_ОРВИ" у CBR_CASE и справа в "Asserted Conditions" нажимаем на кнопку "Create new expression...". Таким образом связываем свойства с классами в CBR_INDEX.

Можно использовать значок "Каждый", можно просто писать "some". Также возможно автодополнение по Tab и Ctrl+Пробел.

Наконец, получилось вот что:

Шаг 3. Создание списка возможных значений для каждого класса/свойства

Переходим во вкладку Individuals, перебираем все подклассы из CBR_INDEX и заполняем возможные значения для них. За создание Individual отвечает кнопка "Create instance". Например: начало болезни в нашем случае может быть: острым, постепенным, внезапным, тяжёлым. На рисунке показан этот класс с заполненными Individuals.

В таком же стиле делаем оставшиеся классы.

Шаг 4. Заполнение онтологии прецедентами

Теперь Выделяем CBR_CASE->Диагноз ОРВИ и добавляем Individuals для него. Каждый Individual будет отдельным case'ом, случаем, отдельной историей болезни. При добавлении должно быть показано что-то вроде этого.

В каждой форме вправа нажимаем "Add..." и выбираем значение соответствующего подкласса CBR_INDEX, описывающее ситуацию в данной истории болезни.

Замечу, что можно добавлять несколько значений в каждую форму. К примеру, начало болезни в одном из случаев тяжёлое и постепенное.

15 прецедентов вполне хватит. Должно получиться что-то вроде этого. Названия можно менять.

Где брать case'ы? В рамках данной семестровой — нужно найти пару источников с описаниями типичных ситуаций вашей предметной области (истории болезни и диагнозы, поставленные на их основе, описания состояний системы и выводы об её работоспособности, описание вменяемых обвинений подсудимому и вынесенный приговор и т.д.).

На этом с Protege всё. Сохраняем owl-файл онтологии. Запускаем jColibri.

Шаг 5. Создание CBR-системы

Создаём новое CBR-приложение через CBR->New CBR system. Вводим название для новой системы и выбираем расширение "Description Logic Extension".

Шаг 5.1 Настройка структуры прецедента

Идём в CBR->Manage Case Structures. В списке Type выбираем ONTOLOGY вместо STANDARD. В древовидной структуре выделяем Case – справа появляется кнопка Select Case Concept. Нажимаем эту кнопку, выбираем owl-файл с подготовленной ранее онтологией. Нажимаем ”Read Ontology”, появляются классы из Protege, выбираем класс CBR_CASE->Диагноз ОРВИ и нажимаем Select Concept. Нажать кнопку Apply Changes (иначе то, что вы изменили не сохранится!).

Шаг 5.1.1 Настройка каждого параметра прецедента

В древовидной структуре «Case» выбрать "Description", нажать "Add simple". 

Нажимаем "Select Concept", выбираем некоторый подкласс CBR_INDEX, соотносим его с соответствующим свойством вида "св_XXX" в выпадающем списке "Relation", "Weight" оставим 1.0, "Local Similarity" устанавливаем в "Equal" и нажимаем "Apply Changes(иначе то, что вы изменили не сохранится!).

Шаг 5.1.1 нужно повторить для всех подклассов и свойств класса CBR_INDEX из заранее подготовленного OWL-файла.

В итоге должно получиться что-то вроде этого.

Нажимаем "Save case structure", сохраняем структуру прецедента в xml-файл и закрываем вкладку.

Шаг 6. Настройка работы CBR-машины

Теперь в древовидной структуре CBR System нажимаем на PreCycle, справа появляются свойства — нажимаем кнопку Instance – у CBR System->PreCycle появляется ещё одна ветка Obtain cases task – в её свойствах выделяем jcolibri.extensions.DL.method.LoadDLCaseBaseMethod и нажимаем Instance, в запросе файла указываем сохранённый caseStructure.xml.

  • У CBR Cycle также жмём кнопку Instance. Появляется некоторое число вложенных веток. В ветке CBR Cycle->Obtain query task нужно вновь выбрать jcolibri.extensions.DL.method.ConfigureDLQueryMethod, нажать Instance и выбрать файл caseStructure.xml.
  • У ветки CBR Cycle->Retrieve Task также нажать Instance для метода jcolibri.method.RetrieveComputationalMethod.
  • У ветки CBR Cycle->Retrieve Task->Select working cases task нажать Instance для jcolibri.method.SelectAllCasesMethod.
  • У ветки CBR Cycle->Retrieve Task->Compute Similarity Task также нажать Instance для метода jcolibri.method.NumericSimComputationMethod.
  • У ветки CBR Cycle->Retrieve Task->Select best task выбрать и создать с помощью Instance метод jcolibri.method.SelectBestCaseMethod.

Должно получиться вот так:

Если какой-то квадрат остался бесцветным, значит вы забыли где-то сделать Instance.

Шаг 7 Выполнение запросов

Выделяем shift'ом всё от PreCycle->Obtain Cases task до Select Best Task:

Нажимаем сверху на кнопку "Solve to...". Появилось окно запроса:

Приведу тестовый запрос. Замечу, что заключение о типе ОРВИ оставлено пустым (empty) и ему задан нулевой вес (т.е. это значение не будет учитываться при нахождении близких прецедентов). Если в задании нужно сделать вывод о нескольких параметрах, к примеру, скорость и направление ветра, то оба параметра нужно определить таким же образом.

Нажимаем OK и наблюдаем отчёт подобного вида:

Отчет программы:

[JenaConnector] INFO: 15 cases loaded in 0 seconds

[OntoBridge] INFO: Optimizing ontology access. This may take few minutes.

[OntoBridge] INFO: Optimization finished.

[SelectAllCasesMethod] INFO: Selecting all cases.

[NumericSimComputationMethod] INFO: Similarity with case Диагноз_ОРВИ_36 :0.1111111111111111

[NumericSimComputationMethod] INFO: Similarity with case Диагноз_ОРВИ_46 :0.3333333333333333

[NumericSimComputationMethod] INFO: Similarity with case Диагноз_ОРВИ_47 :0.4444444444444444

[NumericSimComputationMethod] INFO: Similarity with case Диагноз_ОРВИ_45 :0.4444444444444444

[NumericSimComputationMethod] INFO: Similarity with case Диагноз_ОРВИ_44 :0.4444444444444444

[NumericSimComputationMethod] INFO: Similarity with case Диагноз_ОРВИ_42 :0.3333333333333333

[NumericSimComputationMethod] INFO: Similarity with case Диагноз_ОРВИ_43 :0.2222222222222222

[NumericSimComputationMethod] INFO: Similarity with case Диагноз_ОРВИ_41 :0.4444444444444444

[NumericSimComputationMethod] INFO: Similarity with case Диагноз_ОРВИ_40 :0.3333333333333333

[NumericSimComputationMethod] INFO: Similarity with case Диагноз_ОРВИ_39 :0.1111111111111111

[NumericSimComputationMethod] INFO: Similarity with case Диагноз_ОРВИ_37 :0.5555555555555556

[NumericSimComputationMethod] INFO: Similarity with case Диагноз_ОРВИ_38 :0.3333333333333333

[NumericSimComputationMethod] INFO: Similarity with case Диагноз_ОРВИ_50 :0.2222222222222222

[NumericSimComputationMethod] INFO: Similarity with case Диагноз_ОРВИ_49 :0.3333333333333333

[NumericSimComputationMethod] INFO: Similarity with case Диагноз_ОРВИ_48 :0.4444444444444444

 

WORKING CASES:

Диагноз_ОРВИ_37

has-Description: Description

св_Длительность_температуры: _3-5дней

св_Температура: _38-39C

св_Начало_болезни: Тяжёлое

св_Общая_интоксикация_организма: Выраженная

св_Увеличение_лимфоузлов: Очевидно

св_Кашель: Сухой

св_Тип_ОРВИ: Грипп

св_Лихорадка: Была

св_Поражения_дыхательных_путей: Насморк

has-Result: Result

has-Solution: Solution

 

CASE BASE: 15 cases

QUERY:

has-Description: Description

св_Длительность_температуры: _3-7дней

св_Температура: _38-39C

св_Начало_болезни: Острое

св_Общая_интоксикация_организма: Выраженная

св_Увеличение_лимфоузлов: Нет

св_Кашель: Сухой

св_Тип_ОРВИ: null

св_Лихорадка: Была

св_Поражения_дыхательных_путей: Насморк

jColibri определила, что прецедентом с наиболее близкими параметрами является "Диагноз_ОРВИ_37" со значением близости 0.55(5), что и было показано после надписи WORKING CASES. А это значит, что исходя из предыдущего опыта, по текущей истории болезни поставлен диагноз "Грипп”.

Некоторые улучшения:

  • увеличение количества разнородных прецедентов. Конечно, 15 прецедентов мало для того, чтобы ощутить пользу от такого подхода.
  • улучшение интерфейса для ввода прецедентов в систему. Мы вводили прецеденты, используя интерфейс Protege, однако можно написать свой frontend, скажем, на java, который позволит совершать различные полезные действия (например, выводить подсказки при вводе).
  • использовать саму библиотеку jColibri, а не мастер, которым был разработан данный пример. А это был именно мастер — если вы заметили, все эти нажатия на кнопку Instance приводили к созданию java-методов со случайными названиями, к примеру, jcolibri.method.SelectBestCaseMethod1263.

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

 

Бонус. Возможные области применения рассуждения на прецедентах

  • Судебная практика
  • Финансы и кредит
  • Страхование имущества/жизни/здоровья
  • Цена страховки автомобиля
  • Прогнозы спортивных соревнований
  • Прогноз погоды
  • Оценка эффективности каких-либо мер на предприятии
  • Маркетинговые исследования
  • Выводы о необходимости ТО автомобиля
  • Анализ музыкальных предпочтений пользователя (а-ля Last.fm)
  • Рекомендации стран для туристов на основе предыдущих отзывов
  • Принятие конструкторских решений при проектировании автомобиля на основе опыта использования предыдущих моделей
  • Рекомендации по подключению некоторого тарифного плана, на основе опыта предыдущих подключений пользователей
  • Выводы от поломке агрегата, исходя из параметров его работы.

     

Часто жалуются на ошибку 

[JenaConnector] SEVERE: Error retrieving cases: null 
[SelectAllCasesMethod] INFO: Selecting all cases. 
WORKING CASES: 
CASE BASE: 0 cases 
QUERY: 

Подобное может возникнуть по следующим причинам:

  • Проверьте, задали ли вы в точности ту структуру онтологии, которая описана в статье
  • Проверьте, что при заполнении данных в окошке Manage Case Structures в jColibri в полях Concept названия ТОЧНО совпадают с названиями соответствующих классов В ОНТОЛОГИИ (вы могли включить в Protege для удобства отображение имён классов по label-свойству - это метка, а не имя класса. Так вот - здесь нужно указывать то имя, которое значится в IRI RDF-объекта, например, http://super.ontology.com/onto.owl#some_class - указать нужно some_class). Ещё вариант - пользоваться кнопкой Select concept.
Похожие материалы:

Добавил: FEVTMan (30.04.2013) | Категория: Искуственный интеллект
Просмотров: 10991 | Загрузок: 0 | Рейтинг: 5.0/5 |
Теги: прецеденты, диагностика заболеваний, семестровая, искуственный интеллект, онтология
Комментарии (7)
0   Спам
1. павел   21.10.2013   00:08 [Материал]
Статья супер. Но вот затруднение: что значит:"Запускаем jColibri."? Помогите, пожалуйста. Как запустить jColibri?
0   Спам
2. FEVTMan   25.10.2013   00:42 [Материал]
jColibri под Windows запускается через файл JColibriGUI.bat в папке с jColibri11.
Именно "11", а не "2", во второй версии нет графического интерфейса, всё нужно писать на java.
А под *nix - файлом JColibriGUI.sh.
0   Спам
3. redbut   11.03.2014   22:23 [Материал]
Господа! Помогите запустить колибри!
Очень нужно! А то весь день делал делал онтологичаскую часть для эксперимента, а в итоге фигушки!

И с кем можно еще на эту тему пообщаться?
-1   Спам
4. redbut   13.03.2014   21:31 [Материал]
Коллеги, а что делать в случае этого:

[JenaConnector] SEVERE: Error retrieving cases: null
[SelectAllCasesMethod] INFO: Selecting all cases.

WORKING CASES:

CASE BASE: 0 cases
QUERY:
has-Description: Description
0   Спам
5. FEVTMan   19.04.2014   04:54 [Материал]
Добавил в статью
0   Спам
6. ValeryKR   26.05.2015   20:22 [Материал]
Проблемы с запуском Колибри! Двойной щёлчёк по JColibriGUI.bat - на секунду появляется консоль - исчезает и ничего не происходит, что делать?
0   Спам
7. Lazy   21.03.2018   01:50 [Материал]
)

Имя *:
Email *:
Код *: