Implementación de un Sistema Experto Probabilistico EDA (Enfermedad Diarreica Aguda) usando el Teorema de Bayes con conexión a Mysql
El teorema de Bayes, en la teoría de la probabilidad, es una proposición planteada por el filósofo inglés Thomas Bayes (1702-1761)1 en 1763,2 que expresa la probabilidad condicional de un evento aleatorio A dado B en términos de la distribución de probabilidad condicional del evento B dado A y la distribución de probabilidad marginal de sólo A.
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:
Un centro médico tiene una BD con las historias clínicas de N = 1000 pacientes.
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.