Sunteți pe pagina 1din 24

Universitatea Gh.

Asachi Iasi Facultatea de Electronica, Telecomunicatii si Tehnologia Informatiei

PROIECT Fundamentele Inteligentei Artificiale

Coordonatori : N.H. Teodorescu Zbancioc Masterand :


Ciulin Lucian, Specializare : SAEA

Universitatea Gh. Asachi Iasi Facultatea de Electronica, Telecomunicatii si Tehnologia Informatiei

Sistem de control al glicemiei unui bolnav de diabet, folosind algoritmi Fuzzy

Coordonatori : N.H. Teodorescu Zbancioc Masterand :


Ciulin Lucian, Specializare : SAEA

Tema abordata :

Pentru realizarea proiectului am ales sa construiesc baza teoretica a unui sistem capabil sa controleze glicemia unui bolnav de diabet. Acest sistem va fi capabil sa masoare valoarea glicemiei utilizatorului, dupa care, in functie de valoarea preluata de la senzorul de glucoza, sa dozeze o anumita cantitate de insulina pentru a combate cresterile glicemiei si a preveni eventualele crize hiperglicemice, precum si a mentine valoarea glicemiei la o valoare optima, si anume, intre 65 si 110 mg de glucoza/dL de plasma din sange . Valoarea cantitatii de insulina va fi stabilita de un sistem de control, care va lua decizia optima pentru a indeplini scopul intregului sistem. Sistemul de control va fi construit pe o baza de algoritmi Fuzzy .Acesti algoritmi vor fi construiti intai cu ajutorul unui program construit in Limbajul C , si apoi cu programul Matlab cu mediul de dezvoltare Fuzzy. Pentru verificarea functionarii sistemului voi introduce date specifice diferitelor situatii in care se va afla un bolnav de diabet ce va folosi un astfel de sistem, dupa care rezultatele obtinute in fiecare dintre programul construit in limbajul de programare C si cel din Matlab vor fi comparate si discutate intr-un studiu de caz pentru imbunatatirea rezultatelor si acoperirea a cat mai multor situatii posibile. O mai buna intelegere a acestui proiect necesita o fundamentare generala a fiecarui domeniu utilizat, si anume : teoria Fuzzy, simularea in Matlab, si medicina (in special diabetul zaharat si efectele insulinei ) . Notiunile generale din teoria Fuzzy au fost dobandite la cursul disciplinei : Fundamentele Inteligentei Artificiale sustinut de domnul Profesor dr. Ing., m.c. HORIA-NICOLAI TEODORESCU. Programul in limbajul C utilizat a fost construit pe baza sedintelor de laborator a disciplinei Fundamentele Inteligentei Artificiale sustinut de domnul asistent ing. MARIUS ZBANCIOC .

Schema de principiu a acestui sistem arata ca in figura de mai jos :

Date de intrare : Glicemie Rata de crestere a glicemiei Sistem de control Algoritm Fuzzy

Senzor de glucoza

Livrare de insulina prin pompite

Data de iesire Rata de crestere a livrarii de insulina Feedback prin senzor

Figura 1 : Schema de principiu a sistemului Fuzzy, de control al glicemiei

Acest sistem necesita, pentru realizarea practica 3 componente principale : 1. Dispozitiv de masurare a glicemiei 2. Microprocesor sau computer pentru analiza glucozei din sange si de calcul a dozei de insulina 3. Dispozitiv de livrare a insulinei (de obicei o pompa mecanica introdusa 4. sub piele)

Notiuni generale

a) glicemie, insulina si diabet .

Pentru aprecierea cantitatii de zahar din organism, in laborator se analizeaza zaharul din sangele total ori din ser sau plasma. Valori normale ale glucozei din sange: 65-110 mg la 100 ml sange. La persoanele de peste 40-50 ani, valorile medii ale glicemiei sunt mai crescute decat la tineri, deoarece la ele si consumul de glucoza in organism este mai redus. Insulina este un hormon ce are rolul de a ajuta la consumul si la arderea glucozei din sange si celule. In unele boli ale pancreasului acesta secreta mai putina insulina sau nu mai secreta deloc si din aceasta cauza glucoza, in loc sa se consume, sa se arda, se acumuleaza in sange, crescand glicemia. Astfel, glicemia poate ajunge la 200-300 mg% si chiar mai mult, ceea ce duce la coma diabetica (coma hiperglicemica) mai ales la acele persoane care nu stiu ca au diabet. Cea mai mare crestere a glicemiei se intalneste in diabetul zaharat sau diabetul pancreatic. In mod normal dupa consumul de glucoza, zaharul din sange creste si la oamenii sanatosi, dar nu mult si revine la normal dupa 2 ore. Dar la persoanele diabetice glicemia creste foarte mult, caci zaharul din sange nu se consuma si revenirea la normal, la valorile initiale se face mai tarziu de 2 ore. La persoanele cu diabet, limitele glucozei sunt: Dimineata, inainte de micul dejun: 30-130 (mg/dl) Inainte de mese: 30-130 (mg/dl) La 2 ore dupa masa: sub 180 mg/dl

