Transcript
Page 1: Proiect Ciulin (Controler Fuzzy Al Glicemei)

Universitatea „Gh. Asachi ” Iasi

Facultatea de Electronica, Telecomunicatii si

Tehnologia Informatiei

PROIECT

Fundamentele Inteligentei Artificiale

Coordonatori :

N.H. Teodorescu Masterand :

Zbancioc Ciulin Lucian,

Specializare : SAEA

Page 2: Proiect Ciulin (Controler Fuzzy Al Glicemei)

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 Masterand :

Zbancioc Ciulin Lucian,

Specializare : SAEA

Page 3: Proiect Ciulin (Controler Fuzzy Al Glicemei)

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 :

Page 4: Proiect Ciulin (Controler Fuzzy Al Glicemei)

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 insulina3. Dispozitiv de livrare a insulinei (de obicei o pompa mecanica introdusa 4. sub piele)

Notiuni generale

Date de intrare :

Glicemie

Rata de crestere a glicemiei

Sistem de control

Algoritm Fuzzy

Data de iesire

Rata de crestere a livrarii de insulina

Senzor de glucoza Livrare de insulina prin pompite

Feedback prin senzor

Page 5: Proiect Ciulin (Controler Fuzzy Al Glicemei)

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 intr-un 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).

Page 6: Proiect Ciulin (Controler Fuzzy Al Glicemei)

In acest domeniu, o contributie deosebita a avut si logicianul roman Grigore C. Moisil(1906-1973).

Structura schematica a unui controler fuzzy este urmatoarea :

Variabile Variabile lingvistice Concluzie Marime

De intrare Fuzzy Fuzzy 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

Interfata de intrare

FUZIFICAREREGULI FUZZY

Interfata de iesire

DEFUZIFICARE

Page 7: Proiect Ciulin (Controler Fuzzy Al Glicemei)

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 :

Page 8: Proiect Ciulin (Controler Fuzzy Al Glicemei)

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

Page 9: Proiect Ciulin (Controler Fuzzy Al Glicemei)

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”>

Page 10: Proiect Ciulin (Controler Fuzzy Al Glicemei)

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 :

X2

X1 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 :

Page 11: Proiect Ciulin (Controler Fuzzy Al Glicemei)

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 :

Page 12: Proiect Ciulin (Controler Fuzzy Al Glicemei)

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.

Page 13: Proiect Ciulin (Controler Fuzzy Al Glicemei)

Figura 9 : Suprafata generata in Matlab de regulile Fuzzy

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

Page 14: Proiect Ciulin (Controler Fuzzy Al Glicemei)

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 Rata de schimbare a glicemiei: -20 , 0 , 20

2. Glicemie : 100 Rata de schimbare a glicemiei: -10 , 2 ,10

3. Glicemie : 208,4 Rata de schimbare a glicemiei: -5 , -1 ,5

4. Glicemie : 588

1.

Page 15: Proiect Ciulin (Controler Fuzzy Al Glicemei)

Figura 11 : Capturi din programele Matlab si Borland C

Pentru compactare, voi prezenta valorile de iesire sub forma tabelara :

Rata de schimbare

-20 0 20 -10 2 10 -5 -1 5

Glicemie Insulina Rezultata Insulina Rezultata Insulina Rezultata

35 0 0 0 0 0 0 0 0 0

100 0 0 0.7 0 0.5 0.5 0 0 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.

Page 16: Proiect Ciulin (Controler Fuzzy Al Glicemei)

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.

Page 17: Proiect Ciulin (Controler Fuzzy Al Glicemei)

Studiu de caz

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

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. ).

Date de intrare :

Glicemie

Alimente consumate

Efort Fizic depus

Senzor de glucoza

Sistem de control

Algoritm Fuzzy

Livrare de insulina prin pompite

Date de iesire

Rata de crestere a livrarii de insulina

Display cu recomandari

Feedback prin senzor

Page 18: Proiect Ciulin (Controler Fuzzy Al Glicemei)

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-analiza-zaharului-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},{220,280,320,600}};

Page 19: Proiect Ciulin (Controler Fuzzy Al Glicemei)

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++)

Page 20: Proiect Ciulin (Controler Fuzzy Al Glicemei)

{

x1=x[i]; y1=miu[i];

x2=x[i+1]; 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++)

Page 21: Proiect Ciulin (Controler Fuzzy Al Glicemei)

{

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]);

Page 22: Proiect Ciulin (Controler Fuzzy Al Glicemei)

}

}

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;

Page 23: Proiect Ciulin (Controler Fuzzy Al Glicemei)

// 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];

Page 24: Proiect Ciulin (Controler Fuzzy Al Glicemei)

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();

}


Top Related