Implementación de un Sistema Experto Probabilistico EDA (Enfermedad Diarreica Aguda) usando el Teorema de Bayes con conexión a Mysql
En términos más generales y menos matemáticos, el teorema de Bayes es de enorme relevancia puesto que vincula la probabilidad de A dado B con la probabilidad de B dado A. Es decir, que sabiendo la probabilidad de tener un dolor de cabeza dado que se tiene gripe, se podría saber (si se tiene algún dato más), la probabilidad de tener gripe si se tiene un dolor de cabeza. Muestra este sencillo ejemplo la alta relevancia del teorema en cuestión para la ciencia en todas sus ramas, puesto que tiene vinculación íntima con la comprensión de la probabilidad de aspectos causales dados los efectos observados.
DESCRIPCIÓN DEL PROBLEMA:
Estas historias clínicas se resumen gráficamente en la figura. Hay 700 pacientes (región sombreada) que tienen la enfermedad adenocarcinoma gástrico (G), y 300 que no la tienen (se considera estar sano como otro valor posible de la enfermedad). Tres síntomas, dolor (D), pérdida de peso (P) y vómitos (V ), se considera que están ligados a esta enfermedad. Por tanto, cuando un paciente nuevo llega al centro médico, hay una probabilidad 700/1000 = 70% de que el paciente tenga adenocarcinoma gástrico. Esta es la probabilidad inicial, o “a priori”, puesto que se calcula con la información inicial, antes de conocer información alguna sobre el paciente.
Se pide crear un SEP que permita diagnosticar el nivel de probabilidad que tiene un paciente de haber adquirido esta enfermedad en base a los sintomas antes mencionados.
Base de datos:
create database Enfermedad; use Enfermedad; create table diagnostica( codigo int auto_increment primary key, dolor char(1), vomito char(1), p_peso char(1), estado char(1), cantidad int ); insert into diagnostica(dolor, p_peso,vomito,estado,cantidad) values ('s','s','s','s',220); insert into diagnostica(dolor, p_peso,vomito,estado,cantidad) values ('s','s','s','n',220); insert into diagnostica(dolor, p_peso,vomito,estado,cantidad) values ('s','s','n','s',25); insert into diagnostica(dolor, p_peso,vomito,estado,cantidad) values ('s','s','n','n',25); insert into diagnostica(dolor, p_peso,vomito,estado,cantidad) values ('s','n','s','s',95); insert into diagnostica(dolor, p_peso,vomito,estado,cantidad) values ('s','n','s','n',95); insert into diagnostica(dolor, p_peso,vomito,estado,cantidad) values ('s','n','n','s',10); insert into diagnostica(dolor, p_peso,vomito,estado,cantidad) values ('s','n','n','n',10); insert into diagnostica(dolor, p_peso,vomito,estado,cantidad) values ('n','s','s','s',4); insert into diagnostica(dolor, p_peso,vomito,estado,cantidad) values ('n','s','s','n',9); insert into diagnostica(dolor, p_peso,vomito,estado,cantidad) values ('n','s','n','s',5); insert into diagnostica(dolor, p_peso,vomito,estado,cantidad) values ('n','s','n','n',12); insert into diagnostica(dolor, p_peso,vomito,estado,cantidad) values ('n','n','s','s',31); insert into diagnostica(dolor, p_peso,vomito,estado,cantidad) values ('n','n','s','n',76); insert into diagnostica(dolor, p_peso,vomito,estado,cantidad) values ('n','n','n','s',50); insert into diagnostica(dolor, p_peso,vomito,estado,cantidad) values ('n','n','n','n',113);
Programa en Prolog:
% Autor: Andrés Esquivel :-use_module(library(tabular)). :-use_module(library(autowin)). :-use_module(library(pce)),pce_image_directory('./Imgs'). %CONEXION A LA BD conexion:- odbc_connect('swiprolog',_,[user('root'),password('123456'),alias(bd),open(once)]), odbc_prepare(bd,'SELECT cantidad FROM diagnostica where estado=? and dolor=? and vomito=? and p_peso=?', [atom>char(1),atom>char(1),atom>char(1),atom>char(1)], Handle, [types([integer])]), abolish(odbc_handle/1), assert(odbc_handle(Handle)). %EJECUTAR CONSULTA run_stmt(R,E,P1,P2,P3):- odbc_handle(Handle), odbc_execute(Handle,[E,P1,P2,P3],row(R)). %Cargar Imagenes en los frames load_img(Ventana, Figura, Imagen, Posicion) :- new(Figura, figure), % crea nueva instancia Figura de clase figure new(Bitmap, bitmap(resource(Imagen),@on)), %instancia Bitmap, transparencia @on send(Bitmap, name, 1), send(Figura, display, Bitmap), send(Figura, status, 1), send(Ventana, display, Figura, Posicion). %ASIGNAR IMAGENES A VENTANA PRINCIPAL Y VENTANA RESULTADOS resource(imgTab, image, image('enfermo.jpg')). resource(imgConEnf, image, image('noenfermo.jpg')). resource(imgSinEnf, image, image('sienfermo.jpg')). %VENTANA PRINCIPAL ventana:- new(F, frame('Sistema Experto - Adenocarcinoma Gastrico ')), new(Tablero, window('Tablero',size(535,358))), load_img(Tablero, ImgTablero ,imgTab, point(0,0)), send(F, append, new(D, dialog)), send(D, append, new(MB, menu_bar)), send(MB, append, new(Evaluacion, popup(evaluacion))), send(MB, append, new(Autores, popup(ayuda))), send_list(Evaluacion, append, [ menu_item(diagnostico,message(@prolog,interfaz,no)),menu_item(quit,message(F, destroy))]), send_list(Informacion, append, [ menu_item('Cortijo Flores Darwin Fransua',message(@display,inform,'ESTUDIANTE DE LA UNIVERSIDAD NACIONAL DE TRUJILLO - INTELIGENCIA ARTIFICIAL'))]), send_list(Informacion, append, [ menu_item('Esquivel Díaz Estuardo Andrés',message(@display,inform,'ESTUDIANTE DE LA UNIVERSIDAD NACIONAL DE TRUJILLO - INTELIGENCIA ARTIFICIAL'))]), send_list(Informacion, append, [ menu_item('Huaroto Rivera Luilly Anthony',message(@display,inform,'ESTUDIANTE DE LA UNIVERSIDAD NACIONAL DE TRUJILLO - INTELIGENCIA ARTIFICIAL'))]), send(D,append(Tablero)), send(F,open). %VENTANA SECUNDARIA interfaz(E):-E=no, new(Dialog,dialog('Preguntas sobre los Sintomas ')), new(P1,menu('1. Tiene dolor?')), send_list(P1,append,[s,n]), new(P2,menu('2. Tiene vómitos?')), send_list(P2,append,[s,n]), new(P3,menu('3. Tiene pérdida de peso?')), send_list(P3,append,[s,n]), send(Dialog,append(P1)), send(Dialog,append(P2)), send(Dialog,append(P3)), send(Dialog,append,button(ok,and(message(@prolog, diagnosticoProbabilistico, P1?selection, P2?selection, P3?selection) ))), send(Dialog,append,button(cancel,message(Dialog,destroy))), send(Dialog,open). %VENTANA RESULTADOS - LLAMADA POR VENTANA SINTOMAS diagnosticoProbabilistico(P1,P2,P3):- bayes(s,P1,P2,P3,Respuesta), write('Respuesta'), write(Respuesta), %writeln(Respuesta), new(Conclusion,dialog('Diagnostico Probabilistico EDA')), new(Tablero, window('Tablero',size(300,200))), ((Respuesta<0 .50="">load_img(Tablero, ImgEnfermo ,imgConEnf, point(0,0));load_img(Tablero, ImgEnfermo ,imgSinEnf, point(0,0))), ProBayesPorcentual is Respuesta*100, send(Conclusion,append(Tablero)), send(Conclusion,append,label(a,'Usted tiene la EDA con una probabilidad de')), send(Conclusion,append,label(a,ProBayesPorcentual)), send(Conclusion,append,label(a,'%')), send(Conclusion,append,button(ok,message(Conclusion,destroy))), send(Conclusion,open). %FORMULA APOSTERIORI - LLAMADA POR VENTANA RESULTADOS bayes(E,P1,P2,P3,Probabilidad):-E=s, conexion, writeln(''), run_stmt(R1,E,P1,P2,P3), writeln(R1), run_stmt(R2,n,P1,P2,P3), writeln(R2), Probabilidad is (R1/(R1+R2)), write('Usted tiene la EDA con una probabilidad de '), writeln(Probabilidad). 0>
Imágenes usadas:
RESULTADOS:
Espero les sirva si tiene problemas con la conexion odbc - mysql les recomiendo vean esto.
Hola me marca un error en la línea 91 me podrías ayudar?
ResponderEliminarTe dejo mi correo si me puedes compartir el código felix.itsta.117@gmail.com
Eliminarhola, muy interesante el SEP, solo una consulta cuando quiero implemetarlo y le doy a no en las consultas me arroja como resultado que el paciente tiene DEA. podrias ayudarme?. gracias
ResponderEliminarhola como podria ser en prolog venta de pasajes
ResponderEliminar