b)logica Fuzzy

Teoria multimilor si conceptelor fuzzy au aparut din necesitatea de a exprima cantitativ marimi imprecise. In 1973 Lotfi A. Zadeh a extins teoria probabilitatilor intrun sistem de logica matematica [Zad 73]. Sistemul sau permitea extinderea valorii de adevar a unei propozitii la toate numerele reale cuprinse in intervalul [0 1]. Un numar din acest interval era interpretat drept posibilitatea ca propozitia considerata sa fie adevarata sau falsa. Astfel valoarea de 0.5 exprima posibilitatea ca propozitia poate fi in aceeasi masura falsa sau adevarata, iar valoarea 0.6 exprima posibilitatea ca propozitia sa fie considerata intr-o mai mare masura adevarata, decat falsa. Astfel ca nu se poate

afirma categoric despre un obiect ca e ori Bun ori Rau . Exprimarea Adevarat/Fals care sta la baza aplicatiilor traditionale este inlocuita in cazul unui sistem fuzzy cu exprimari calitative mult mai nuantate (specifice gandirii umane). In acest domeniu, o contributie deosebita a avut si logicianul roman Grigore C. Moisil(1906-1973).

Structura schematica a unui controler fuzzy este urmatoarea :

Interfata de intrare FUZIFICARE REGULI FUZZY

Interfata de iesire DEFUZIFICARE

Variabile De intrare

Variabile lingvistice Fuzzy

Concluzie Fuzzy

Marime de comanda

Figura 2 : Structura unui controler fuzzy

In cazul acestui proiect logica Fuzzy imita logica gandirii umane, logica utilizata de fiecare medic specialist pentru a recomanda doze de insulina fiecarui bolnav . Astfel ca logica fuzzy se poate folosi pentru a caracteriza sistemul de control al glicemiei. Primul pas in realizarea algoritmului Fuzzy, se numeste fuzificarea si consta in a atribui unei valori exacte (de exemplu, o concentratie de 75mg/dL a glucozei in plasma sangelui) o valoare specifica limbajului si gandirii umane, numite grade lingvistice (de exemplu : glicemie normala). Fuzificare se poate reprezenta grafic realizand toate atribuirile determinist - lingvistice.

Fuzificarea

In cazul sistemului de control al glicemiei exista 2 date de intrare astfel ca vom creea 2 grafice si vom defini 2 functii de apartenenta. Prima data de intrare este Glicemia .

Figura 3 : Atribuirea de grade lingvistice valorilor de glicemie din intervalul [0;600]

A doua data de intrare este : rata de schimbare a glicemiei. Aceasta reprezinta scaderea, cresterea, sau stagnarea glicemiei cu 20mg/dL, in functie de activitatile bolnavului de diabet. Astfel, cel mai mare factor care poate influenta scaderea glicemiei, ar fi efortul fizic depus, iar cel mai mare factor ce poate influenta cresterea glicemiei este consumul de alimente ce contin glucoza. In Figura 4 este reprezentata atribuirea gradelor lingvistice acestei date de intrare :

Figura 4: Atribuirea de grade lingvistice ratei de schimbare a glicemiei in intervalul [-20;20]

Data de iesire este reprezentata de rata de crestere a unitatilor de insulina care are ca si scop prevenirea eventualelor cresteri ale glicemiei si stabilizarea acesteia la un nivel optim, si anume, intre 65mg/dL si 110 mg/dL. Reprezentarea datei de iesire este redata in figura de mai jos, si anume Figura 5.

Figura 5 : Atribuirea de grade lingvistice ratei de schimbare a insulinei

Reguli Fuzzy

Functionarea sistemelor fuzzy se bazeaza pe un set de reguli de conducere de tipul :

Daca

<premisa>

atunci

<concluzie> .

In cazul nostru regulile sunt :

