Các quan hệ và suy luận xấp xỉ, suy diễn mờ

Một phần của tài liệu BÁO CÁO BÀI TẬP LỚN THUỘC HỌC PHẦN: HỆ CHUYÊN GIA XÂY DỰNG HỆ CHUYÊN GIA DỰ ĐOÁN LƯỢNG THUỐC CẦN CẤP CHO BỆNH NHÂN DỰA TRÊN SUY DIỄN MỜ (Trang 32)

3. Mô tơ suy diễn

2.2. Các quan hệ và suy luận xấp xỉ, suy diễn mờ

2.2.1. Quan hệ mờ

2.2.1.1. Khái niệm về quan hệ rõ

Định nghĩa 7: Cho X , Y, R X  Y là một quan hệ (quan hệ nhị nguyên rõ), khi đó

Khi X= Y thì R  X  Y là quan hệ trên X Quan hệ R trên X được gọi là:

- Phản xạ nếu: R(x,x) = 1 với x X

- Đối xứng nếu: R(x,y) = R(y,x) với x, y X - Bắc cầu nếu: (xRy)(yRz) (xRz) với x,y,z X

Định nghĩa 8: R là quan hệ tương đương nếu R là quan hệ nhị nguyên trên X có tính chất phản xạ, đối xứng và bắc cầu.

2.2.1.2. Các quan hệ mờ

Các quan hệ mờ là cơ sở dùng để tính toán và suy diễn (suy luận xấp xỉ) mờ. Đây là một trong những vấn đề quan trọng trong các ứng dụng mờ đem lại hiệu quả

