H h tr ra quyt nh GVHD: PGS.TS Phỳc
MC LC
MC LC 1
LI M U 2
T VN 3
PHN I: TNG QUAN V THUT TON NAẽVE BAYES 4
I. Gi i thi u thu t toỏn Naive Bayes 4
II. nh lý Bayes v s phõn ho ch 4
1. nh lý Bayes 4
2. S phõn ho ch 5
III. B phõn l p v cỏc b c tớnh toỏn 6
1. B phõn l p Naùve Bayes 6
2. Cỏc b c tớnh toỏn 7
IV. S v c u trỳc d li u 7
1. S th c hi n 7
2. S kh i c a thu t toỏn 8
3. C u trỳc d li u 9
PHN II: DEMO NG DNG THUT TON NAẽVE BAYES D
ON KH NNG SINH VIấN TT NGHIP 10
1. Tớnh xỏc xu t 10
2. Cỏc thu t toỏn chớnh c s d ng t o Demo 11
3. Ch ng trỡnh Demo: 24
1. Túm t t k t qu t c 29
2. H ng phỏt tri n 29
TI LIU THAM KHO 30
HVTH: Nguyn Hunh Thuý Nga_MSSV: CH1301041_Lp Cao hc khúa 8Trang
1/30
Hợ hỗ trợ ra quyết định GVHD: PGS.TS Đỗ Phúc
LỜI MỞ ĐẦU
Ngày nay, lĩnh vực công nghệ thông tin (CNTT) đang phát triển trong thời
kỳ đỉnh cao nhất của nó. Ngày càng có nhiều ứng dụng ra đời nhằm đáp ứng yêu
cầu thiết yếu của con người. Từ những yêu cầu đơn giản đến những yêu cầu cực
kỳ khắt khe về kỹ thuật.
Trước khi đầu tư vào một lĩnh vực hay cần ra một quyết định quan trọng.
Hầu hết mọi người đều muốn dự đoán trước mức độ rủi ro và tỉ lệ thành công rồi
mới đưa ra quyết định cuối cùng. Vì vậy lĩnh vực dự đoán là một phần cực kỳ
quan trọng trong các ứng dụng hiện nay.
Có thể liệt kê ra một số ứng dụng quen thuộc như:
• Dự đoán kết quả bầu cử.
• Đánh giá kết quả phát triển trong các lãnh vực nông nghiệp
• Định hướng phát triển thị trường
• Phân lớp dữ liệu.
• Dự đoán khả năng tốt nghiệp của sinh viên
Các ứng dụng đòi hỏi có các thuật toán đạt tính chính xác cao. Một trong
các thuật toán đó là thuật toán phân lớp đối tượng Bayes (Thuật toán xác suất
Bayes).
Thuật toán Naïve Bayes có rất nhiều ứng dụng vào thực tiễn. Tuy nhiên,
với năng lực còn hạn chế, cũng như không có nhiều thời gian để có thể nghiên
cứu sâu vào tất cả các ứng dụng, nên em xin phép chọn đề tài “Ứng dụng thuật
toán Naïve Bayes để dự đoán khả năng sinh viên tốt nghiệp”.
Em xin chân thành cảm ơn Thầy PGS.TS Đỗ Phúc. Những tiết giảng quý
báu của Thầy đã cung cấp cho em những kiến thức nền tảng về các thuật toán hỗ
trợ ra quyết định bước khởi đầu giúp em nghiên cứu ứng dụng các thuật toán
trên nhiều lĩnh vực.
Học Viên Cao Học Khóa 8
NGUYỄN HUỲNH THUÝ NGA
* * *
HVTH: Nguyễn Huỳnh Thuý Nga_MSSV: CH1301041_Lớp Cao học khóa 8Trang
2/30
Hợ hỗ trợ ra quyết định GVHD: PGS.TS Đỗ Phúc
ĐẶT VẤN ĐỀ
Hiện nay, ở các trường Đại học, Cao đẳng tình trạng sinh viên ra trường trễ
hạn rất nhiều. Thậm chí không thể ra trường. Các giảng viên cố vấn học tập
cũng không biết căn cứ vào đâu để tư vấn cho các em về vấn đề này thật chính
xác và hiệu quả.
Ví dụ: Một sinh viên học năm cuối mà tổng điểm trung bình chỉ 1,6, nợ
môn , học lực kém ….
Một sinh viên năm cuối điểm trung bình 1,85, học lực trung bình, hình
thức đào tạo liên thông…
Những trường hợp này có thể ra trường không? Giảng viên cố vấn phải
quyết định tư vấn thế nào? Sinh viên phải quyết định ra sao? Học tiếp hay
chuyển điểm sang hình thức đào tạo thấp hơn phù hợp với năng lực?
Từ thực tế đó đòi hỏi phải có 1 phần mềm dự đoán tương đối chính xác khả
năng sinh viên tốt nghiệp. Để góp phần cho giảng viên cố vấn học tập có thể đưa
ra quyết định tư vấn chính xác, sinh viên có thể đưa ra quyết định đúng đắn hơn.
HVTH: Nguyễn Huỳnh Thuý Nga_MSSV: CH1301041_Lớp Cao học khóa 8Trang
3/30
Hợ hỗ trợ ra quyết định GVHD: PGS.TS Đỗ Phúc
PHẦN I: TỔNG QUAN VỀ THUẬT TOÁN NAÏVE BAYES
I. Giới thiệu thuật toán Naive Bayes
Naive Bayes (NB) là phương pháp phân loại dựa vào xác suất được sử
dụng rộng rãi trong lĩnh vực máy học của [Good,1965] [Mitchell, 1996]
[Joachims, 1997] [Jason, 2001], được sử dụng lần đầu tiên trong lĩnh vực phân
loại bởi Maron vào năm 1961 [Maron, 1961] sau đó trở nên phổ biến dùng
trong nhiều lĩnh vực như trong các công cụ tìm kiếm [Rijsbergen et al, 1970],
các bộ lọc email [Sahami et al, 1998]…
Định lý Bayes cho phép tính xác xuất xảy ra của một sự kiện ngẫu nhiên
A khi biết sự kiện ngẫu nhiên B liên quan đã xảy ra. Xác xuất này được ký hiệu
là P(A/B) và đọc là “xác xuất của A nếu có B”. đại lượng này được gọi là xác
xuất có điều kiện hay xác xuất hậu nghiệm vì nó được rút ra từ giá trị được cho
của B hoặc phụ thuộc vào giá trị đó.
Bayes dùng cho việc mô hình hóa tri thức trong các hệ thống y học, kỹ
thuật, xư lý ảnh, dung hợp dữ liệu và các hệ hỗ trợ quyết định.
Bayes dùng để phân lớp dữ liệu, Email…
II. Định lý Bayes và sự phân hoạch
1. Định lý Bayes
Giải thuật Naive Bayes chủ yếu dựa vào định lý xác suất của Bayes với
giả thuyết là các thuộc tính (Biến, Chiều) độc lập nhau và độ quan trọng của các
thuộc tính bằng nhau:
Trong đó mẩu tin E=[E
1
, E
2
, E
3
E
n
] Có n giá trị thuộc tính được biết như
là giá trị dữ liệu cần dự báo và H là lớp (nhãn) dự báo.
P(H): Xác suất trước (tiên nghiệm) của giả thuyết (phân loại) H.
HVTH: Nguyễn Huỳnh Thuý Nga_MSSV: CH1301041_Lớp Cao học khóa 8Trang
4/30
Hợ hỗ trợ ra quyết định GVHD: PGS.TS Đỗ Phúc
P(E): Xác suất trước (tiên nghiệm) của việc quan sát dữ liệu E.
P(E|H): Xác suất có điều kiện của việc quan sát được dữ liệu E nếu biết
giả thuyết (phân loại) H là đúng.
Với một tập giải thuyết các (phân lớp) H, là hệ thống học sẽ tìm ra giả
thuyết có thể xảy ra nhất.
Giả thuyết h này là giải thuyết có xác suất hậu nghiệm cực đại được tính
theo định lý Bayes như sau:
Do P(E) là như nhau với giả thuyết h
2. Sự phân hoạch
Cho H1, H2, …, Hn là một phân hoạch không gian mẫu M và A là biến cố
bất kỳ trong M. Ta có:
( )
0
( )( | )
n
i
P A P Hi A Hi
=
=
∑
Các xác suất P(Hi) và P(A|Hi) thường được biết trước khi thực hiện phép
thử và được gọi là xác suất tiền nghiệm ( apriori probability). Xác suất P(A|Hi)
cho biết khả năng tham gia của Hi vào việc xảy ra biến cố A. Xác suất P(A|Hi)
được gọi là xác suất hậu nghiệm ( a posteriori probability). Có thể tính các xác
suất hậu nghiệm từ các xác suất tiền nghiệm theo công thức sau:
HVTH: Nguyễn Huỳnh Thuý Nga_MSSV: CH1301041_Lớp Cao học khóa 8Trang
5/30
Hợ hỗ trợ ra quyết định GVHD: PGS.TS Đỗ Phúc
( ) ( | )
( | )
( )
P Hi P A Hi
P Hi A
P A
=
III. Bộ phân lớp và các bước tính toán
1. Bộ phân lớp Naïve Bayes
Cho V1,V2, …, Vn là phân hoạch không gian mẫu V, mỗi Vi là một lớp.
Không gian các thể hiện X gồm các thể hiện được mô tả bởi tập thuộc tính A1,
A2, …, An. Không gian các thể hiện X là tập học. Khi có thể hiện mới với giá
trị <a1,a2,…, an>, bộ phân lớp sẽ xuất hiện giá trị hàm phân lớp f(x) là một
trong các Vi.
Tiếp cận Bayes lấy các giá trị có xác suất cao nhất V
MAP
cho thể hiện mới.
Chữ MAP viết tắt của cụm từ Maximum A Posterior.
1 2
max ( | , , , )
i
MAP v V i n
V P v a a a
∈
=
Sử dụng định lý Bayes ta có:
1 2
1 2
( ) ( , , , | )
max
( , , , )
i
i n i
MAP v V
n
P v P a a a v
V
P a a a
∈
=
1 2
max ( ) ( , , , | )
i n i
P v P a a a v=
(4.1)
Trong công thức trên có hai số hạng cần quan tâm là P(v1) và P(a1,a2,…,an).
Ta tính P(vj) bằng cách đếm số lần xuất hiện của giá trị đích vj trong tập học. Để
tính P(a1,a2,…,an) ta giả thuyết ban đầu các thuộc tính là độc lập. Nói cách
khác, xác suất của một thể hiện quan sát được <a1, a2, …, an> trên mỗi lớp vj là
tích của các khả năng của từng thuộc tính riêng biệt trên vj.
1 2
( , , , | ) ( | )
n
i i i
i
P a a a v P a v=
∏
Do vậy, công thức (4.1) được viết lại là:
max ( ) ( | )
NB vi V i i i
i
V P v P a v
∈
=
∏
- với NB là viết tắt của cụm từ Naïve Bayes
Bộ phân lớp Bayes liên quan đến bước học trong đó P(vj) và P(a1,a2,…,an)
được tính dựa trên tập học.
HVTH: Nguyễn Huỳnh Thuý Nga_MSSV: CH1301041_Lớp Cao học khóa 8Trang
6/30
Hợ hỗ trợ ra quyết định GVHD: PGS.TS Đỗ Phúc
Để phân lớp ta dùng công thức:
arg max ( ) ( | )
i
n
NB v V i i i
i
V P v P a v
∈
=
∏
2. Các bước tính toán
Bước 1: Xác định các nhãn trong tập dữ liệu học.
Bước 2: Phân lớp các nhãn trên tập dữ liệu học.
Dựa vào nhãn đã phân lớp, thống kê các loại mẩu tin trong nhãn theo phân
lớp Yes(Có) hay phân lớp No (Không) trên tập dữ liệu học.
Bước 3: Tính tỷ lệ các loại mẩu tin theo phân lớp Yes (Có) hoặc No (Không)
trên tập dữ liệu học.
Bước 4: Tính xác suất của mẩu tin trên tập dữ liệu kiểm thử và đưa ra kết
luận.
Tính xác suất của mẩu tin trong tập dữ liệu kiểm thử theo phân lớp Yes (Có)
và tinh xác suất của mẩu tin trong tập dữ liệu kiểm thử theo phân lớp No
(Không).
So sánh 2 kết quả:
Nếu xác suất dự báo mẩu tin cho lớp Yes (Có) lớn hơn lớp No (Không) thì
Naive Bayes gán cho lớp Yes (Có).
Nếu xác suất dự báo mẩu tin cho lớp No(Không) lớn hơn lớp Yes(Có) thì
Naive Bayes gán cho lớp No(Không).
IV. Sơ đồ và cấu trúc dữ liệu
1. Sơ đồ thực hiện
HVTH: Nguyễn Huỳnh Thuý Nga_MSSV: CH1301041_Lớp Cao học khóa 8Trang
7/30
CÁC BƯỚC XỬ LÝ
ĐẦU
VÀO
ĐẦU
RA
Hợ hỗ trợ ra quyết định GVHD: PGS.TS Đỗ Phúc
2. Sơ đồ khối của thuật toán
HVTH: Nguyễn Huỳnh Thuý Nga_MSSV: CH1301041_Lớp Cao học khóa 8Trang
8/30
X=(x1,x2, , xn)…
P(y), P(N)
P(X/P(Y)) P(X/P(N))
P(X/P(Y)) >
P(X/P(N)) = ?
P(X/P(Y))=0
hoặc
P(X/P(N))=0
KẾT LUẬN
T
F
THÊM BỘ DỮ LIỆU
T
F
Hợ hỗ trợ ra quyết định GVHD: PGS.TS Đỗ Phúc
3. Cấu trúc dữ liệu
Vì độ phức tạp của thuật toán không cao nên cấu trúc dữ liệu được sử dụng
trong đề tài này sẽ chủ yếu dùng danh sách liên kết để lưu trữ dữ liệu.
Cấu trúc dữ liệu lưu dữ liệu các luật học cho trước:
o Public DataTable dtb;
Cấu trúc dữ liệu lưu vector X(X1,X2, ,XN)
o public List<string> Vector;
o public List<string> VectorNameHeader;
* Diễn giải cấu trúc dữ liệu
Ta sử dụng một datatable như là một bảng dữ liệu. Ở đó nó có thể chứa dữ
liệu rất lớn giống như một tài liệu Excel. Sẽ có các cột, các dòng tùy theo số
lượng dữ liệu chúng ta quy định. Đặc biệt thuận lợi khi lưu trữ dữ liệu dạng
bảng số
List<Kiểu dữ liệu> Tên biến: Khai báo một dang sách liên kết đơn, nó giống
như một kiểu mảng Array lưu trữ dữ liệu một cách uyển chuyển và linh hoạt. Nó
chứa các phương thức Add (Thêm một phần tử), Sort (Sắp xếp dữ liệu), Binary
Seach (Tìm kiếm nhị phân)
Ngoài ra còn một số cấu trúc dữ liệu đơn giản khác mà chúng em xin được
phép không đưa vào báo cáo này. Chúng em tập trung chủ yếu vào các cấu trúc
dữ liệu hay được sử dụng trong chương trình.
HVTH: Nguyễn Huỳnh Thuý Nga_MSSV: CH1301041_Lớp Cao học khóa 8Trang
9/30
Hợ hỗ trợ ra quyết định GVHD: PGS.TS Đỗ Phúc
PHẦN II: DEMO ỨNG DỤNG THUẬT TOÁN NAÏVE BAYES ĐỂ DỰ
ĐOÁN KHẢ NĂNG SINH VIÊN TỐT NGHIỆP
1. Tính xác xuất
Xét bảng dữ liệu sau đây thông qua việc xét một sinh viên đại học năm 4 có
khả năng tốt nghiệp không?
Cho tập dữ liệu traning như sau:
Hoc_luc_nam_HT Loai_hinh_DT Do_Tuoi no_mon Tot_nghiep
Gioi Chinh_Quy Dung_Tuoi Co No
Gioi Chinh_Quy Dung_Tuoi Khong No
Kha Chinh_Quy Dung_Tuoi Co Yes
Trung_Binh Lien_Thong Dung_Tuoi Co Yes
Trung_Binh
Lien_thong_tu_x
a Lon_tuoi Co Yes
Trung_Binh
Lien_thong_tu_x
a Lon_tuoi Khong No
Kha
Lien_thong_tu_x
a Lon_tuoi Khong Yes
Gioi Lien_Thong Dung_Tuoi Co No
Gioi
Lien_thong_tu_x
a Lon_tuoi Co Yes
Trung_Binh Lien_Thong Lon_tuoi Co Yes
Gioi Lien_Thong Lon_tuoi Khong Yes
Kha Lien_Thong Dung_Tuoi Khong Yes
Kha Chinh_Quy Lon_tuoi Co Yes
Trung_Binh Lien_Thong Dung_Tuoi Khong No
Với tập dữ liệu trên hãy áp dụng giải thật Naïve Bayes để xác định phân
lớp cho mẩu sau:
Hoc_luc_nam_HT Loai_hinh_DT Do_Tuoi No_mon Tot_nghiep
Gioi
Lien_thong_tu_x
a Dung_Tuoi Co X
Quá trình dự báo như sau:
P[Yes|X] = (2/9).(3/9).(3/9) .(3/9).(9/14)/P[X] = 0.0053/P[X]
P[No|X] = (3/5).(1/5).(4/5).(3/5).(5/14)/P[X] = 0.0206/P[X]
HVTH: Nguyễn Huỳnh Thuý Nga_MSSV: CH1301041_Lớp Cao học khóa 8Trang
10/30
Hợ hỗ trợ ra quyết định GVHD: PGS.TS Đỗ Phúc
Từ tính toán trên, ước lượng xác suất dự báo mẫu tin X cho lớp
Tot_nghiep = no lớn hơn ước lượng xác suất lớp Tot_nghiep = yes, NB
gán nhãn X cho lớp no.
+ Trường hợp nếu giá trị của thuộc tính không xuất hiện trong tất cả các
lớp, chúng ta có thể áp dụng ước lượng Laplace để tránh trường hợp xác suất
bằng 0. Giả sử μ là hằng số dương và pi là các hệ số dương mà ở đó
∑
=
1
i
p
.
Công thức ước lượng xác suất cộng thêm cho tử số một giá trị là piμ và mẫu số
là μ để tính xác suất.
+ Trường hợp dữ liệu liên tục:
Ở Bước 2 khi làm việc với dữ liệu liên tục, giả thuyết dữ liệu tuân theo
phân phối chuẩn (GAUSS). Công thức tính xác suất dựa trên hàm mật độ xác
suất.
2. Các thuật toán chính được sử dụng để tạo Demo
Thuật toán tính xác xuất No cho dữ liệu liên tục
public double TinhNoNumFc (int _va,
DevExpress.XtraGrid.Views.Grid.GridView gvi)
{
double[] countStr; double[] countNum;
int k; double f;
int tlyes = 0;
HVTH: Nguyễn Huỳnh Thuý Nga_MSSV: CH1301041_Lớp Cao học khóa 8Trang
11/30
Hợ hỗ trợ ra quyết định GVHD: PGS.TS Đỗ Phúc
int m = gvi.Columns.Count;
int n = dt.Rows.Count;
countStr = new double[arrM_Str.Count];
for (int i = 0; i < arrM_Str.Count; i++)
{
k = 0; tlyes = 0;
for (int j = 0; j < n; j++)
{
if (((RemoveSign4VietnameseString(CutStr(dt.Rows[j][m -
1].ToString())) == "khong") ||
(RemoveSign4VietnameseString(CutStr(dt.Rows[j][m - 1].ToString())) ==
"no")) && (RemoveSign4VietnameseString(CutStr(dt.Rows[j]
[(int)arrM_Str[i]].ToString())) ==
(RemoveSign4VietnameseString(CutStr(gvi.GetRowCellDisplayText(_va,
gvi.Columns[(int)arrM_Str[i]]).ToString())))))
{
k++;
}
if ((RemoveSign4VietnameseString(CutStr(dt.Rows[j][m -
1].ToString()))== "khong") ||
(RemoveSign4VietnameseString(CutStr(dt.Rows[j][m - 1].ToString())) ==
"no"))
{
tlyes++;
}
}
countStr[i] = (double)k / tlyes;//vị trí cuối cùng nhân vào luôn
}
int t = tlyes;
int tlyes_Num;
double _total;
double _mi = 1;
double _tamro;
double _ro;
countNum = new double[arrM_Num.Count];
for (int i = 0; i < arrM_Num.Count; i++)
{
tlyes_Num = 0; _total = 0; _ro = 1; _tamro = 0;
for (int j = 0; j < n; j++)
{
if ((RemoveSign4VietnameseString(CutStr(dt.Rows[j][m -
1].ToString())) == "khong") ||
(RemoveSign4VietnameseString(CutStr(dt.Rows[j][m - 1].ToString())) ==
"no"))
HVTH: Nguyễn Huỳnh Thuý Nga_MSSV: CH1301041_Lớp Cao học khóa 8Trang
12/30
Hợ hỗ trợ ra quyết định GVHD: PGS.TS Đỗ Phúc
{
tlyes_Num++;
_total += double.Parse(dt.Rows[j]
[(int)arrM_Num[i]].ToString());
}
}
_mi = (double)_total / tlyes_Num;
for (int j = 0; j < n; j++)
{
if ((RemoveSign4VietnameseString(CutStr(dt.Rows[j][m -
1].ToString())) == "khong") ||
(RemoveSign4VietnameseString(CutStr(dt.Rows[j][m - 1].ToString()))==
"no"))
{
_tamro += (Math.Abs((double.Parse(dt.Rows[j]
[(int)arrM_Num[i]].ToString()) - _mi)) * Math.Abs((double.Parse(dt.Rows[j]
[(int)arrM_Num[i]].ToString()) - _mi)));
}
}
_ro = Math.Sqrt((double)_tamro / (tlyes_Num - 1));
// f = (1 / (Math.Sqrt(2 * Math.PI) * _ro)) * (Math.Pow(Math.E, ((-
(66 - _mi) * (double.Parse(gvi.GetRowCellDisplayText(_va,
gvi.Columns[(int)arrM_Num[i]]).ToString()) - _mi)) / (2 * _ro * _ro))));
f = (1 / (Math.Sqrt(2 * Math.PI) * _ro)) * (Math.Pow(Math.E, (-
((double.Parse(gvi.GetRowCellDisplayText(_va,
gvi.Columns[(int)arrM_Num[i]]).ToString()) - _mi) *
(double.Parse(gvi.GetRowCellDisplayText(_va,
gvi.Columns[(int)arrM_Num[i]]).ToString()) - _mi)) / (2 * _ro * _ro))));
countNum[i] = f;
}
double gtyes = 1;
for (int i = 0; i < arrM_Str.Count; i++)
{
gtyes = (double)gtyes * (double)countStr[i];
}
gtyes = (double)gtyes * (double)((double)t / dt.Rows.Count);
for (int i = 0; i < arrM_Num.Count; i++)
{
gtyes = (double)gtyes * (double)countNum[i];
} //lblpyes.Text = String.Format("{0:0.000000000000}",
gtyes);
if(!IsNumber(gtyes.ToString()))
HVTH: Nguyễn Huỳnh Thuý Nga_MSSV: CH1301041_Lớp Cao học khóa 8Trang
13/30
Hợ hỗ trợ ra quyết định GVHD: PGS.TS Đỗ Phúc
{
gtyes = 0;
}
return gtyes;
}
Thuật toán Tính xác xuất No cho dữ liệu không liên tục
public double TinhNoStrFnc(int _va,
DevExpress.XtraGrid.Views.Grid.GridView gvi,DataTable dt1)
{
double[] count;
int k;
int tlyes = 0;
int m = gvi.Columns.Count;//số cột của test
int n = dt1.Rows.Count;
count = new double[m];
for (int i = 0; i < m - 1; i++)
{
k = 0; tlyes = 0;
for (int j = 0; j < n; j++)
{
if (((RemoveSign4VietnameseString(CutStr(dt1.Rows[j][m -
1].ToString()))== "khong") ||
(RemoveSign4VietnameseString(CutStr(dt1.Rows[j][m - 1].ToString())) ==
"no")) && (RemoveSign4VietnameseString(CutStr(dt1.Rows[j]
[i].ToString()))==
(RemoveSign4VietnameseString(CutStr(gvi.GetRowCellDisplayText(_va,
gvi.Columns[i]).ToString())))))
{
k++;
}
if ((RemoveSign4VietnameseString(CutStr(dt1.Rows[j][m -
1].ToString())) == "khong") ||
(RemoveSign4VietnameseString(CutStr(dt1.Rows[j][m - 1].ToString())) ==
"no"))
{
tlyes++;
}
}
count[i] = (double)k / tlyes;
// MessageBox.Show("mang no" + (double)k / tlyes);
HVTH: Nguyễn Huỳnh Thuý Nga_MSSV: CH1301041_Lớp Cao học khóa 8Trang
14/30
Hợ hỗ trợ ra quyết định GVHD: PGS.TS Đỗ Phúc
}
int t = tlyes;
double gtyes = 1;
for (int i = 0; i < m - 1; i++)
{
gtyes = (double)gtyes * (double)count[i];
}
gtyes = (double)gtyes * (double)((double)t / dt1.Rows.Count);
// MessageBox.Show("Là no"+gtyes);//lblpyes.Text =
String.Format("{0:0.000000000000}", gtyes);
return gtyes;
}
public double TinhYesNumFc(int _va,
DevExpress.XtraGrid.Views.Grid.GridView gvi)
{
///cuun2g
double[] countStr; double[] countNum;
int k; double f;
int tlyes = 0;
int m = gvi.Columns.Count;
int n = dt.Rows.Count;
countStr = new double[arrM_Str.Count];
for (int i = 0; i < arrM_Str.Count; i++)
{
k = 0; tlyes = 0;
for (int j = 0; j < n; j++)
{
if (((RemoveSign4VietnameseString(CutStr(dt.Rows[j][m -
1].ToString()))== "co") || (RemoveSign4VietnameseString(CutStr(dt.Rows[j]
[m - 1].ToString())) == "yes")) &&
(RemoveSign4VietnameseString(CutStr(dt.Rows[j]
[(int)arrM_Str[i]].ToString())) ==
(RemoveSign4VietnameseString(CutStr(gvi.GetRowCellDisplayText(_va,
gvi.Columns[(int)arrM_Str[i]]).ToString())))))
{
k++;
}
if ((RemoveSign4VietnameseString(CutStr(dt.Rows[j][m -
1].ToString())) == "co") ||
(RemoveSign4VietnameseString(CutStr(dt.Rows[j][m - 1].ToString())) ==
"yes"))
{
tlyes++;
}
HVTH: Nguyễn Huỳnh Thuý Nga_MSSV: CH1301041_Lớp Cao học khóa 8Trang
15/30
Hợ hỗ trợ ra quyết định GVHD: PGS.TS Đỗ Phúc
}
countStr[i] = (double)k / tlyes;
}
int t = tlyes;
int tlyes_Num;
double _total;
double _mi = 1;
double _tamro;
double _ro;
countNum = new double[arrM_Num.Count];
for (int i = 0; i < arrM_Num.Count; i++)
{
tlyes_Num = 0; _total = 0; _ro = 1; _tamro = 0;
for (int j = 0; j < n; j++)
{
if ((RemoveSign4VietnameseString(CutStr(dt.Rows[j][m -
1].ToString())) == "co") ||
(RemoveSign4VietnameseString(CutStr(dt.Rows[j][m - 1].ToString())) ==
"yes"))
{
tlyes_Num++;
_total += double.Parse(dt.Rows[j]
[(int)arrM_Num[i]].ToString());
}
}
_mi = (double)_total / tlyes_Num;
for (int j = 0; j < n; j++)
{
if ((RemoveSign4VietnameseString(CutStr(dt.Rows[j][m -
1].ToString())) == "co") ||
(RemoveSign4VietnameseString(CutStr(dt.Rows[j][m - 1].ToString())) ==
"yes"))
{
_tamro += (Math.Abs((double.Parse(dt.Rows[j]
[(int)arrM_Num[i]].ToString()) - _mi)) * Math.Abs((double.Parse(dt.Rows[j]
[(int)arrM_Num[i]].ToString()) - _mi)));
}
}
_ro = Math.Sqrt((double)_tamro / (tlyes_Num - 1));
f = (1 / (Math.Sqrt(2 * Math.PI) * _ro)) * (Math.Pow(Math.E, (-
((double.Parse(gvi.GetRowCellDisplayText(_va,
gvi.Columns[(int)arrM_Num[i]]).ToString()) - _mi) *
(double.Parse(gvi.GetRowCellDisplayText(_va,
gvi.Columns[(int)arrM_Num[i]]).ToString()) - _mi)) / (2 * _ro * _ro))));
HVTH: Nguyễn Huỳnh Thuý Nga_MSSV: CH1301041_Lớp Cao học khóa 8Trang
16/30
Hợ hỗ trợ ra quyết định GVHD: PGS.TS Đỗ Phúc
// MessageBox.Show("tim '-66-' " +
gvi.GetRowCellDisplayText(_va,
gvi.Columns[(int)arrM_Num[i]]).ToString());
// MessageBox.Show("Yes" + f);
countNum[i] = f;
}
double gtyes = 1;
for (int i = 0; i < arrM_Str.Count; i++)
{
gtyes = (double)gtyes * (double)countStr[i];
}
gtyes = (double)gtyes * (double)((double)t / dt.Rows.Count);
for (int i = 0; i < arrM_Num.Count; i++)
{
gtyes = (double)gtyes * (double)countNum[i];
} //MessageBox.Show("Yes"+gtyes);
if (!IsNumber(gtyes.ToString()))
{
gtyes = 0;
}
return gtyes;
}
Thuật toán Yes cho dữ liệu không liên tục
public double TinhYesStrFnc(int
_va,DevExpress.XtraGrid.Views.Grid.GridView gvi,DataTable dt1)
{
double[] count;
int k;
int tlyes = 0;
int m =gvi.Columns.Count;//số cột của test
int n = dt1.Rows.Count;
count = new double[m];
for (int i = 0; i < m - 1; i++)
{
k = 0; tlyes = 0;
for (int j = 0; j < n; j++)
{
HVTH: Nguyễn Huỳnh Thuý Nga_MSSV: CH1301041_Lớp Cao học khóa 8Trang
17/30
Hợ hỗ trợ ra quyết định GVHD: PGS.TS Đỗ Phúc
if (((RemoveSign4VietnameseString(CutStr(dt1.Rows[j][m -
1].ToString())) == "co") ||
(RemoveSign4VietnameseString(CutStr(dt1.Rows[j][m - 1].ToString())) ==
"yes")) && (RemoveSign4VietnameseString(CutStr(dt1.Rows[j]
[i].ToString())) ==
(RemoveSign4VietnameseString(CutStr(gvi.GetRowCellDisplayText(_va,
gvi.Columns[i]).ToString())))))
{
k++;
}
if ((RemoveSign4VietnameseString(CutStr(dt1.Rows[j][m -
1].ToString()) )== "co") ||
(RemoveSign4VietnameseString(CutStr(dt1.Rows[j][m - 1].ToString())) ==
"yes"))
{
tlyes++;
}
}
// MessageBox.Show(""+(double)k / tlyes);
count[i] = (double)k / tlyes;
}
int t = tlyes;
double gtyes = 1;
for (int i = 0; i < m - 1; i++)
{
gtyes = (double)gtyes * (double)count[i];
}
// MessageBox.Show("Là yes" + gtyes);
gtyes = (double)gtyes * (double)((double)t / dt1.Rows.Count);
// MessageBox.Show("Là yes"+gtyes);
//lblpyes.Text = String.Format("{0:0.000000000000}", gtyes);
return gtyes;
}
Thuật toán xãc định phân lớp Yes(Có) No(Không) cho từng
dòng dữ liệu dung trong tính Confusion Maxtrix
private void LoadSo()
{
int count1; int count2;
int count3; int count4;
HVTH: Nguyễn Huỳnh Thuý Nga_MSSV: CH1301041_Lớp Cao học khóa 8Trang
18/30
Hợ hỗ trợ ra quyết định GVHD: PGS.TS Đỗ Phúc
int n = dttemp.Columns.Count;
if (txtDuongdan.Text.Trim() != string.Empty)
{
try
{
int s = 0;
DataTable dt1 = new DataTable();
string _value =
Convert.ToString(gridViLabel.GetRowCellValue(gridViLabel.FocusedRow
Handle, gridViLabel.Columns[1].ToString()));
CLASS.ClsQuery obj_que_h2 = new CLASS.ClsQuery();
dt1 = obj_que_h2.get_S_F_NoneW(txtDuongdan.Text, _value +
" ,count(*) as 'Tổng Số' ", "group by " + _value);
dt1 = obj_que_h2.get_S_F_NoneW(txtDuongdan.Text, _value +
" ,count(*) as 'Tổng Số' ", "group by " + _value);
DataTable dt2 = new DataTable();
dt2.Columns.Clear();
dt2.Columns.Add(_value); dt2.Columns.Add("Tổng Số");
dt2.Columns.Add("Yes(Có)"); dt2.Columns.Add("No(Không)");
dt2.Columns.Add("Tỷ Lệ Yes(Có)"); dt2.Columns.Add("Tỷ Lệ
No(Không)");
if (gridViLabel.FocusedRowHandle < (n - 1))
{
if (check_NumCol(dttemp, gridViLabel.FocusedRowHandle)
== false)
{
for (int i = 0; i < dt1.Rows.Count; i++)
{
count1 = 0; count2 = 0; count3 = 0; count4 = 0;
for (int k = 0; k < dttemp.Rows.Count; k++)
{
if
(((RemoveSign4VietnameseString(CutStr(dttemp.Rows[k][n -
1].ToString())) == "co") || (CutStr(dttemp.Rows[k][n - 1].ToString()) ==
"yes")) && (CutStr(dttemp.Rows[k]
[gridViLabel.FocusedRowHandle].ToString()) == CutStr(dt1.Rows[i]
[0].ToString())))
count1++;
if
((RemoveSign4VietnameseString(CutStr(dttemp.Rows[k][n - 1].ToString()))
== "co") || (CutStr(dttemp.Rows[k][n - 1].ToString()) == "yes"))
HVTH: Nguyễn Huỳnh Thuý Nga_MSSV: CH1301041_Lớp Cao học khóa 8Trang
19/30
Hợ hỗ trợ ra quyết định GVHD: PGS.TS Đỗ Phúc
count3++;
if
((RemoveSign4VietnameseString(CutStr(dttemp.Rows[k][n - 1].ToString()))
== "khong") || (CutStr(dttemp.Rows[k][n - 1].ToString()) == "no"))
count4++;
}
s = int.Parse(dt1.Rows[i][1].ToString()) - count1;
dt2.Rows.Add(dt1.Rows[i][0], dt1.Rows[i][1], count1, s,
count1 + "/" + count3, s + "/" + count4);
}
gridView3.Columns.Clear();
grid_child_label.DataSource = dt2.DefaultView;
}
if (check_NumCol(dttemp, gridViLabel.FocusedRowHandle)
== true)
{
DataTable dtnum = new DataTable();
dtnum.Columns.Add("Satistic");
dtnum.Columns.Add("Values"); dtnum.Columns.Add("Yes");
dtnum.Columns.Add("No");
count1 = 0; count2 = 0; count3 = 0; count4 = 0;
int tlyes_Num;
double _total;
double _mi;
double _tamro;
double _ro;
tlyes_Num = 0; _total = 0; _tamro = 0;
for (int c = 0; c < dttemp.Rows.Count; c++)
{
if
((RemoveSign4VietnameseString(CutStr(dttemp.Rows[c][n - 1].ToString()))
== "co") || (RemoveSign4VietnameseString(CutStr(dttemp.Rows[c][n -
1].ToString())) == "yes"))
{
tlyes_Num++;
_total += double.Parse(dttemp.Rows[c]
[gridViLabel.FocusedRowHandle].ToString());
}
}
_mi = (double)_total / tlyes_Num;
for (int l = 0; l < dttemp.Rows.Count; l++)
{
HVTH: Nguyễn Huỳnh Thuý Nga_MSSV: CH1301041_Lớp Cao học khóa 8Trang
20/30
Hợ hỗ trợ ra quyết định GVHD: PGS.TS Đỗ Phúc
if
((RemoveSign4VietnameseString(CutStr(dttemp.Rows[l][n - 1].ToString()))
== "co") || (RemoveSign4VietnameseString(CutStr(dttemp.Rows[l][n -
1].ToString())) == "yes"))
{
_tamro +=
(Math.Abs((double.Parse(dttemp.Rows[l]
[gridViLabel.FocusedRowHandle].ToString()) - _mi)) *
Math.Abs((double.Parse(dttemp.Rows[l]
[gridViLabel.FocusedRowHandle].ToString()) - _mi)));
}//MessageBox.Show("ro" + (double)_tamro);
}
if (tlyes_Num - 1 != 0)
_ro = Math.Sqrt((double)_tamro / (tlyes_Num -
1));
else
_ro = 0;
int tlyes_NumNo;
double _totalNo;
double _mino;
double _tamro_no;
double ro_no;
tlyes_NumNo = 0; _totalNo = 0; _tamro_no = 0;
for (int c = 0; c < dttemp.Rows.Count; c++)
{
if
((RemoveSign4VietnameseString(CutStr(dttemp.Rows[c][n - 1].ToString()))
== "khong") || (RemoveSign4VietnameseString(CutStr(dttemp.Rows[c][n -
1].ToString())) == "no"))
{
tlyes_NumNo++;
_totalNo += double.Parse(dttemp.Rows[c]
[gridViLabel.FocusedRowHandle].ToString());
}
}
_mino = (double)_totalNo / tlyes_NumNo;
for (int l = 0; l < dttemp.Rows.Count; l++)
{
if
((RemoveSign4VietnameseString(CutStr(dttemp.Rows[l][n - 1].ToString()))
HVTH: Nguyễn Huỳnh Thuý Nga_MSSV: CH1301041_Lớp Cao học khóa 8Trang
21/30
Hợ hỗ trợ ra quyết định GVHD: PGS.TS Đỗ Phúc
== "khong") || (RemoveSign4VietnameseString(CutStr(dttemp.Rows[l][n -
1].ToString())) == "no"))
{
_tamro_no +=
(Math.Abs((double.Parse(dttemp.Rows[l]
[gridViLabel.FocusedRowHandle].ToString()) - _mino)) *
Math.Abs((double.Parse(dttemp.Rows[l]
[gridViLabel.FocusedRowHandle].ToString()) - _mino)));
}
}
ro_no = Math.Sqrt((double)_tamro_no /
(tlyes_NumNo - 1));
// nếu chữ có hoặc ko thì chưa làm được
if
((RemoveSign4VietnameseString(gridVi_InPut.GetRowCellDisplayText(0,
gridVi_InPut.Columns[0])) == "no") ||
((RemoveSign4VietnameseString(gridVi_InPut.GetRowCellDisplayText(0,
gridVi_InPut.Columns[0])) == "yes")))
{
dtnum.Rows.Add("Minimum",
TimMin(gridVi_InPut, dt.Rows.Count, gridViLabel.FocusedRowHandle),
TimMinDK(gridVi_InPut, dt.Rows.Count, gridViLabel.FocusedRowHandle,
"yes"), TimMinDK(gridVi_InPut, dt.Rows.Count,
gridViLabel.FocusedRowHandle, "no"));
dtnum.Rows.Add("Maximum",
TimMax(gridVi_InPut, dt.Rows.Count, gridViLabel.FocusedRowHandle),
TimMaxDK(gridVi_InPut, dt.Rows.Count, gridViLabel.FocusedRowHandle,
"yes"), TimMaxDK(gridVi_InPut, dt.Rows.Count,
gridViLabel.FocusedRowHandle, "no"));
}
else
{
dtnum.Rows.Add("Minimum",
TimMin(gridVi_InPut, dt.Rows.Count, gridViLabel.FocusedRowHandle),
TimMinDK(gridVi_InPut, dt.Rows.Count, gridViLabel.FocusedRowHandle,
"Co"), TimMinDK(gridVi_InPut, dt.Rows.Count,
gridViLabel.FocusedRowHandle, "Khong"));
dtnum.Rows.Add("Maximum",
TimMax(gridVi_InPut, dt.Rows.Count, gridViLabel.FocusedRowHandle),
TimMaxDK(gridVi_InPut, dt.Rows.Count, gridViLabel.FocusedRowHandle,
"Co"), TimMaxDK(gridVi_InPut, dt.Rows.Count,
gridViLabel.FocusedRowHandle, "Khong"));
}
dtnum.Rows.Add("Mean","" ,_mi,_mino);
HVTH: Nguyễn Huỳnh Thuý Nga_MSSV: CH1301041_Lớp Cao học khóa 8Trang
22/30
Hợ hỗ trợ ra quyết định GVHD: PGS.TS Đỗ Phúc
dtnum.Rows.Add("Stddev","", _ro,ro_no);
gridView3.Columns.Clear();
grid_child_label.DataSource = dtnum.DefaultView;
}
}
else if (gridViLabel.FocusedRowHandle == (n - 1))
{
try
{
count1 = 0; count2 = 0;
for (int k = 0; k < dt.Rows.Count; k++)
{
if (((RemoveSign4VietnameseString(CutStr(dt.Rows[k]
[n - 1].ToString())) == "co") ||
(RemoveSign4VietnameseString(CutStr(dt.Rows[k][n - 1].ToString())) ==
"yes")))
count1++;
if (((RemoveSign4VietnameseString(CutStr(dt.Rows[k]
[n - 1].ToString())) == "khong") ||
(RemoveSign4VietnameseString(CutStr(dt.Rows[k][n - 1].ToString())) ==
"no")))
count2++;
}
s = int.Parse(dt1.Rows[dt1.Rows.Count - 1][1].ToString())
- count1;
dt2.Rows.Add("YES(CÓ)", count1, count1, "", count1 + "/"
+ dttemp.Rows.Count, "");
dt2.Rows.Add("NO(KHÔNG)", count2, "", count2, "",
count2 + "/" + +dttemp.Rows.Count);
gridView3.Columns.Clear();
grid_child_label.DataSource = dt2.DefaultView;
}
catch
{
MessageBox.Show("vui lòng kiểm tra lại kiểu dữ liệu! ");
}
}
}
catch (Exception ex)
{
HVTH: Nguyễn Huỳnh Thuý Nga_MSSV: CH1301041_Lớp Cao học khóa 8Trang
23/30
Hợ hỗ trợ ra quyết định GVHD: PGS.TS Đỗ Phúc
MessageBox.Show(ex.Message.ToString());
}
}
}
3. Chương trình Demo:
* Cách cài đặt chương trình:
- Bước 1: Ta cài file Sp_Naive_Bayes.msi trong đường dẫn
Naive_Bayes_Demo\Sp_Naive_Bayes\Sp_Naive_Bayes\Express\DVD-
5\DiskImages\DISK1\
- Bước 2: Chạy file Navie_Bayes.exe trong đường dẫn
Naive_Bayes_Demo\Sp_Naive_Bayes\Sp_Naive_Bayes\Express\DVD-
5\DiskImages\DISK1\program files\Hp_Pro\My Product Name
Giao diện chính của chương trình
Mô tả: nhấn nút mở tập tin tìm đến file csv chứa tập dữ liệu tranning (Tập
dữ liệu chứa trong Folder DATA có đường dẫn là
NAVIE_BAYES_DEMO/DATA).
- Chọn trên từng danh sách thuộc tính sẽ hiển thị các Label danh sách cần
tìm.
HVTH: Nguyễn Huỳnh Thuý Nga_MSSV: CH1301041_Lớp Cao học khóa 8Trang
24/30
Hợ hỗ trợ ra quyết định GVHD: PGS.TS Đỗ Phúc
Tab 2: Phân lớp dữ liệu:
Mô tả: nhấn vào nút tạo mô hình để tính xác suất cho tập dữ liệu tranning
- Lúc này chưa phân lớp các trường hợp xác suất xảy ra bằng 0.
HVTH: Nguyễn Huỳnh Thuý Nga_MSSV: CH1301041_Lớp Cao học khóa 8Trang
25/30