1. Daca <Glicemia este F_mica> si <Rata de schimbare e Negativ_mare> Atunci <Infuzia de insulina este Deloc> 2. Daca <Glicemia este F_mica> si <Rata de schimbare e Negativ> Atunci <Infuzia de insulina este Deloc>

.................................................................................................................................................................. ................................................................................................................................................................. ................................................................................................................................................................

29. Daca <Glicemia este Extrema> si <Rata de schimbare e Pozitiv> Atunci <Infuzia de insulina este Extrema> 30. Daca <Glicemia este Extrema> si <Rata de schimbare e Pozitiv_Mare> Atunci <Infuzia de insulina este Extrema>

Sistemul propus in acest proiect are 2 date de intrare si una de iesire. Data de intrare Valoarea Glicemiei reprezentata in Figura 3 are 6 functii de apartenenta si data de intrare Rata de schiumbare a glicemiei reprezentata in Figura 4 are 5 functii de apartenenta triunghiulare, ceea ce conduce la 5*6=30 reguli de conducere. Pentru compactare am ales sa reprezint tabelar aceste reguli, ca in figura de mai jos :

Negativ_Mare

Negativ

Zero

Pozitiv

Pozitiv_Mare

F_mica

Deloc

Deloc

Deloc

Deloc

Deloc

Mica

Deloc

Deloc

Deloc

Deloc

Deloc

Normala

Deloc

Deloc

Deloc

F_putina

Putina

Mare

Putina

Medie

Multa

Multa

F_multa

F_Mare

Multa

F_Multa

F_Multa

Extrema

Extrema

Extrema

Extrema

Extrema

Extrema

Extrema

Extrema

Figura 6 : Tabel de reguli Fuzzy

In programul Matlab sistemul fuzzy implementat arata ca in figura de mai jos :

Figura 7 : Sistemul fuzzy implementat in Matlab Fuzzy- FIS

Graficele asociate in variabilelor de intrare si celei de iesire sunt identice cu cele din figurile 4,5 si respectiv 6 .Regulile sistemului Fuzzy in programul Matlab arata ca in figura de mai jos :

Figura 8 : Set de reguli de conducere in progamul Matlab Fuzzy-FIS

Suprafata generata de catre regulile de inferenta din Matlab este reprezentata in Figura 9. In limbajul de programare C variabilele de intrare si iesire sunt definite ca un set de 2 multimi corelate. Una din cele 2 multimi contine punctele definitorii pentru fiecare functie in parte, iar cealalta contine valorile gradelor de apartenenta in fiecare punct definit in prima multime. Programul complet este atasat acestui document in Anexa 1. Pentru exemplificarea celor 3 variabile ( 2 de intrare si una de iesire) , avem Figura 10.

Figura 9 : Suprafata generata in Matlab de regulile Fuzzy

Figura 10 : Captura din limbajul C cu variabilele de intrare si iesire

Defuzificarea :

In continuare voi verifica functionalitatea celor doua programe prin testarea la diferite valori de intrare, si apoi prin compararea valorilor de iesire rezultate. Valorile pentru care voi aplica testele sunt :

1. Glicemie : 35 2. Glicemie : 100 3. Glicemie : 208,4 4. Glicemie : 588 1.

Rata de schimbare a glicemiei: -20 , 0 , 20 Rata de schimbare a glicemiei: -10 , 2 ,10 Rata de schimbare a glicemiei: -5 , -1 ,5

Figura 11 : Capturi din programele Matlab si Borland C Pentru compactare, voi prezenta valorile de iesire sub forma tabelara :

Rata de schimbare Glicemie

-20

20

-10

10

-5

-1

Insulina Rezultata

Insulina Rezultata

Insulina Rezultata

35

100

0.7

0.5

0.5

0.5

208,4

0.968 1.19

1.39

1.08

1.2

1.34

1.09

1.16

1.29

588

1.5

1.5

1.5

1.5

1.5

1.5

1.5

1.5

1.5

Figura 12 : Tabel cu diferite valori testate in programul Matlab Testand acelasi set de valori de intrare si in programul construit in limbajul C se observa o diferenta de maxim 0.1 intre valorile de iesire ale celor doua programe.

Concluzie :