0 if (x,y)R y)( xR

R(x,y) =

lớn trong thực tế, mô phỏng được một phần suy nghĩ của con người. Chính vì vậy, mà các phương pháp mờ được nghiên cứu và phát triển mạnh mẽ. Một trong số đó là logic mờ mở. Tuy nhiên logic mờ mở rộng từ logic đa trị, do đó nảy sinh ra rất nhiều các quan hệ mờ, nhiều cách định nghĩa các toán tử T-chuẩn, T-đối chuẩn, cũng như các phương pháp mờ hoá, khử mờ khác nhau,…Sự đa dạng này đòi hỏi người ứng dụng phải tìm hiểu để lựa chọn phương pháp thích hợp nhất cho ứng dụng của mình.

Định nghĩa 9: Cho U  ; V  là hai không gian nền; R là một tập mờ trên UV gọi là một quan hệ mờ (quan hệ hai ngôi).

0 R (x,y) = R(x,y) 1

Tổng quát: RU1U2……..Un là quan hệ n ngôi 0 R(u1, u2,……un) = R(u1, u2,…..un) 1

2.2.1.3. Các phép toán của quan hệ mờ

Định nghĩa 10: Cho R là quan hệ mờ trên XY, S là quan hệ mờ trên YZ, lập phép hợp thành SoR là quan hệ mờ trên XZ

R(x,y) với (x,y) XY, S(y,z) với (y,z)YZ. Định nghĩa phép hợp thành: Phép hợp thành max – min xác định bởi:

(S R)(x,z) = (min(R(x,y),S(y,z))) (x,z)XZ

Phép hợp thành max – prod xác định bởi: (SR)(x,z) = (min(R(x,y) S(y,z))) (x,z)XZ

Phép hợp thành max – T ( với T là T - chuẩn) xác định bởi: (S TR)(x,z) = (T(R(x,y), S(y,z))) (x,z)XZ

Ví dụ: 3.1. (Hệ mờ, mạng nơron và ứng dụng, tr31 – làm thế nào để tính được S Rmax-min và S Rmax-prod)

2.2.2. Suy luận xấp xỉ và suy diễn mờ

Suy luận xấp xỉ hay còn gọi là suy luận mờ - đó là quá trình suy ra những kết luận dưới dạng các mệnh đề trong điều kiện các quy tắc, các luật, các dữ liệu đầu vào cho trước cũng không hoàn toàn xác định.

Định lý: “Nếu một hàm số là khả vi thì nó liên tục” Sự kiện: Hàm  khả vi

Kết luận: Hàm  là liên tục

Đây là dạng suy luận dựa vào luật logic cổ điển Modus Ponens. Căn cứ vào mô hình này chúng ta sẽ diễn đạt cách suy luận trên dưới dạng sao cho nó có thể suy rộng cho logic mờ.

Gọi  là không gian tất cả các hàm số, ví dụ  ={g:RR}. A là các tập các hàm khả vi, B là tập các hàm liên tục. Xét hai mệnh đề sau: P=’gA’ và Q =’gB’. Khi đó ta có:

Luật (tri thức): PQ

Sự kiện: P đúng (True)

Kết luận: Q đúng (True)

Xét bài toán suy luận trong hệ mờ

Hệ mờ n biến vào x1, …..xn và một biến ra y

Cho Un, i= 1..n là các không gian nền của các biến vào, V là không gian nền của biến ra.

Hệ được xác định bởi m luật mờ:

R1: Nếu x1 là A11và x2 và ….xn là A1n thì y là B1 R2: Nếu x1 là A21 và x2 là A22 và…xn là A2n thì y là B2

... Rm: Nếu x1 là Am1 và x2 là Am2 và ……xn là Amn thì y là Bm

Thông tin đầu vào:

X1 là A01 và x2 là A02 và….x0n là A0n

Tính: y là B0

Trong đó biến mờ ji, xác định trên không gian nền U, biến mờ Bj, xác định trên không gian nền V.

Để giải bài toán này chúng ta phải thực hiện qua các bước sau: 1. Xác định các tập mờ của các biến đầu vào.

2. Xác định độ liên thuộc tại các tập mờ tương ứng. 3. Xác định các quan hệ mờ R(A.B(u,v).

4. Xác định phép hợp thành.

Tính B’ theo công thức: B’ = A’R(A,B)(u,v).

2.3. Bộ mờ hoá

Thực hiện việc ánh xạ từ không gian đầu vào S vào các tập mờ xác định trong S được cho bởi hàm thuộc  : S [0,1]. Bộ phận này có chức năng chính dùng để chuyển một giá trị rõ x X thành một giá trị mờ trong S U (U là không gian nền). Có hai phương pháp mờ hoá như sau:

 Singleton fuzzifiter: Tập mờ A với x1 và hàm liên thuộc được định nghĩa như sau

 No – Singleton fuzziffier: Với các hàm liên thuộc nhận giá trị lớn nhất là 1 tạo x = xi và giảm dần từ 1 đến 0 với các giá trị dịch chuyển x  x1.

2.4. Hệ luật mờ

Gồm nhiều mệnh đề dạng:

IF<tập các điều kiện được thoả mãn>THEN<tập các hệ quả>

Giả sử hệ luật gồm M luật Rj (j= ) dạng Rj: IF x1 is x2 is is THEN y is Bj

Trong đó xi (i = ) là các biến đầu vào hệ mờ, y là biến đầu ra của hệ mờ - các biến ngôn ngữ, là các tập mờ trong các tập đầu vào X và là các tập mờ trong các tập đầu ra Y – các giá trị của biến ngôn ngữ (ví dụ: “Rất nhớ”, “nhỏ”, “Trung bình”, “Lớn”, “Rất lớn”,)đặc trưng bởi các hàm thuộc và . Khi đó là một quan hệ mờ từ các tập mờ đầu vào X = X1 X2 ... Xn tới các tập mờ đầu ra Y.

0 if x xi 1 if x = xi A(x) =

2.5. Động cơ suy diễn

Đây là một bộ phận logic đưa ra quyết định sử dụng hệ mờ để thực hiện ánh xạ từ các tập mờ trong không gian đầu vào X thành tập mờ trong không gian đầu ra

Y.

Khi Rj là một quan hệ mờ, thì Rj có thể là một tập con của tích Decart X  Y = với . Vì vậy, quan hệ Rj là một hàm ánh xạ từ tập mờ trong X tới tập mờ trong Y,được gọi là một dạng suy diễn mờ (để cho gọn, ta ký hiệu Aj = )

Giả sử A là một tập mờ trong X và là đầu vào của bộ suy diễn. Khi đó mỗi luật Rj tạo ra một tập mờ Bj trong Y như sau:

Bj = A Rj = sup (A*Rj)

Với * là một toán tử T - chuẩn được định nghĩa trong bảng 2.1. Do tính kết hợp, ta có thể định nghĩa:

T2(x,y) = T(x,y)

T3(x,y,z) = T(x,T2(y,z)) với 0 x, y, z1

...

Dùng quy nạp ta định nghĩa:

Tn(x1,x2,..., .xn) = T(x1, T n-1(x2,....xn)) với 0  xi 1

Quan hệ Rj được định nghĩa thông qua hàm phụ thuộc sau:

Và hàm liên thuộc của tập A

Do đó, hàm liên thuộc của tập mơg đầu ra được tính như sau:

2.6. Bộ giải mờ

Đây là một ánh xạ từ các từ các tập mờ trong R thành các giá trị rõ ràng trong R. Có nhiều phép giải mờ, với mỗi ứng dụng sẽ có một phương thức giải mờ khác nhau tuỳ thuộc yêu cầu ứng dụng. Dưới đây sẽ liệt kê một số phương thức giải mờ thông dụng.

Với j là chỉ số luật, y-j là điểm có độ liên thuộc lớn nhất trong tập mờ đầu ra B

j, thứ j và được tính theo công thức như sau:

 Phương pháp độ cao biến đổi:

với j hệ số biến đổi của luật j

 Phương pháp trọng tâm

 Phương pháp tâm của các tập (Center – of – Sets): phương pháp này mỗi luật được thay thế bởi tập singleton tâm cj

Chương 3: Xây dựng bài toán ứng dụng

3.1. Hệ chuyên gia và bài toán dự đoán lượng thuốc cần cấp cho bệnh nhân bệnh nhân

Chẩn đoán bệnh trong y học nói chung có khá nhiều những HCG đã và đang được sử dụng rộng rãi và đóng những vai trò nhất định. Y học không phải là một lĩnh vực quá xa lạ với trí tuệ nhân tạo nói chung và hệ chuyên gia nói riêng vì tính đặc thù và đơn giản là không phải lúc nào ta cũng có chuyên gia(bác sĩ) bên cạnh, hoặc chuyên gia đúng với căn bệnh đó. Do đó việc sử dụng HCG là hoàn toàn phù hợp để dưa ra thông số tham khảo hoặc đưa ra chuẩn đoán thay cho các chuyên gia thực thụ khi mà tính mạng con người đang bị de dọa.

Việc đưa ra một liều lượng thuốc tham khảo phù hợp với thể trạng bệnh nhân là mục tiêu mà đề tài hướng tới, để từ đó ta có thể tham khảo hoặc lấy thêm ý kiến từ chuyên gia để giúp việc điều trị đạt hiệu quả cao nhất.

3.2. Mô tả cách áp dụng thuật toán vào bài toán cụ thể

Thuật toán: sử dụng logic mờ để giải quyết bài toán dự đoán lượng thuốc cần cấp cho bệnh nhân

3.2.1. Xây dựng các biến ngôn ngữ cùng trạng thái

a. Tuổi (0 – 80 tuổi) - Trẻ(0,20,20,40) - Trung niên: TN(20,40,40,60) - Già(40,60,60,80) b. Sốt (37 – 41 oC) - Sốt nhẹ: SN(37,38,38,39) - Sốt cao: SC(38,39,41,41)

c. Lượng thuốc (0 – 120 đơn vị thuốc) - Thuốc thấp: TT(0,20,40,60) - Trung bình: TB(40,60,80,100) - Thuốc cao: TC(80,100,120,120) Tập luật

R1. Nếu Tuổi = Trẻ và Sốt = Nhẹ (SN) thì lượng thuốc = thấp (TT) R2. Nếu Tuổi = Trẻ và Sốt = Cao (SC) thì lượng thuốc = trung bình

R3. Nếu Tuổi = Trung Niên (TN) và Sốt = Nhẹ thì lượng thuốc = trung bình

R4. Nếu Tuổi = Trung niên và Sốt = Cao thì lượng thuốc = cao (TC) R5. Nếu Tuổi = Già và Sốt = Nhẹ thì lượng thuốc = trung bình R6. Nếu Tuổi = Già và Sốt = Cao thì lượng thuốc = cao

3.2.2. Hàm thuộc

a. Hàm thuộc của Tuổi Gọi tuổi là x

b. Hàm thuộc của Sốt

c. Hàm thuộc của lượng thuốc

3.3.3. Giải mờ

Giải mờ bằng phương pháp hình thang Ta có các giá trị a, b, m1, m2, h

T= M =

Từ các luật ta có lượng thuốc cần cấp cho bệnh nhân

3.3.4. Áp dụng vào bài toán cụ thể

Bài toán: Tính lượng thuốc cần cấp cho bệnh nhân 25 tuổi và sốt 38,5

oC

Suy diễn mờ

Suy luật mờ Theo luật r1: Theo luật r2: .25 Theo luật r3: .25 Theo luật r4: Theo luật r5: Theo luật r6:

Các luật tham gia vào hệ suy diễn để xác định lượng thuốc là: r1,r2,r3, r4 Luật r1:

H = 0.5

H = 0.5

Vậy lượng thuốc cần dùng cho người 25 tuổi và sốt 38.5 độ là 60.321 (đơn vị thuốc)

3.3. Thiết kế một số giải thuật

Thiết kế và sử dụng giải thuật– áp dụng trong các tập mờ hình thang với biểu diễn bộ 4 số:

- Giải thuật tìm hàm thuộc: Đầu vào: tập mờ A = {a, b, c, d}

Thông tin đối tượng x Đầu ra: Giá trị hàm thuộc

float hamthuoc() {

if( x < a || x > d) return 0;

else if((b!=c && x <= c && x >= b) || (b == c && x == b)) return 1;

else if( x <= b && x >= a) { if(b-a) return (x - a)/(b-a);

else return -2;//-2 sẽ bị loại khi đưa vào hàm main. }

else if( x <= d && x >= c) {

if(d-c)return (d - x)/(d-c); else return -2;

} else return -2; }

- Giải thuật tìm tử số, mẫu số của một luật tham gia: Đầu vào: lượng thuốc A={a, b, c, d} tương ứng với luật

H = = x (giá trị hàm thuộc của luật) Đầu ra: TU va MAU

float timm (t, u, v) { z = abs(t-u);

else return 0; }

float timtu(h, m1, m2, t, u){

return (h/6)*(3*m2*m2 – 3*m1*m1 + u*u - t*t + 3*m2*u + 3*m1*a);

}

float timmau(h, m1, m2, t, u){

return (h/2)*(2*m2 – 2*m1 + t + u); } void timtumau() { ka = timm(a, b, x); m1= a + ka; kb = timm(c, d, x); m2= d - kb; TU = timtu(x, m1, m2, ka, kb); MAU = timmau(x, m1, m2, ka, kb); }

3.4. Cài đặt chương trình3.4.1. Môi trường cài đặt 3.4.1. Môi trường cài đặt

 Ngôn ngữ cài đặt : C#

 Hệ điều hành : Windows 10

 Nền tảng : NetFramework 3.0

 Công cụ sử dụng : Visual Studio 2017

Để đảm bảo khả năng tương thích cao nhất cho các phiên bản kể cả khi cài đặt chương trình trên các máy tính khác mà không bị lỗi, nhóm đã quyết định sử dụng bản NetFramework 3.0 thay vì những bản mới hơn, việc này sẽ giúp chương trình được cà đặt dễ dàng hơn kể cả ở những máy có cấu hình thấp chỉ cần hỗ trợ NetFramework 3.0 trở lên.

3.4.2. Giao diện chương trình

Hình 3.1 Giao diện của chương trình

Tên điều khiển Loại điều khiển Text

txtTuoi Textbox

txtNhietDo Textbox

txtLuongThuoc Textbox

btnTinh Button Tính lượngthuốc

btnClear Button Xóa

3.4.3. Mã nguồn chương trình

3.4.3.1. Khai báo các biến lưu trữ hàm thuộc và tập luật

constint MIN_NHIET = 37; constint MIN_TUOI = 0; constint MAX_NHIET = 41;

constint MAX_TUOI = 80;

Dictionary<string, string[]> tap_mo = new Dictionary<string, string[]>(); Dictionary<string, float> tap_suy_dien = new Dictionary<string, float>(); Dictionary<string, float[]> tuoi = new Dictionary<string, float[]>(); Dictionary<string, float[]> nhiet = new Dictionary<string, float[]>(); Dictionary<string, float[]> thuoc = new Dictionary<string, float[]>(); Dictionary<string, string[]> luat = new Dictionary<string, string[]>(); Dictionary<string, float> doTuoi = new Dictionary<string, float>(); Dictionary<string, float> nhietDo = new Dictionary<string, float>(); ArrayList tu = new ArrayList();

ArrayList mau = new ArrayList();

3.4.3.2. Hàm khởi tạo

public Form1() {

InitializeComponent();

string[] age = { "TRE", "TN", "GIA" }; string[] temp = { "SN", "SC" };

string[] medicin = { "TT", "TB", "TC" }; tap_mo.Add("tuoi", age);

tap_mo.Add("nhietdo", temp); tap_mo.Add("thuoc", medicin); /* Trẻ(0, 20, 20, 40) TN(20, 40, 40, 60) Già(40, 60, 60, 80) (Tuổi) SN(37, 38, 38, 39) SC(38, 39, 41, 41) (Nhiệt độ) TT(0, 20, 40, 60) TB(40, 60, 80, 100) TC(80, 100, 120, 120) (Đơn vị thuốc) */ float[] tuoiTre = { 0, 20, 20, 40 }; float[] trungNien = { 20, 40, 40, 60 }; float[] tuoiGia = { 40, 60, 60, 80 }; tuoi.Add("TRE", tuoiTre);

tuoi.Add("TN", trungNien); tuoi.Add("TG", tuoiGia);

float[] sotNhe = { 37, 38, 38, 39 }; float[] sotCao = { 38, 39, 41, 41 }; nhiet.Add("SN", sotNhe);

float[] thuocThap = { 0, 20, 40, 60 }; float[] thuocTB = { 40, 60, 80, 100 }; float[] thuocCao = { 80, 100, 120, 120 }; thuoc.Add("TT", thuocThap); thuoc.Add("TB", thuocTB); thuoc.Add("TC", thuocCao); /*

1.Nếu Tuổi = Trẻ và Sốt = Nhẹ(SN) thì lượng thuốc = thấp(TT) 2.Nếu Tuổi = Trẻ và Sốt = Cao(SC) thì lượng thuốc = trung bình(TB) 3.Nếu Tuổi = Trung Niên(TN) và Sốt = Nhẹ thì lượng thuốc = trung bình 4.Nếu Tuổi = Trung niên và Sốt = Cao thì lượng thuốc = cao(TC)

5.Nếu Tuổi = Già và Sốt = Nhẹ thì lượng thuốc = trung bình 6.Nếu Tuổi = Già và Sốt = Cao thì lượng thuốc = cao */ string[] r1 = { "TRE", "SN", "TT" }; string[] r2 = { "TRE", "SC", "TB" }; string[] r3 = { "TN", "SN", "TB" }; string[] r4 = { "TN", "SC", "TC" }; string[] r5 = { "TG", "SN", "TB" }; string[] r6 = { "TG", "SC", "TC" }; luat.Add("r1", r1); luat.Add("r2", r2); luat.Add("r3", r3); luat.Add("r4", r4); luat.Add("r5", r5); luat.Add("r6", r6); } 3.4.3. Mã nguồn chương trình

publicpartialclassForm1 : Form {

public Form1() {

InitializeComponent();

< Khai báo các biến lưu trữ hàm thuộc và tập luật>

< Hàm khởi tạo>

privatefloat hamthuoc(float x, float[] mang) {

float a = mang[0]; float b = mang[1]; float c = mang[2]; float d = mang[3]; if (x <= c && x >= b) return 1; elseif (x <= b && x >= a) { if (b - a != 0) return ((x - a) / (b - a)); elsereturn 1; } elseif (x <= d && x >= c) { if (d - c != 0) return (d - x) / (d - c); elsereturn 1; } elsereturn 0; }

privatefloat timm(float t, float u, float v) {

float z = Math.Abs(t - u); if (z != 0) return v * z; elsereturn 0;

}

privatefloat timtu(float h, float m1, float m2, float t, float u) {

return (h / 6) * (3 * m2 * m2 - 3 * m1 * m1 + u * u - t * t + 3 * m2 * u + 3 * m1 * t);

}

privatefloat timmau(float h, float m1, float m2, float t, float u) {

return (h / 2) * (2 * m2 - 2 * m1 + t + u); }

void timtumau(float[] mang, float x) {

float b = mang[1]; float c = mang[2]; float d = mang[3]; float ka = timm(a, b, x); float m1 = a + ka; float kb = timm(c, d, x); float m2 = d - kb;

float TU = timtu(x, m1, m2, ka, kb); tu.Add(TU);

float MAU = timmau(x, m1, m2, ka, kb); mau.Add(MAU);

}

Hàm kiểm tra đầu vào tuổi và nhiệt độ.

Nếu tuổi và nhiệt độ nhỏ hơn 0 thì dữ liệu vào không hợp lệ.

Nếu nhiệt độ bệnh nhân nhỏ hơn nhiệt độ của cơ thể bình thường thì bệnh nhân không bị sốt.

Nếu tuổi bệnh nhân quá nhỏ hơn so với độ tuổi tiêu chuẩn để uống thuốc thì bệnh nhân quá trẻ, không thể chuẩn đoán.

Nếu tuổi bệnh nhân quá lớn hơn so với độ tuổi tiêu chuẩn để uống thuốc thì bệnh nhân quá tuổi, không thể chuẩn đoán.

Nếu nhiệt độ bệnh nhân quá cao so với nhiệt độ lớn nhất có thể chuẩn đoán thì sẽ không có dữ liệu.

privateBoolean KiemTraDauVao(float tuoi_in, float nhiet_do_in, object

sender, EventArgs e) {

if (nhiet_do_in < 0 || tuoi_in < 0) {

MessageBox.Show("Tuổi và nhiệt độ phải là số thực dương."); returnfalse;

}

elseif (nhiet_do_in < MIN_NHIET) {

MessageBox.Show("Bệnh nhân không bị sốt, không cần uống thuốc."); returnfalse;

}

elseif (tuoi_in < MIN_TUOI) {

MessageBox.Show("Bệnh nhân quá trẻ, không thể chuẩn đoán."); returnfalse;

}

elseif (tuoi_in > MAX_TUOI) {

MessageBox.Show("Bệnh nhân đã quá tuổi để chuẩn đoán, không có dữ liệu.");

returnfalse; }

elseif (nhiet_do_in > MAX_NHIET) {

MessageBox.Show("Nhiệt độ quá cao, không có dữ liệu."); returnfalse;

}

returntrue; }

Hàm xoá mới các dữ liệu nhập vào ở ô textbox.

privatevoid btnCLear_Click(object sender, EventArgs e) {

txtTuoi.Text = "";

Một phần của tài liệu BÁO CÁO BÀI TẬP LỚN THUỘC HỌC PHẦN: HỆ CHUYÊN GIA XÂY DỰNG HỆ CHUYÊN GIA DỰ ĐOÁN LƯỢNG THUỐC CẦN CẤP CHO BỆNH NHÂN DỰA TRÊN SUY DIỄN MỜ (Trang 32)

Tải bản đầy đủ (DOCX)

(57 trang)
w