Sistemul prezentat mai sus poate sta la baza unui sistem mai complex de control al glicemiei unui bolnav de diabet. Schema de principiu construita si testata mai sus are datele de intrare stabilite astfel incat sa acopere doar evenimentele si situatiile cele mai comune prin care poate trece un utilizator al acestui aparat. Glicemia este factorul cel mai determinant in luarea deciziei sistemului, intrucat se urmareste stabilizarea acesteia la o valoare optima : intre 65 si 110. Rata de schimbare a glicemiei este introdusa in algoritm pentru a caracteriza situatiile in care bolnavul de diabet consuma alimente fapt ce duce la cresterea glicemiei, sau in care bolnavul de diabet face efort fizic-fapt ce duce la scaderea glicemiei. Chiar si in cazul acesta, in care putine situatii sunt luate in considerare, rezultatele obtinute sunt bune, sistemul impiedicand cresterea glicemiei la valori periculoase. Problema principala a sistemului insa, este ca acesta nu trateaza situatia in care bolnavul ajunge la valori mici ale glicemiei (hipoglicemie). De asemenea, pentru ca un sistem sa poata fi pus in practica, trebuie sa acopere mai multe situatii si sa ia in considerare mai multi factori, cum ar fi : Dieta prescrisa de medic Tipul de diabet Ora din zi Tipul insulinei ( insulina prescrisa de medic poate fi cu actiune lenta sau cu actiune rapida ) Efortul fizic zilnic si intervalul de timp in care se produce acesta Etc.

Astfel un sistem performant de control al glicemiei necesita un algoritm fuzzy mai complex, care acopera o gama larga de situatii. Algoritmul fuzzy va avea mai multe date de intrare si iesire, si, exponential o gama mai mare de reguli de conducere.

Studiu de caz

Pentru imbunatatirea sistemului am ales sa maresc numarul de variabile de intrare si de iesire dupa cum urmeaza :

Date de intrare : Glicemie Alimente consumate Efort Fizic depus


Livrare de insulina prin pompite

Sistem de control Algoritm Fuzzy

Senzor de glucoza

Date de iesire Rata de crestere a livrarii de insulina Display cu recomandari

Feedback prin senzor Figura 12 : Sistem 2 de control al glicemiei

Prin marirea numarului de date de intrare am imbunatatit sistemul in sensul ca se iau in considerare si situatiile in care utilizatorul face efort fizic, sau consuma alimente. De asemenea se ia in considerare si situatia in care pacientul are hipoglicemie, caz in care pe display-ul aparatului apar diferite recomandari. (De exemplu : Mananca un mar sau Consuma un aliment foarte dulce sau Glicemia e optima etc. ).

Bibliografie

1.http://www.unisa.it/uploads/4978/067.jamal.pdf (02.12.2011) . 2.http://www.seattlerobotics.org/encoder/mar98/fuz/flindex.html (05.12.2012) . 3.http://www.diabetzaharat.ro/wp/index . 4. http://www.sfatulmedicului.ro/Analize-de-laborator/analize-biochimice-analizazaharului-din-sange-glicemia-si-din-urina-gli_1276 (28.11.2011). 5.Cursul disciplinei Fundamentele Inteligentei Artificiale sustinut de domnul Profesor dr. Ing., m.c. HORIA-NICOLAI TEODORESCU, Univ. Gh. Asachi , Fac. ETTI,Iasi . 6. Laboratorul disciplinei Fundamentele Inteligentei Artificiale sustinut de domnul asistent ing. MARIUS ZBANCIOC , Univ. Gh. Asachi , Fac. ETTI,Iasi.

Anexa 1

#include<stdio.h> #include<conio.h> #define min(a,b)(a<b)?a:b #define max(a,b)(a>b)?a:b #define nfx1 6 //numar functii de apartenenta pentru variabilele de intrare #define nfx2 5 //numar functii de apartenenta pentru variabilele de intrare #define nfy 7 //numar functii de apartenenta pentru variabila de iesire #define N 1001 //numar puncte folosit la discretizare univers discurs // pentru calcul reuniune si intersectie

float x1[6][4] = {{30,40,50,60},{40,50,60,70},{60,70,120,140},{120,140,200,220},{200,220,280,320},{22 0,280,320,600}};

float miu1[6][4] = {{1,1,0,0},{ 0, 1, 1, 0},{ 0, 1, 1, 0},{0, 1, 1, 0},{0,1,1,0},{0,0,1,1}}; int npx1 =4 ; //nfx1 = 6

float x2[5][3] = {{-20,-15,-10},{-20,-10,0},{-2,0,2},{0,10,20},{10,15,20}}; float miu2[5][3] = {{1,0.5, 0},{ 0, 1, 0},{ 0, 1, 0},{0,1,0},{0,0.5,1}}; int npx2 = 3; //nfx2 = 5

float y[7][3] = {{0,0.2,1},{0.2,0.5,0.8},{0.4,0.7,1},{0.6,0.9,1.2},{0.8,1.1,1.4},{1,1.3,1.6},{1.2,1.5,1.8}}; float miuy[7][3] = {{1,0,0},{0,1,0},{0,1,0},{0,1,0},{0,1,0},{0,1,0}}; int npy = 3; //nfy = 7

int R[6][5] = {{0,0,0,0,0},{0,0,0,0,0},{0,0,0,1,2},{2,3,4,4,5},{4,5,5,6,6},{6,6,6,6,6}};

float inf=y[0][0], sup=y[nfy-1][npy-1]; //float xR[N], miuR[N],

float grad_apart(float xc, float x[], float miu[], int npx) { float x1, x2, y1, y2;

if (xc<x[0]) return miu[0];

for(int i=0; i<=npx-2; i++)

{ x1=x[i]; x2=x[i+1]; y1=miu[i]; y2=miu[i+1];

if(xc<=x2 && xc >=x1) { if(y1==y2) return y1; else if (y1<y2) return (xc-x1)/(x2-x1)* (y2-y1) + y1; else return (x2-xc)/(x2-x1)*(y1-y2) + y2; } } return miu[npx-1]; }

void reuniune(float xA[], float miuA[], int npA, float xB[], float miuB[], int npB, float xR[], float miuR[]) { float step, xc, miu; //inf, sup,

// //

inf = min(xA[0], xB[0]); sup = max(xA[npA-1], x2[npB-1]); step= (sup-inf)/(N-1);

for(int i=0; i<N; i++)

{ xc = inf+i*step; xR[i]=xc; miu = max(grad_apart(xc,xA,miuA,npA), grad_apart(xc,xB,miuB,npB)); miuR[i] = max(miuR[i], miu); // printf("R[%2d]=%6.2f \t miuR[%d]=%.2f\n", i, xR[i], i, miuR[i]);

} // vectorii R[] si miuR[] pot fi declarati ca variabile globale // in acest caz nemaifiind necesar sa fie inclusi in lista de argumente }

void trunchiere(float x[], float miux[], int npx, float prag, float y[], float miuy[]) { float step, xc; //inf, sup,

// //

inf = min(x[0]); sup = max(x[npx-1]); step= (sup-inf)/(N-1);

for(int i=0; i<N; i++) { xc = inf+i*step; y[i]=xc; miuy[i] = min(prag, grad_apart(xc,x,miux,npx)); // printf("y[%2d]=%6.2f \t miuy[%d]=%.2f\n", i, y[i], i, miuy[i]);

} }

void main(void) { int i,j,idr; float x1c,x2c,miup1[nfx2],miup2[nfx1], miuc[nfy], miu;

clrscr();

x1c = 210; x2c = 10; // se calculeaza gradele de apartenenta ale primei premise/intrari // in toate functiile fuzzy asociate intarii for (i=0;i<nfx1; i++) miup1[i] = grad_apart(x1c,x1[i],miu1[i],npx1);

for (i=0;i<nfx2; i++) miup2[i] = grad_apart(x2c,x2[i],miu2[i],npx2); //miu = grad_apart(xc,&x2[2][0], &miu2[2][0],npx2);

// se initializeaza cu zero gradele de apartenenta ale concluziei/iesirii for (i=0;i<nfy; i++) miuc[i]=0;

// se calculeaza minimul premiselor folosit la // trunchierea iesirii regulii curente R(i,j) for (i=0;i<nfx1; i++) for (j=0;j<nfx2; j++) { miu = min(miup1[i],miup2[j]); idr = R[i][j]; //indice regula curenta R(i,j) miuc[idr] = max( miuc[idr], miu);

float xR[N], miuR[N]; for (i=0; i<N; i++) { xR[i]=0; miuR[i]=0; }

float miut[N]; for (idr=0; idr<nfy; idr++) { trunchiere(y[idr],miuy[idr],npy, miuc[idr], xR, miut); for (i=1; i<N; i++) miuR[i] = max(miuR[i], miut[i]); }

//defuzificare

float sum1=0, sum2=0; for (i=1; i<N; i++) { sum1 += xR[i]*miuR[i];

sum2 += miuR[i]; }

miu = sum1/sum2; //valoarea defuzificata a iesirii printf("x1=%.2f, x2=%.2f -> val.iesirii=%.2f",x1c, x2c, miu);

// //

for (i=0; i<nfy; i++) reuniune(x1[1],miu1[1], npx1, x1[0],miu1[0],npx1, xR,miuR);

getch(); }