Khai phá dữ liệu là một lĩnh vực vẫn còn khá mới mẻ, lý thú. Luận văn đã trình
bày, một số vấn đề cơ bản nhất, các phương pháp cơ bản để khai phá dữ liệu, đặc biệt
trình bày chi tiết, làm rõ vấn đề khai phá luật kết hợp. Phương pháp khai phá dữ liệu
có thể là: phân lớp, hồi quy, cây quyết định, suy diễn, quy nạp, K-láng giềng gần,
các phương pháp trên có thể áp dụng trong dữ liệu thông thường và trên tập mờ.
78 trang |
Chia sẻ: lylyngoc | Lượt xem: 3425 | Lượt tải: 2
Bạn đang xem trước 20 trang tài liệu Luận văn Khai phá dữ liệu ứng dụng trong đào tạo, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
bỏ mục có
support < minsup
C2
2 - itemset
{A, B}
{A, C}
{A, E}
{B, C}
{B, E}
{C, E}
C2
2 - itemset
{A, B}
{A, C}
{A, E}
{B, C}
{B, E}
{C, E}
Tỉa
L1
1 - itemset Count-support
{A} 2 - 50%
{B} 3 – 75%
{C} 3 – 75%
{E} 3 - 75%
Kết nối L1 & L1
L2
2 - itemset Count-support
{A, C} 2 – 50%
{B, C} 2 – 50%
{B, E} 3 – 75%
{C, E} 2 – 50%
Kết nối L2 & L2
Tỉa
C3
3 - itemset Count- support
{B, C, E} 2 - 50%
Quét toàn bộ D
C2
2 - itemset
{A, B}
{A, C}
{A, E}
{B, C}
{B, E}
{C, E}
Quét toàn bộ D
C2
2 - itemset Count-support
{A, B} 1 – 25%
{A, C} 2 – 50%
{A, E} 1 – 25%
{B, C} 2 – 50%
{B, E} 3 – 75%
{C, E} 2 – 50%
Xóa bỏ mục có
support < minsup
Xóa bỏ mục có
support < minsup L3
3 - itemset Count- support
{B, C, E} 2 - 50%
3 - itemset
{B, C, E}
3 - itemset
{B, C, E}
43
Một số biến thể của giải thuật Apriori
Giải thuật Apriori_TID là phần mở rộng theo hướng tiếp cận cơ bản của giải
thuật Apriori. Thay vì dựa vào cơ sở dữ liệu thô, giải thuật AprioriTID biểu diễn bên
trong mỗi giao dịch bởi các ứng viên hiện hành.
1. L1= {Large 1-itemset};
2. C’1 = Database D;
3. for (k=2; Lk-1 ; k++) do
4. Begin
5. Ck = apriori_gen(Lk-1);
6. C’k = ;
7. for tất cả t C’k-1 do
8. begin
// xác định tập ứng viên trong Ck chứa trong giao dịch với định //danh t.
Tid (Transaction Code)
9. Ct = c Ck | (c-c[k]) t.Set_of_ItemSets ^ (c-c[k-1]
t.Set_of_ItemSets
10. for những ứng viên c Ct do c.count ++;
11. if (Ct) then C’k+=
12. end
13. Lk = c Ck | c.count minsup;
14. End
15. return = kLk;
Thuật toán này cũng sử dụng hàm apriori_gen để sinh ra các tập ứng cử viên cho
mỗi giai đoạn. Nhưng thuật toán này không dùng CSDL D để đếm các support với các
giai đoạn k > 1 mà sử dụng tập C’k. Mỗi phần tử của C’k có dạng , trong
đó mỗi Xk là một tập phổ biến k_itemset tiềm năng trong giao dịch Tid. Khi k = 1, C’k
tương ứng với D, trong đó mỗi item i được coi là một itemset {i}. Với k>1, C’k được
sinh ra bởi C’k+= . Phần tử của C’k tương ứng với giao dịch t là <t.Tid,
{c | c chứa trong t}>. Nếu một giao dịch không chứa bất kỳ tập ứngviên k_itemset
nào thì C’k sẽ không có một điểm vào nào cho giao dịch này. Do đó, số lượng điểm
vào trong C’k có thể nhỏ hơn số giao dịch trong CSDL, đặc biệt với k lớn. Hơn nữa,
với các giá trị k khá lớn, mỗi điểm vào có thể nhỏ hơn giao dịch tương ứng vì một số
ứng viên đã được chứa trong giao dịch. Tuy nhiên, với các giá trị k nhỏ, mỗi điểm vào
có thể lớn hơn giao dịch tương ứng vì một một điểm vào trong C’k bao gồm tất cả các
ứng viên k_itemset được chứa trong giao dịch.
Giải thuật AprioriHybrid kết hợp cả hai hướng tiếp cận trên. Ngoài ra còn có
một số các giải thuật tựa Apriori(TID), chúng được định hướng để cài trực tiếp trong
SQL.
44
Giải thuật DIC là một biến thể khác nữa của giải thuật Apriori. Giải thuật DIC
làm giảm đi khoảng phân biệt nghiêm ngặt giữa việc đếm và việc phát sinh các ứng
viên. Bất kỳ ứng viên nào tới được ngưỡng minsupp, thì giải thuật DIC bắt đầu phát
sinh thêm các ứng viên dựa vào nó. Để thực hiện điều này giải thuật DIC dùng một
prefix-tree (cây tiền tố). Ngược với hashtree, mỗi nút (nút lá hoặc nút trong) của
prefix-tree được gán một ứng viên xác định trong tập phổ biến. Cách sử dụng cũng
ngược với hashtree, bất cứ khi nào tới được một nút ta có thể khẳng định rằng tập item
đã kết hợp với nút này trong giao tác đó. Hơn nữa, việc xác định độ hỗ trợ và phát sinh
ứng viên khớp nhau sẽ làm giảm đi số lần duyệt cơ sở dữ liệu.
2.3.2.Kỹ thuật DFS
Giả sử việc đếm các thể hiện được thực hiện trên tập các ứng viên có kích thước
hợp lý, với mỗi tập các ứng viên đó thì cần một thao tác duyệt cơ sở dữ liệu. Chẳng
hạn như, giải thuật Apriori dựa vào BFS thực hiện duyệt cơ sở dữ liệu mỗi k-kích
thước ứng viên một lần. Khi thực hiện tìm kiếm ưu tiên theo chiều sâu (DFS) tập ứng
viên chỉ gồm chỉ gồm một nút của cây từ phần 2.2.2. Một điều hiển nhiên là nếu phải
thực hiện duyệt cơ sở dữ liệu cho mỗi nút thì tổng chi phí kết quả thật khổng lồ. Vì thế
việc kết hợp DFS với việc đếm các thể hiện là không thật sự thích hợp.
2.5. Thuật toán AIS
2.5.1. Bài toán đặt ra
Đầu tiên, duyệt toàn bộ CSDL để tìm tất cả các tập mục phổ biến L1.
Tiếp theo, chừng nào Lk-1 ! = ( k >= 2)
1. Tìm tập các ứng cử viên bằng cách quét toàn bộ CSDL, với mỗi giao dịch,
ta tìm tổ hợp chập k của các mục có trong giao dịch và xác định các mục
trong tổ hợp này có là phổ biến hay không? Nếu không phải thì bỏ qua. Trái
lại, ta bổ sung tổ hợp đó vào tập hợp ứng cử viên bằng cách: kiểm tra xem tổ
hợp này đã nằm trong tổ hợp ứng cử viên hay chưa? Nếu chưa thì bổ sung
thêm và tăng độ hỗ trợ lên 1. Trái lại, tăng độ hỗ trợ của tổ hợp tương ứng
trong tập ứng cử viên thêm 1.
2. Duyệt toàn bộ các ứng cử viên, loại bỏ tất các tổ hợp có độ hỗ trợ nhỏ hơn
độ hỗ trợ yêu cầu của người sử dụng.
Cuối cùng ta được tất cả các tập mục phổ biến thoả mãn, có độ hỗ trợ tối thiểu
lớn hơn hoặc bằng độ hỗ trợ tối thiểu mà người sử dụng yêu cầu.
45
Thuật toán hoàn toàn sử dụng chiến lược “vét cạn”, xem xét toàn bộ các tập mục
phổ biến bằng cách sinh tổ hợp tập các mục và kiểm tra độ hỗ trợ.
2.5.2. Thuật toán AIS
Input: CSDL minsup
Output: Các tập mục phổ biến
1. L1={ Các tập mục phổ biến }.
2. For ( k=2;Lk-1 ; k++ )
3.{ Ck = ;
4. for ( tất cả các giao dịch t D )
5. Lt = subSet (Lk-1; t);
6. // Các tập mục phổ biến thuộc Lk-1 chứa trong giao dịch t
7. for (tất cả các tập mục phổ biến lt Lt)
8. Ct = tăng lt thêm một mục có trong giao dịch t;
9. for (Các ứng cử viên c Ct )
10. if ( c Ck) tăng biến đếm của c thêm l cho mục tương ứng thuộc
Ck
11. else add c vào Ck và tăng biến đếm tương ứng thêm 1)
12.
13.
14. Lk = c Ck c.count minsup
15.
16.return L = kLk
Ví dụ minh hoạ thuật toán AIS
Cho CSDL trong bảng sau. Giả sử với độ hỗ trợ tối thiểu là 2 giao dịch
CSDL L1
TID Các mục Tập mục Độ hỗ trợ
100 1, 3, 4 1 2
200 2, 3, 5 2 3
300 1, 2, 3, 5 3 3
400 2, 5 5 3
C2 L2
Tập mục Độ hỗ trợ Tập mục Độ hỗ trợ
1, 3 2 1, 3 2
1, 4 1 2, 3 2
46
3, 4 1 2, 5 3
2, 3 2 3, 5 2
2, 5 3
3, 5 2
1, 2 1
1, 5 1
C3 L3
Tập mục Độ hỗ trợ Tập mục Độ hỗ trợ
1,3,4 1 2,3,5 2
2,3,5 2
1,2,3 1
1,2,5 1
1,3,5 1
C4
Tập mục Độ hỗ trợ
1,2,3,5 1
Bảng 2.7. Ví dụ thuật toán AIS
Theo bước 1 của thuật toán, ta thu được L1 là tập gồm các mục có số lần xuất
hiện (độ hỗ trợ) lớn hơn hoặc bằng 2. Trong các bước từ 2 đến 14 ta thu được tập ứng
cử viên C2 là tập tất cả các tập có hai mục (2-itemset) và độ hỗ trợ tương ứng. Bước
13, ta thu được tập phổ biến L2 từ C2, L2 là tập các 2 itemset có độ hỗ trợ lớn hơn hoặc
bằng 2. Lặp lại các bước từ 2 đến 14 ta thu được tập các ứng cử viên C3 gồm tập tất cả
các tập có ba mục có độ hỗ trợ lớn hơn hoặc bằng 2. Tương tự, ta thu được C4 là tập có
bốn mục L4 bằng rỗng. Như vậy, tập các tập mục phổ biến mà ví dụ trên ta thu được
là: 1, 2, 3, 5, 1,3, 2,3, 2,5, 3,5, 2,3,5}. Thuật toán kết thúc.
47
2.6. Thuật toán SETM
2.6.1. Bài toán đặt ra
Thuật toán SETM được đề xuất do mong muốn dùng SQL để tìm các tập mục
phổ biến.
1. Đầu tiên, duyệt toàn bộ CSDL để tìm tất cả các tập mục phổ biến L1 và các mục
phổ biến cùng với TID của nó L1' được xếp theo TID.
2. Tiếp theo chừng nào Lk-1!= (k >= 2)
3. Tìm tập các ứng cử viên bằng cách quét toàn bộ CSDL, với mỗi giao dịch ta tìm tổ
hợp chập k của các mục có trong giao dịch và xác định các mục cùng với TID
trong tổ hợp này có thuộc L'k-1 ? Nếu không phải thì bỏ qua. Trái lại, ta bổ sung tổ
hợp đó vào tập ứng cử viên đồng thời lưu một bản sao của tập mục ứng cử viên
cùng với TID của nó.
4. Sắp xếp lại các ứng cử viên theo tập mục.
5. Xoá tất cả các ứng cử viên có độ hỗ trợ nhỏ hơn độ hỗ trợ do người sử dụng đề ra.
Kết quả lưu vào Lk'.
6. Xếp lại Lk' theo TID.
7. Cuối cùng ta được tất cả các tập mục phổ biến thoả mãn, có độ hỗ trợ tối thiểu lớn
hơn hoặc bằng độ hỗ trợ tối thiểu mà người sử dụng yêu cầu.
2.6.2. Thuật toán SETM
Input: CSDL D, minsup
Ouput: Tập các tập mục phổ biến.
1.L1 = Các mục phổ biến
2.L1' = Các mục phổ biến cùng các TID của nó được xếp theo TID
3.for (k=2; Lk-1 ; k ++)
4.C'k = ;
5. for (tất cả các giao dịch t D)
6. Lt = l L'k-1 \I.TID = t.TID
// Các tập có ( k-1) - itemset phổ biến có trong giao dịch t
7.for (tất cả các tập mục phổ bíên lt Lt)
8. Ct = tăng lt thêm một mục có trong t;
// Các ứng cử viên có trong t
9. C'k + = \ c C1 ;
10.
11.
48
12. sort C'k theo các tập mục
13. delete các mục c C'k có c.count < minsup đưa vào L'k;
14. Lk = \ l L'k; kết hợp với bước 13
15. sort L'k theo TID
16.
17.return L = kLk';
Giống như AIS thuật toán SETM cũng sinh ra các ứng cử viên dựa trên các giao
dịch đọc được từ CSDL. Vì thế, nó sinh ra và đếm mỗi tập mục ứng cử viên mà thuật
toán AIS sinh ra. Tuy nhiên, để dùng phép nối (JOIN) chuẩn của SQL. SETM chia sự
phát sinh ứng cử viên từ việc đếm. Nó lưu một bản sao của tập mục ứng cử viên cùng
với TID của việc phát sinh giao dịch trong cấu trúc tuần tự (bước 9). Cuối mỗi bước,
đếm độ hỗ trợ của các tập mục ứng cử viên được xác định bởi việc xếp (bước 12) và
việc kết hợp lại cấu trúc tuần tự này (bước 13). SETM ghi nhớ các TID của việc phát
sinh các giao dịch với các tập mục ứng cử viên. Để tránh việc thao tác trên tập con, nó
dùng thông tin này để xác định các tập mục lớn chứa trong giao dịch được đọc (bước
6). L'k C'k và thu được bởi việc xóa các ứng cử viên này mà không có độ hỗ trợ tối
thiểu (bước 13). Giả sử rằng CSDL được xếp thứ tự TID, SETM có thể dễ dàng tìm
các tập mục phổ biến được chứa trong một giao dịch trong bước tiếp theo bằng việc
xếp L'k theo TID (bước 15). Thực tế, nó cần thăm hỏi mỗi thành viên của L'k chỉ một
lần theo thứ tự TID và việc sinh ứng cử viên ở các bước 5 đến 11 có thể thực hiện nhờ
phép toán Merge-join.
Nhược điểm chính của thuật toán này là dựa vào số các tập ứng cử viên C'k. Khi
với mỗi tập các mục ứng cử viên có một TID kết hợp với nó, nó yêu cầu nhiều không
gian để lưu trữ số lượng lớn các TID. Hơn nữa, khi độ hỗ trợ của tập mục ứng cử viên
được tính vào cuối mỗi bước, C'k không theo thứ tự. Vì thế, việc xếp lại các mục là cần
thiết (bước 12). Sau đó, các tập mục ứng cử viên được cắt tỉa bằng việc loại bỏ các tập
mục ứng cử viên không thoả mãn ràng buộc độ hỗ trợ. Một sắp xếp khác trên TID là
cần thiết đối với tập kết qủa L'k (bước 15) trước khi nó có thể được sử dụng để phát
sinh các ứng cử viên trong bước tiếp theo.
Ví dụ minh hoạ thuật toán SETM
Xét CSDL cho trong bảng sau. Giả sử với độ hỗ trợ tối thiểu là 2 giao dịch
CSDL L1 L’1
TID Các mục Tập mục Độ hỗ trợ TID Tập mục
100 1, 3, 4 {1} 2 100 {1}
200 2, 3, 5 {2} 3 100 {3}
49
300 1, 2, 3, 5 {3} 3 200 {2}
400 2, 5 {5} 3 200 {3}
200 {5}
300 {1}
300 {2}
300 {3}
300 {5}
400 {2}
400 {5}
C’2 L2 L’2
TID Tập mục Tập mục Độ hỗ trợ TID Tập mục
100 {1, 3} {1, 3} 2 100 {1, 3}
100 {1, 4} {2, 3} 2 200 {2, 3}
100 {3, 4} {2, 5} 3 200 {2, 5}
200 {2, 3} {3, 5} 2 200 {3, 5}
200 {2, 5} 300 {1, 3}
200 {3, 5} 300 {2,3}
300 {1, 2} 300 {2, 5}
300 {1, 3} 300 {3, 5}
300 {1, 5} 400 {2, 5}
300 {2, 3}
300 {2, 5}
300 {3, 5}
400 {2,5}
L'3 L3
TID Tập mục Tập mục Độ hỗ trợ
50
200 {2, 3, 5} {2, 3, 5} 2
300 {2, 3, 5}
C'4 L4 = L'4 =
TID Tập mục
300 {1, 2, 3, 5}
Bảng 2.8: Ví dụ thuật toán SETM
Như vậy, tập các tập mục phổ biến mà ví dụ trên thu được là:
L = 1, 2,3,5,1, 3,2, 3,2, 5,3, 5,2, 3, 5.
Thuật toán kết thúc.
2.7. Thuật toán CHARM[9]
2.7.1. Tư tưởng thuật toán CHARM
2.7.1.1. Cơ sở lý thuyết
Cho quan hệ nhị phân R I x X. Cho R I & R T, xét các ánh xạ: t: I T,
t(X) = {yT/xX, x R y}; i:TI, i(Y) = {xl/yY, x R y}. Một ánh xạ t(X) là tập
tất cả các giao dịch chứa tập mục X, tương tự i(Y) là tập mục tất cả các giao dịch chứa
tập mục Y.
Định nghĩa một kết nối Galois giữa P(I) và P(T) tương ứng là các tập khả năng
của l và T. Chúng ta biểu diễn cặp (X, t(X) là X x t(X) và cặp (i(X),Y) là i(Y) x Y kết
nối Galois thoả mãn các thuộc tính sau (trong đó X, X1, X2 P(I) và Y,Y1, Y2 P(T):
X X2 t(X1) t(X2).
Y1 Y2 i(Y1) i(Y2).
X i(t(X)) và Y i(t(Y)).
Cho s là một tập. Hàm c: P(S)P(S) là một toán tử đóng trên S nếu với X,Y
S, c thoả mãn các thuộc tính sau:
Extention: X c(X)
Monotonicity: Nếu X Y, thì c(X) c(Y)
Idempotency: c(c(X)) = c(X)
51
Một tập con X của S được gọi là đóng nếu c(X) =X
Cho X Y và Y T. Cho Cit (X) biểu diễn ánh xạ hợp i0t(X) = i(t(X)) và Cit (Y)=
i0i(Y) = t(i(Y)). Thì Cit :P(I) P(I) và Cti :P(T) P(T) là hai toán tử đóng trên các tập
mục và các tập giao dịch tương ứng. Một số định nghĩa :
Định nghĩa tập mục đóng: X được gọi là tập mục đóng nếu X = Cit(X)
Định nghĩa tập mục đóng phổ biến: X được gọi là tập mục đóng phổ biến
nếu X là tập mục đóng và support(X) minsup.
Định nghĩa tập giao dịch đóng: Y là tập giao đóng nếu Y=Cit(Y)
Các ánh xạ Cit và Cti là các toán tử đóng, thoả mãn 3 thuộc tính Extension,
monotonicity và Idempotency.
Cho f: P(I) N là ánh xạ 1-1 từ các tập mục sang số nguyên. Với bất kỳ hai tập
mục X1 và X2 nào, chúng ta nói X1 X2 f(X1) f(X2). Hàm f xác định thứ tự toàn
thể trên tập tất cả các tập mục.
Ví dụ: nếu f biểu diễn theo thứ tự các từ điển, thì tập mục AC < AD. Khi với mẫu
khác, nếu f sắp xếp các tập mục theo thứ tự tăng dần độ hỗ trợ của chúng, thì AD <
AC nếu độ hỗ trợ của AD nhỏ hơn độ hỗ trợ của AC.
Giả sử rằng chúng ta đang xử lý nhánh X1 t(X1) và chúng ta muốn kết nối với
anh em của nó X2 t(X2). Điều này là X1 X2 (dưới dạng một thứ tự phù hợp f).
Việc tính toán trong CHARM dựa trên các thuộc tính dưới đây:
1. Nếu t(X1) = t(X2), thì t(X1 X2) = t(X1) t(X2) = t(X1) = t(X2). Vì thế chúng ta có
sự xuất hiện của X1 bằng X1 X2 và xoá X2 được xem xét từ xa, vì bao đóng của
X2 được đồng nhất với bao đóng của X1 X2. Mặt khác, chúng ta coi như X1 X2
là một tập mục hợp.
2. Nếu t(X1) t(X2) thì t(X1 X2) = t(X1) t(X2) = t(X1) t(X2). Ở đây ta có thể
thay mọi sự xuất hiện của X1 bằng X1 X2, vì nếu X1 xuất hiện trong bất kỳ giao
dịch nào, thì X2 cũng xuất hiện. Nhưng khi t(X1) t(X2), chúng ta không thể xóa
X2. Nó phát sinh ra bao đóng khác.
3. Nếu t(X1) t(X2) thì t(X1 X2) = t(X1) t(X2) = t(X1) t(X2). Trong trường hợp
này, chúng ta thay thế mọi sự xuất hiện của X2 bằng X1 X2, vì bất chỗ nào X2
xuất hiện thì X1 cũng xuất hiện. Tuy nhiên, X1 là kết quả của bao đóng khác và nó
phải được giữ lại.
52
4. Nếu t(X1) t(X2) thì t(X1 X2) = t(X1) t(X2) t(X1) t(X2). Trong trường hợp
này, không được loại bỏ cả X1 và X2 dẫn đến các bao đóng khác nhau.
2.7.2.2. Bài toán đặt ra
CHARM thực hiện trên cả không gian các tập phổ biến (itemset) và không gian
các tập định danh (TIDset). CHARM không tìm tất cả các tập con có thể của tập mục
mà thuật toán kết hợp tìm tập đóng hiệu quả hơn (bottom-up). Nếu CSDL cảu tập mục
là lớn và tập mục phổ biến là dày thì CHARM duyệt cả không gian tập mục và tập
định danh. Đồng thời sẽ bỏ qua nhiều mức để đi tìm tập phổ biến đóng thay cho việc
tính toán nhiều tập con không đóng. Hơn nữa, CHARM sử dụng hai kỹ thuật cắt tỉa:
1. Tỉa các ứng cử viên nếu tập con của nó không phổ biến đồng thời tỉa các
nhánh dựa trên tính chất không đóng (non-closure-property).
2. Bất kỳ tập không đóng nào cũng đều bị tỉa.
CHARM không sử dụng cấu trúc dữ liệu cây băm (hash tree), phép toán cơ sở
được sử dụng là hợp 2 tập mục và giao 2 tập định danh. Thuật toán bắt đầu bằng việc
khởi tạo các nút để kiểm tra các mục đơn phổ biến và các tập giao dịch của chúng
trong dòng 1. Tính toán chính được thực hiện trong CHARM-EXTEND, nó trả về các
tập mục đóng phổ biến C.
CHARM-EXTEND có trách nhiệm kiểm tra mỗi nhánh có khả năng. Nó rút ra
mỗi cặp tập mục – tập giao dịch (itemset-tidset) trong tập nút hiện tại Node (Xi t(Xi),
dòng 3), và kết nối nó với các cặp khác mà đứng sau nó (Xi t(Xi),dòng 5) theo thứ tự
tuyệt đối f. Việc kết nối các cặp itemset-tidsset được tính toán trong. Thủ tục
CHARM-PROPERTY kiểm tra tập kết quả với độ hỗ trợ yêu cầu và cũng áp dụng 4
thuộc tính được thảo luận ở trên. Lưu ý rằng thủ tục này có thể thay đổi tập nút hiện tại
bằng việc xoá các cặp itemset-tidset mà đã được chứa trong các cặp đó. Nó cũng chèn
các cặp phổ biến con mới được sinh ra trong tập các nút mới New. Nếu tập này khác
rỗng chúng ta thực hiện lại quá trình theo chiều sâu (dòng 8). Sau đó, chúng ta chèn
tập mục mở rộng có thể có X của Xi trong tập các tập mục đóng, vì nó không thể được
thực hiện; ở giai đoạn này bất kỳ tập mục đóng đang chứa Xi, đã từng được sinh ra, sau
đó chúng ta quay lại dòng 3 để xử lý nhánh tiếp theo (không được tỉa). Thủ tục
CHARM-PROPERTY kiểm tra đơn giản nếu cặp mới là phổ biến. Sau khi nó kiểm tra
mỗi cặp itemset-tidset với 4 thuộc tính cơ bản, việc mở rộng các tập mục hiện có, xoá
một nhánh được gộp từ các nút hiện có, hoặc việc chèn các cặp mới trong tập nút cho
bước tiếp theo (theo chiều sâu).
53
2.7.2. Thuật toán CHARM
CHARM (R I T, minsup)
1.Nodes = {Ij t(Ij): Ij I t(Ij) minsup }
2.CHARM-EXTEND (Nodes, C)
3.For (mỗi Xi t(Xj) Nodes)
4. NewN = & X = Xi
5. for (mỗi Xj t(Xj) Nodes với f(j) > f(i))
6. X= X Xj và Y= t(Xi) t(Xj)
7. CHARM-PROPERTY( Nodes, NewN)
8. if (NewN ) CHARM-EXTEND (NewN)
9. C=C X;//nếu X chưa được gộp
CHARM-PROPERTY( Nodes, NewN)
10. if ( || Y || minsup)
11. if(t(Xi) = t(Xj)) // Thuộc tính 1
12. Loại Xj ra khỏi Nodes
13. Thay thế tất cả các Xi bởi X
14. else if (t(Xi) t(Xj)) // Thuộc tính 2
15. Thay thế tất cả các Xi bởi X
16. else (if t(Xi) t(Xj)) // Thuộc tính 3
17. Xoá tất cả các Xj khỏi Nodes
18. Bổ sung X Y vào NewN
19. else if (t(Xi) t(Xj)) // Thuộc tính 4
20. Bổ sung X Y vào NewN
Ví dụ minh hoạ thuật toán CHARM
Cho I ={A, C, D, T, W } và T = {1, 2, 3, 4, 5, 6}
Giao dịch Các mục
1 {A, C, T, W}
2 {C, D, W }
3 {A, C,T, W }
4 {A, C, D, W }
5 {A, C, D, T, W }
6 {C, D, T }
Bảng 2.9: Tập các giao dịch trong ví dụ thuật toán CHARM
Từ bảng giao dịch trên, ta thu được tập mục phổ biến với độ hỗ trợ tối thiểu là 3
giao dịch:
54
Tập mục Hỗ trợ
{C} 6
{{W}, {C, W }} 5
{{A}, {D}, {T}, {A,C},{A,W}, 4
{{A,T},{D,W},{T,W},{A,C,T},{A,T,W},{C,T,W},{C,D,W},{
A,C,T,W}
3
Bảng 2.10: Tập mục phổ biến trong ví dụ minh hoạ thuật toán CHARM
a) Sắp xếp các tập mục theo thứ tự từ điển
Chú ý: Để tiện cho mô tả chúng ta qui ước viết: ví dụ: 1345 tương ứng là
{1,3,4,5}, ACD tương ứng với {A,C,D}
Hình 2.11: Thuật toán CHARM sắp xếp theo thứ tự từ điển
Ban đầu ta có 5 nhánh tương ứng với 5 mục và các tập giao dịch từ CSDL
trên(minsup=3). Để phát sinh con của mục A(hoặc cặp A x{1,3,4,5}) chúng ta cần nối
nó với tất cả các anh em đi sau nó. Khi ta nối 2 cặp X1 x t(X1) và X2 x t(X2). Cặp kết
quả đưa ra là (X1 X2) x (t(X1) t(X2)). Mặt khác, chúng ta cần thực hiện giao của
các tập giao dịch tương ứng mỗi khi chúng ta nối hai hoặc nhiều hơn hai mục.
Khi chúng ta thử mở rộng A với C, chúng ta thấy rằng thuộc tính hai là đúng.
Nghĩa là, t(A) = {1,3,4,5} {1,2,3,4,5,6} =t(C). Vì thế, chúng ta có thể xoá A và thay
bằng AC. Kết nối A với D kết quả là tập không phổ biến {A,C,D} bị cắt tỉa. Kết nối
với T kết quả cặp{A,T,C} x {1,3,5} theo thuộc tính 4 không bị tỉa. Khi thử kết nối A
D x 2456
CD x 2456 CT x 1356 CW x 12345
CTW x 135
A x 1345
AC x 1345
ACW x 1345
C x 123456 Tx 1356 W x 12345
ACD x 45 ACTx 135
ACTW x 135
CDT x 56 CDW x 245
{}
55
với W ta thấy rằng t(A) t(W) theo thuộc tính 2 ta thay A bằng {A,W}. Do đó {A,C}
thành {A,C,W} và {A,C,T} thành {A,C,T,W}.
Tiếp theo ta bắt đầu xử lý nhánh C, ta kết nối C với D, ta thấy thuộc tính có 3
hiệu lực, nghĩa là: t(X) t(D), tức là mỗi khi D xuất hiện thì C cũng xuất hiện. Vì thế,
D có thể được loại bỏ và toàn bộ nhánh D bị tỉa; còn {C,D} thay bằng D. Cũng như
vậy, ngữ cảnh tương tự xảy ra với T và W. Cả 2 nhánh bị tỉa và được tỉa thay thế bởi
{C,T} và {C,W} là con của C.Tiếp tục duyệt theo chiều sâu,chúng ta xử lý tiếp với
nút{C,D}.Nối{C,D} với{C,T} kết quả là tập mục không phổ biến {C,D,T} bị cắt tỉa.
Nối {C,D} với {C,W} kết quả là {C,D,W} theo thuộc tính 4 không bị loại bỏ. Tương
tự, nối {C,T} và {C,W} thành {C,T,W}.Lúc này các nhánh đã được xử lý.
Cuối cùng, chúng ta xoá {C,T,W} x {1,3,5} vì nó được chứa trong{A,C,T,W} x
{1,3,5}. Qua 10 bước xác định được tất cả 7 tập mục phổ biến đóng.
b) Sắp xếp các tập mục theo độ hỗ trợ tăng dần
Hình 2.12: Sắp xếp theo độ hỗ trợ tăng dần
Nhận xét:
Tính đúng đắn: Thuật toán CHARM tìm ra tất cả các tập mục phổ biến đóng.
Thời gian tính toán: Thời gian tính toán của thuật toán CHARM là O(l*|C|) trong
đó C là các tập mục phổ biến đóng; l là độ dài trung bình của tập định danh.
Độ phức tạp: Số lần duyệt CSDL của CHARM là O(|C|/(*|I|)) trong đó: C là
các tập mục phổ biến đóng; {I} là tập các mục và là độ lớn phân vùng CSDL trong
bộ nhớ.
{ }
A x 1345
AW x 1345
ACW x 1345
T x 1356
CT x 1356
W x 12345
CW x 12345
C x 123456
AT x 135
ATW x 135
ACTW x 134
AD x 45 DT x 56
D x 2456
CD x 2456
DW x 245
CDW x 245
TW x 135
CTW x 135
56
2.8. Kết luận
Chương này đã trình bày về lý thuyết luật và luật kết hợp, trình bày một số vấn
đề cơ bản của việc khai phá dữ liệu dùng luật kết hợp. Trình bày một số thuật toán tiêu
biểu khai phá luật kết hợp. Thuật toán kinh điển Apriori tìm tập mục phổ biến theo
cách sinh các ứng cử, biến thể của thuật toán Apriori là thuật toán Apriori_Tid, và
thuật toán AIS, SETS, CHARM. Độ phức tạp thuật toán tìm các tập mục phổ biến là
khó, thời gian tìm các tập mục phổ biến là tuyến tính với kích thước của CSDL vì các
CSDL thường là rất thừa và các thuật toán đã dùng một số kỹ thuật tỉa hiệu quả.
57
Chương 3
ỨNG DỤNG KHAI PHÁ LUẬT KẾT HỢP TRONG ĐÀO TẠO
3.1. Bài toán
Hiện nay trường Đại học Dân lập Hải Phòng đã bắt đầu thực hiện chương trình
đào tạo theo chế tín chỉ, nên đầu mỗi học kỳ sinh viên phải tiến hành đăng ký môn
học. Để tạo điều kiện cho việc chọn đăng ký môn học cho mỗi học kỳ phòng Đào tạo
sẽ phải lên danh sách các lớp học kèm theo thời khóa biểu. Bên cạnh đó để hỗ trợ thêm
cho sinh viên có thể đăng ký môn học được tốt hơn thì các cán bộ phòng đào tạo và
cán bộ tư vấn học tập phải tổ chức dữ liệu một cách khoa học rồi tiến hành trích rút
thông tin dựa theo kết quả học tập của các môn học kỳ trước đó. Để có thể hỗ trợ sinh
viên lựa chọn ngành nghề, lựa chọn môn học, hỗ trợ sau tốt nghiệp, đánh giá kết quả
học tập của sinh viên phải dựa trên cơ sở hệ thống điểm mà sinh viên đã đạt được. Đây
là cơ sở mang tính khoa học.
Để có được những đánh giá mang tính thuyết phục, thì cần phải có phương pháp
khai phá dữ liệu có hiệu quả, từ đó để đưa ra những kết luận có cơ sở khoa học, mang
nhiều ý nghĩa thực tiễn. Muốn vậy chúng ta phải có dữ liệu tương đối đầy đủ. Trên cơ
sở rút ra những luật kết hợp, tìm ra được các luật mạnh để có thể phân tích dựa trên dữ
liệu điểm sinh viên.
Hình 3.1: Trường Đại học Dân lập Hải phòng
Trong phạm vi luận văn này, tác giả sử dụng các kỹ thuật khai phá dữ liệu đối
với CSDL điểm của sinh viên trường Đại học Dân lập Hải phòng nhằm giúp cho sinh
viên có thể lựa chọn tốt môn học, ngành nghề, giúp cho cán bộ đào tạo đánh giá được
kết quả học tập của sinh viên, và hiệu quả đào tạo thông qua thuật toán Apriori đã trình
bày ở phần trước.
58
3.2. Đặc tả dữ liệu
Một đặc điểm mang tính thực tế là các item không đơn thuần chỉ được xét là “có”
hay “không” trong khi đếm support mà mỗi item được kèm theo một trọng số mô tả
mức quan trọng của item đó. Các item ta vẫn xem xét thường ở dạng Boolean. Chúng
mang giá trị là “1” nếu item có mặt trong giao dịch và “0” nếu ngược lại. Các bài toán
khai phá như trên người ta vẫn gọi là khai phá luật kết hợp kiểu Boolean (Mining
Boolean Association Rules).
Nhưng trong thực tế, các bảng số liệu thường xuất hiện các thuộc tính không đơn
giản như vậy. Các thuộc tính có thể ở dạng số (quantitative) như điểm môn lập trình
Java, điểm môn cơ sở dữ liệu, hoặc dạng phân loại (categorical) như các lớp, các
ngành...
Các bài toán khai phá luật kết hợp trên các thuộc tính như vậy gọi là khai phá
luật kết hợp định lượng (Mining Quantitative Association Rules). Cũng như các bài
toán khai phá luật kết hợp trước đây, mục tiêu của bài toán khai phá luật kết hợp định
lượng cũng là kết xuất các luật kết hợp trên các ngưỡng support tối thiểu và các
ngưỡng confidence tối thiểu.
Với các thuộc tính định lượng thì cần phải có sự phân đoạn cho các thuộc tính
này vì suy cho cùng thì khi tính support cũng cần phải kiểm tra lại nó tồn tại hay
không tồn tại trong giao dịch. Nói cách khác là cần phải thực hiện ánh xạ các thuộc
tính định lượng sang thuộc tính Boolean. Nếu các thuộc tính phân loại hoặc số lượng
chỉ có vài giá trị riêng biệt thì có thể thực hiện ánh xạ này đơn giản như sau: Mỗi thuộc
tính trong bảng dữ liệu có p giá trị riêng biệt sẽ được lập thành p thuộc tính logic mới.
Mỗi thuộc tính logic này tương ứng với một cặp (attribute, value). Nó có giá trị “1”
nếu value có mặt trong dữ liệu gốc và có giá trị “0” nếu ngược lại. Nếu số giá trị riêng
biệt của một số thuộc tính khá lớn thì người ta thực hiện phân đoạn thuộc tính thành
các khoảng và ánh xạ mỗi cặp (attribute, value) thành một thuộc tính. Sau khi ánh xạ,
có thể thực hiện khai phá luật kết hợp trên cơ sở dữ liệu mới bằng thuật toán khai phá
luật kết hợp kiểu logic.
Tổng quát, ta có thể đưa ra một số phương pháp rời rạc hoá như sau:
Trường hợp 1 : Nếu A là thuộc tính số rời rạc hoặc là thuộc tính hạng mục có
miền giá trị hữu hạng dạng {V1, V2,..., Vk} và k đủ nhỏ (<100) thì ta biến đổi thuộc
tính này thành k thuộc tính nhị phân A_V1, A_V2,..., A_Vk. Giá trị của bản ghi tại
trường A_Vi = True (hoặc 1) Nếu giá trị của bản ghi đó tại thuộc tính A ban đầu bằng
vi, Ngược lại Giá trị của A_Vi = False (hoặc 0).
59
Trường hợp 2 : Nếu A là thuộc tính số liên tục hoặc A là thuộc tính số rời rạc hay
thuộc tính hạng mục có miền giá trị hữu hạng dạng {V1, V2,..., Vp} (p lớn) thì ta sẽ
ánh xạ thành q thuộc tính nhị phân , ,..., <A :
startq.. endq>. Giá trị của bản ghi tại trường bằng True (hoặc 1) nếu
giá trị của bản ghi đó tại thuộc tính A ban đầu nằm trong khoảng [starti.. endi], ngược
lại giá trị của = False (hoặc 0).
Mã Sv Họ tên Lớp CSDL
CTDL&
GT
Java …. C++
08850 Lã Vũ Bình CT801 8 8 8 …. 7
08963 Trần Quang Lâm CT802 8 7 9 …. 7
08760 Bùi Thị Hạnh CT801 7 8 9 …. 7
08865 Trần Văn Sơn CT801 5 6 6 …. 4
07866 Nguyễn Thị Thuỳ CT701 5 7 7 … 8
07889 Trần Thị Lan CT702 9 8 9 … 8
08975 Trần Hồng Quang CT801 4 6 6 … 7
LT1011 Nguyễn Tuấn Anh LT101 6 5 7 … 7
….. …. … … … … … …
Bảng 3.2: Ví dụ CSDL điểm của sinh viên
Ví dụ: Với bảng số liệu trên đây ta có thể phân chia như sau:
Theo quy chế 25 của bộ giáo dục đào tạo mỗi sinh viên chỉ được phép thi tối đa
hai lần cho một lần học của mỗi môn học, nếu sinh viên nào qua hai lần thi vẫn chưa
đỗ thì phải học lại môn đó. Vậy ở đây nếu sinh viên nào phải thi lại thì sẽ có hai điểm
của môn học đó. Vậy đối với các sinh viên này tác giả sẽ lấy điểm cao nhất trong hai
lần thi. Thuộc tính điểm các môn là thuộc tính có nhiều giá trị, ta có thể phân thành
các khoảng, 0..5, 5..7, 7..9, 9..10. Vậy theo như bảng trên thì mỗi điểm sẽ có 4 khoảng
điểm: ở đó đặt 1 ứng với khoảng điểm (0..5), 2 ứng với khoảng [5..7), 3 ứng với
khoảng [7..9), 4 ứng với khoảng [9..10]. Như vậy, với cách ánh xạ trên, từ CSDL gốc
ban đầu, ta có CSDL dạng logic đối với môn CSDL sau đây, các môn khác tương tự
cũng chia làm 4 khoảng:
60
CSDL
Mã Sv Họ tên Lớp
1:(0..5) 2:[5..7) 3:[7..9) 4:[9..10]
08850 Lã Vũ Bình CT801 0 0 1 0
08963 Trần Quang Lâm CT802 0 0 1 0
08760 Bùi Thị Hạnh CT801 0 0 1 0
08865 Trần Văn Sơn CT801 0 1 0 0
07866 Nguyễn Thị Thuỳ CT701 0 1 0 0
07889 Trần Thị Lan CT702 0 0 0 1
08975 Trần Hồng Quang CT801 1 0 0 0
LT1011 Nguyễn Tuấn Anh LT101 0 1 0 0
….. …. … … … … …
Bảng 3.3: Dữ liệu đã chuyển đổi từ dạng số sang dạng logic
Việc ánh xạ như trên có thể xảy ra vấn đề sau:
“minsup”: Nếu số lượng khoảng cho thuộc tính số lượng (hoặc số các giá
trị riêng cho thuộc tính phân loại) là lớn thì support cho các khoảng có thể
là nhỏ. Do đó, việc chia một thuộc tính ra quá nhiều khoảng có thể làm
cho luật chứa nó không đạt được support tối thiểu.
“minconf”: Một số thông tin có thể bị mất do việc chia khoảng. Một số
luật có thể có minconf chỉ khi một item trong chúng có giá trị đơn hoặc
một khoảng rất nhỏ, do đó thông tin có thể bị mất. Sự mất mát thông tin
càng tăng khi kích thước khoảng chia càng lớn.
Như vậy, nếu kích thước khoảng là quá lớn (số khoảng nhỏ) thì có nguy cơ một
số luật sẽ không có confidence tối thiểu, còn nếu kích thước các khoảng quá nhỏ (số
khoảng lớn) thì một số luật lại có nguy cơ không có support tối thiểu.
Để giải quyết hai vấn đề trên, người ta chú ý đến tất cả các vùng liên tục trên
thuộc tính số lượng hoặc trên các khoảng đã phân đoạn. Vấn đề “minsup”sẽ được khắc
phục bằng cách liên hợp các khoảng gần kề hoặc các giá trị gần kề. Vấn đề “minconf”
sẽ được khắc phục bằng cách tăng số lượng khoảng mà không ảnh hưởng đến vấn đề
“minsup”.
61
Người ta có thể thực hiện một phương pháp đơn giản để thực hiện việc chuyển
các thuộc tính số lượng và phân loại về cùng một dạng với nhau. Với thuộc tính phân
loại, các giá trị của nó sẽ được ánh xạ vào tập các số nguyên liên tiếp. Với các thuộc
tính số lượng không cần khoảng chia (tức là có ít giá trị) thì các giá trị sẽ được ánh xạ
vào tập các số nguyên liên tiếp theo thứ tự của các giá trị đó. Còn đối với các thuộc
tính số lượng được phân khoảng, thì các khoảng sẽ được ánh xạ vào tập số nguyên liên
tiếp, trong đó thứ tự các khoảng sẽ được bảo tồn. Các ánh xạ này sẽ làm cho mỗi bản
ghi trong CSDL trở thành một tập các cặp (Attribute, Value). Bài toán khai phá luật
kết hợp lúc này có thể thực hiện qua các bước sau:
1. Xác định số lượng mỗi phần chia cho mỗi thuộc tính số lượng.
2. Với các thuộc tính phân loại, ánh xạ các thuộc tính vào tập số nguyên liên
tiếp. Với các thuộc tính số lượng không cần sự phân khoảng, ánh xạ các
giá trị của chúng vào tập các số nguyên liên tiếp theo thứ tự giá trị thuộc
tính. Với các thuộc tính số lượng đã được phân khoảng, ánh xạ các khoảng
được chia vào tập các số nguyên liên tiếp và bảo tồn thứ tự các khoảng.
Bằng cách này, thuật toán chỉ xem các giá trị hoặc các vùng giá trị như là
các thuộc tính định lượng.
3. Tìm support cho mỗi giá trị của các thuộc tính phân loại lẫn thuộc tính số
lượng, tiếp theo tìm tất cả các itemset mà support của nó lớn hơn support
tối thiểu.
4. Sử dụng các tập tìm được để sinh ra các luật kết hợp.
5. Xác định luật đáng quan tâm và kết xuất chúng.
Như vậy, khi xét trên CSDL điểm của sinh viên (giả sử với các môn học chuyên
ngành CNTT), ta có thể thực hiện phân chia thuộc tính điểm trong bảng thành các
khoảng và ký hiệu như sau:
Mã mh Tên môn học 1:(0..5) 2:[5..7) 3:[7..9) 4:[9..10]
ct1 An toàn bảo mật thông tin A1 A2 A3 A4
ct2 Anh văn chuyên ngành B1 B2 B3 B4
ct3 Bảo vệ đồ án tốt nghiệp_ Mon TN C1 C2 C3 C4
ct4 Cấu trúc dữ liệu và giải thuật D1 D2 D3 D4
ct5 Cấu trúc máy tính E1 E2 E3 E4
ct6 Chương trình dịch F1 F2 F3 F4
ct7 Cơ sở dữ liệu 1 G1 G2 G3 G4
62
ct8 Cơ sở dữ liệu 2 H1 H2 H3 H4
ct9 Công nghệ phần mềm I1 I2 I3 I4
ct10 Đồ hoạ máy tính J1 J2 J3 J4
ct11 Hệ điều hành K1 K2 K3 K4
ct12 Hệ quản trị CSDL Oracle N1 N2 N3 N4
ct13 Kỹ thuật Ghép nối máy tính M1 M2 M3 M4
ct14 Lập trình Visual Basic O1 O2 O3 O4
ct15 Lập trình ASP/PHP P1 P2 P3 P4
ct16 Lập trình C Q1 Q2 Q3 Q4
ct17 Lập trình C++ R1 R2 R3 R4
ct18 Lập trình hướng đối tượng S1 S2 S3 S4
ct19 Lập trình JAVA T1 T2 T3 T4
ct20 Lôgíc toán U1 U2 U3 U4
ct21 Lý thuyết đồ thị V1 V2 V3 V4
ct22 Mạng máy tính W1 W2 W3 W4
ct23 Mạng máy tính và truyền số liệu X1 X2 X3 X4
ct24 Mạng và hệ phân tán Y1 Y2 Y3 Y4
ct25 MATLAP và mô phỏng Z1 Z2 Z3 Z4
ct26 Otomat và ngôn ngữ hình thức Aa1 Aa2 Aa3 Aa4
ct27 Phân tích và thiết kế hệ thống Bb1 Bb2 Bb3 Bb4
ct28 Phương pháp tính Cc1 Cc2 Cc3 Cc4
ct29 Quản lý dự án CNTT Dd1 Dd2 Dd3 Dd4
ct30 Quản trị mạng Ee1 Ee2 Ee3 Ee4
ct31 Thương mại điện tử Ff1 Ff2 Ff3 Ff4
ct32 Tin học đại cương Gg1 Gg2 Gg3 Gg4
ct33 Trí tuệ nhân tạo Hh1 Hh2 Hh3 Hh4
ct34 Vi xử lý và lập trình Assembly Ii1 Ii2 Ii3 Ii4
ct35 Xử lý ảnh Jj1 Jj2 Jj3 Jj4
63
Bảng 3.4: Bảng ký hiệu tên các môn học
Sơ đồ quan hệ để lưu trữ dữ liệu điểm của sinh viên như sau:
Hình 3.5: Sơ đồ quan hệ CSDL điểm sinh viên
3.3. Chương trình thử nghiệm minh họa
Đẻ thử nghiệm một số khía cạnh lí thuyết liên quan đến khai phá dữ liệu, luận
văn thực hienẹ chương trình minh họa. Chương trình cài đặt trên ngôn ngữ C#, CSDL
thiết kế trên SQL Server 2005, hệ điều hành WindowsXP, chip máy tính Pentium IV
1.7 GHz, RAM 512 MB, ổ cứng 80 GB còn trống gần 7 GB. Chương trình có một số
giao diện chính sau:
Hình 3.6: Giao diện chương trình chính
64
Hình 3.7: Phần kết nối CSDL
Hinh 3.8: Form cập nhật điểm sinh viên
Hình 3.9: Form cập nhật thêm sinh viên
65
Hình 3.10: Phần dữ liệu đã được mã hoá
Hình 3.11: Phần tạo luật kết hợp dùng thuật toán Apriori
66
Hình 3.12: Phần mô phỏng thuật toán với dữ liệu nhập vào từ bàn phím
3.4. Kết luận
Chương trình thực hiện tìm các tập phổ biến và luật kết hợp thông qua thuật toán
Apriori. Từ các luật kết hợp thu được từ chương trình ta có thể tìm ra các luật mạnh
phục vụ cho công tác đào tạo, hỗ trợ cho sinh viên lựa chọn môn học, ngành nghề.
Để xác định độ Support của các tập ứng viên, thuật toán Apriori luôn luôn phải
quét lại toàn bộ các giao dịch trong CSDL. Do vậy sẽ tiêu tốn rất nhiều thời gian khi
số k-items tăng (số lần xét duyệt các giao dịch tăng).
Hướng phát triển
Tiếp tục hoàn thiện và mở rộng chương trình trong luận văn này để có thể áp
dụng vào thực tế toàn diện hơn. Mở rộng khai phá luật kết hợp với dữ liệu đầu vào
rộng hơn, không chỉ dừng lại ở điểm của sinh viên mà còn có thể là các yếu tố khác
như: chuyên ngành về mạng máy tính thì sau khi ra trường có thể dễ xin việc hơn nên
có nhiều sinh viên đăng ký học ngành này hơn. Xây dựng thêm phần tiền xử lý dữ liệu.
Các tệp CSDL khác nhau như: Microsoft Access, Foxpro, Oracle… đều có thể chuyển
về một dạng thống nhất để chương trình xử lý được.
Nghiên cứu sâu các thuật toán khai phá dữ liệu, và áp dụng vào một số bài toán
khai phá dữ liệu phù hợp với giai đoạn hiện nay: dự báo dân số, bệnh dịch, thời tiết,
định hướng trong kinh doanh …
67
KẾT LUẬN
Khai phá dữ liệu là một lĩnh vực vẫn còn khá mới mẻ, lý thú. Luận văn đã trình
bày, một số vấn đề cơ bản nhất, các phương pháp cơ bản để khai phá dữ liệu, đặc biệt
trình bày chi tiết, làm rõ vấn đề khai phá luật kết hợp. Phương pháp khai phá dữ liệu
có thể là: phân lớp, hồi quy, cây quyết định, suy diễn, quy nạp, K- láng giềng gần, …
các phương pháp trên có thể áp dụng trong dữ liệu thông thường và trên tập mờ.
Bài toán khai phá luật kết hợp là bài toán khó. Luận văn đã trình bày thuật toán
khai phá kinh điển Apriori và các thuật toán mới hiệu quả nhất (Apriori_Tid, Setm,
Ais, Charm). Một cách tiếp cận khai phá luật kết hợp đảm bảo không dư thừa các luật
và cho hiệu quả khai phá cao là dựa trên tập đóng. Thuật toán khai phá hiệu quả điển
hình là thuật toán CHARM.
Kết quả xây dựng chương trình thử nghiệm dựa trên thuật toán Apriori nhằm mô
phỏng rõ hơn về khai phá dữ liệu bằng luật kết hợp. Chương trình ứng dụng vào bài
toán dự báo kết quả học tập của sinh viên, hỗ trợ sinh viên lựa chọn môn học, lựa chọn
ngành học, hỗ trợ cho cán bộ đào tạo đưa ra định hướng đào tạo trong các năm tiếp
theo.
68
PHỤ LỤC
Lớp Apriori
public class Apriori
{
//Mang danh sach cac tap phan tu luu trong cac tap muc pho bien
protected ItemsetArrayList itemsetsFrequentCollection;
//Mang danh sach cac phan tu luu trong tap muc cac ung cu
protected ItemsetArrayList itemsetsCandidateCollection;
//Xay dung lop Apriori
public Apriori()
{
this.itemsetsCandidateCollection = new ItemsetArrayList();
this.itemsetsFrequentCollection = new ItemsetArrayList();
}
public void OnProgressMonitorEvent(ProgressMonitorEventArgs e)
{
if (ProgressMonitorEvent != null)
{
ProgressMonitorEvent(this, e);
}
}
public event ProgressMonitorEventHandler ProgressMonitorEvent;
protected DataRow[] FindItems(string find, DataTable data)
{
return data.Select(find);
}
protected int FindItems(string find, string data)
{
string[] splitstring = data.Split(new Char[] { ',' });
int length = splitstring.Length;
int countFound = 0;
string[] found = new string[length];
for (int counter = 0; counter < length; counter++)
{
found[counter] = splitstring[counter].Trim();
}
foreach (string member in found)
{
if (member == find)
{
countFound++;
}
}
return countFound;
}
//Mang danh sach cac tap muc
protected int FindItems(ItemsetArrayList find, string data)
69
{
string[] splitstring = data.Split(new Char[] { ',' });
int length = find.Count;
string[] found = new string[splitstring.Length];
int minimumValue = 0;
int[] search = new int[length];
for (int counter = 0; counter < splitstring.Length; counter++)
{
found[counter] = splitstring[counter].Trim();
}
for (int count = 0; count < length; count++)
{
foreach (string member in found)
{
if (member == (string)find[count])
{
search[count]++;
}
}
}
switch (length)
{
case 0:
{
minimumValue = 0;
break;
}
case 1:
{
minimumValue = search[0];
break;
}
default:
{
for (int counter = 0; counter < search.Length; counter++)
{
if (counter == 0)
{
minimumValue = search[counter];
}
else
{
if (search[counter] < minimumValue)
{
minimumValue = search[counter];
}
}
70
}
break;
}
}
return minimumValue;
}
//Tinh Support cua 1 tap muc trong CSDL
public int SupportCount(string find, Database Transactions_Data)
{
int count = 0;
DataTable datatable = Transactions_Data.Transactions.Tables[0];
foreach (DataRow datarow in datatable.Rows)
{
count = count + FindItems(find, (datarow["Transactions"]).ToString());
}
return count;
}
//Lay gia tri Support cua 1 tap muc
public int SupportCount(ItemsetArrayList find, Database transactionsData)
{
int count = 0;
int total = 0;
DataTable dataTable
=transactionsData.Transactions.Tables["TransactionTable"];
foreach (DataRow datarow in dataTable.Rows)
{
count = this.FindItems(find, (datarow["Transactions"]).ToString());
total = count + total;
}
return total;
}
//Tao tap cac tap muc tu CSDL cua cac giao
[ReservedAttribute(false, "December 25, 2002")]
public ItemsetCandidate CreateOneItemsets(Database dataBase)
{
DataTable dataTable = dataBase.Transactions.Tables["TransactionTable"];
ItemsetCandidate candidateItemset = new ItemsetCandidate();
ItemsetArrayList uniqueItems = new ItemsetArrayList(1); ;
ItemsetArrayList candidateItems;
ItemsetArrayList items;
StringBuilder item = new StringBuilder(10);
int itemSupportCount = 0;
int counter = 1;
string msg = "Creating One Itemsets";
ProgressMonitorEventArgs e = new ProgressMonitorEventArgs(1, 100, 80,
"Apriori.CreateOneItemsets(Database)", msg);
this.OnProgressMonitorEvent(e);
foreach (DataRow dataRow in dataTable.Rows)
71
{
item.Append(dataRow["Transactions"].ToString());
if (counter < (dataTable.Rows.Count))
{
item.Append(", ");
counter++;
}
}
candidateItems =
ItemsetArrayList.ConvertToItemsetArrayList(item.ToString(), new Char[] { ',' });
for (int count = 0; count < candidateItems.Count; count++)
{
item = new StringBuilder(10);
item.Append(((string)candidateItems[count]).Trim());
if (!(item.ToString() == ""))
{
if (!uniqueItems.Contains(item.ToString()))
{
itemSupportCount = this.SupportCount(item.ToString(), dataBase);
dataBase.AddItemset(item.ToString(), 1, itemSupportCount);
items = new ItemsetArrayList(1);
uniqueItems.Add(item.ToString());
items.Add(item.ToString());
items.Level = 1;
items.SupportCount = itemSupportCount;
items.TrimToSize();
candidateItemset.Items.Add(items);
}
}
}
candidateItemset.Items.TrimToSize();
candidateItemset.Level = 1;
return candidateItemset;
}
//Lop Apriori_Gen
public void AprioriGenerator(ItemsetCandidate Candidate_Itemset, Database
TransactionsData, int minimum_support)
{
string start = "Generating Level " + Candidate_Itemset.Level + " Candidates : "
+ Candidate_Itemset.Items.Count + " Items";
ProgressMonitorEventArgs e = new ProgressMonitorEventArgs(1, 100, 25,
"Apriori.AprioriGenerator()", start);
this.OnProgressMonitorEvent(e);
//Them 1 tap muc ung cu vien vao tap cac tap muc ung cu vien
ItemsetCandidate candidateItemset =
this.JoinCandidateItemsets(Candidate_Itemset, TransactionsData, minimum_support);
if (candidateItemset.Items.Count > 0)
{
72
this.AprioriGenerator(candidateItemset, TransactionsData,
minimum_support);
}
string done = "Finished Generating Candidate Itemsets ";
e = new ProgressMonitorEventArgs(1, 100, 70, "Apriori.AprioriGenerator()",
done);
this.OnProgressMonitorEvent(e);
}
//tap muc ung cu vien
protected ItemsetCandidate GenerateFrequentItemsets(ItemsetCandidate
candidateItemset, int minimum_support)
{
ItemsetCandidate itemsetFrequent = new ItemsetCandidate();
foreach (ItemsetArrayList itemsFrequent in candidateItemset.Items)
{
if (itemsFrequent.SupportCount >= minimum_support)
{
itemsetFrequent.Items.Add(itemsFrequent);
}
}
itemsetFrequent.Items.Capacity = itemsetFrequent.Items.Count;
return itemsetFrequent;
}
//Kiem tra neu 1 phan tap muc co 1 tap muc con pho bien
protected bool HasInfrequentSubSet()
{
throw new Exception("This is a reserved attribute! Do not use it");
}
public ItemsetArrayList ItemsetsFrequentCollection
{
get
{
return itemsetsFrequentCollection;
}
set
{
itemsetsFrequentCollection.Add(value);
}
}
//Lua chon tap cac ung cu vien
public ItemsetArrayList ItemsetsCandidateCollection
{
get
{
return itemsetsCandidateCollection;
}
set
{
73
itemsetsCandidateCollection.Add(value);
}
}
//Tao 1 tap muc bang 1 tap muc ung cu vien
public ItemsetCandidate JoinCandidateItemsets(ItemsetCandidate
candidate_itemset, Database transactionsData, int minimumSupport)
{
//neu so tap muc bang 0
if (candidate_itemset.Items.Count == 0)
{
throw new Exception("cannot join items : no items are present!");
}
else
{
ItemsetArrayList copy_candidate_itemset = candidate_itemset.Items;
ItemsetCandidate new_candidate_itemset = new ItemsetCandidate();
new_candidate_itemset.Level = candidate_itemset.Level + 1;
//thanh phan cua 1 tap muc cua k phan tu duoc ket noi
//neu (k-2) phan tu dau tien tham gia vao ket noi
int count_common_items = (new_candidate_itemset.Level - 2);
foreach (ItemsetArrayList itemset in candidate_itemset.Items)
{
int count_members = 0;
foreach (ItemsetArrayList copy_itemset in copy_candidate_itemset)
{
bool join_items = true;
for (count_members = 0; count_members < count_common_items;
count_members++)
{
if (itemset[count_members] != copy_itemset[count_members])
{
join_items = false;
break;
}
}
If
(itemset[count_common_items].ToString().CompareTo(copy_itemset[count_common
_items].ToString()) != -1)
{
join_items = false;
}
if (join_items == true)
{
ItemsetArrayList new_itemset = new ItemsetArrayList(1);
for (count_members = 0; count_members <= count_common_items;
count_members++)
{
if (itemset[count_members] == copy_itemset[count_members])
74
{
new_itemset.Add(itemset[count_members]);
}
else
{
new_itemset.Add(itemset[count_members]);
new_itemset.Add(copy_itemset[count_members]);
}
}
new_itemset.Capacity = new_itemset.Count;
//lay ra support cho moi tap muc
new_itemset.SupportCount = this.SupportCount(new_itemset,
transactionsData);
new_itemset.Level = new_candidate_itemset.Level;
itemset.Capacity = itemset.Count;
//Them tap muc vao bang cac tap muc
transactionsData.AddItemset(new_itemset, ",");
//Khong them cac tap muc neu co support < minsupp
if (new_itemset.SupportCount >= minimumSupport)
{
new_candidate_itemset.Items.Add(new_itemset);
}
}
}
}
new_candidate_itemset.Items.Capacity =
new_candidate_itemset.Items.Count;
return new_candidate_itemset;
}
}
//Tao tap cac luat tu cac tap muc
public void CreateItemsetRuleset(ItemsetArrayList parentRuleset,
ItemsetArrayList leftRuleset, ItemsetArrayList rightRuleset, Database
transactionsData)
{
//Tao va them 1 luat ket hop vao CSDL
transactionsData.AddRuleset(parentRuleset, leftRuleset, rightRuleset);
}
public void CreateItemsetSubsets(int Level, ItemsetArrayList itemSubset,
ItemsetArrayList parentItemset, Database transactionsData)
{
int length = 0;
ItemsetArrayList childSubset = new ItemsetArrayList(1);
ItemsetArrayList rulesItemset;
if (itemSubset.Count > Level)
{
foreach (ItemsetArrayList item in itemSubset)
{
75
ItemsetArrayList[] subsets = this.CreateItemsetSubsets(item);
if (parentItemset == null)
{
parentItemset = item;
}
if (subsets != null)
{
length = subsets.Length;
}
else
{
break;
}
for (int count = 0; count < length; count++)
{
//them tap muc va tap con vao bangAdd the itemset and the subset to
the subsets table
transactionsData.AddSubset(item, subsets[count]);
childSubset.Add(subsets[count]);
//Tao 1 tap muc co support, conf va luat ket hop
rulesItemset = (parentItemset - subsets[count]);
this.CreateItemsetRuleset(parentItemset, subsets[count], rulesItemset,
transactionsData);
}
}
childSubset.TrimToSize();
this.CreateItemsetSubsets(0, childSubset, parentItemset, transactionsData);
}
}
public ItemsetArrayList[] CreateItemsetSubsets(ItemsetArrayList itemSubset)
{
int length = itemSubset.Count;
ItemsetArrayList[] subset = new ItemsetArrayList[length];
switch (length)
{
case 0:
{
subset = null;
break;
}
case 1:
{
subset = null;
break;
}
default:
{
subset[0] = new ItemsetArrayList(1);
76
for (int count = 0; count < (length - 1); count++)
{
subset[0].Add(itemSubset[count]);
}
subset[0].TrimToSize();
subset[1] = new ItemsetArrayList(1);
for (int count = 1; count < (length); count++)
{
subset[1].Add(itemSubset[count]);
}
subset[1].TrimToSize();
for (int count = 1; count < (length - 1); count++)
{
int position = 0;
subset[(count + 1)] = new ItemsetArrayList(1);
subset[(count + 1)].Add(itemSubset[position]);
for (position = 1; position < length; position++)
{
if (position != count)
{
subset[(count + 1)].Add(itemSubset[position]);
}
}
subset[(count + 1)].TrimToSize();
}
break;
}
}
return subset;
}
}
}
77
TÀI LIỆU THAM KHẢO
Tiếng Việt
[1]. Thái Nguyên (29 – 31 tháng 8 năm 2003), Một số vấn đề chọn lọc của công
nghệ thông tin, Nhà xuất bản Khoa học Kỹ thuật.
[2]. Nguyễn Công Cường, Nguyễn Doãn Phước (2001), Hệ mờ, mạng nơron và
ứng dụng - NXB Khoa học Kỹ thuật.
[3] Nguyễn Văn Vỵ (2006), Phân tích thiết kế hệ thống, NXB. Đại học Quốc gia
Hà Nội.
[4]. Đỗ Trung Tuấn (1999), Cơ sở dữ liệu, Nhà xuất bản Giáo dục.
[5]. Nguyễn Đình Thúc (1998), Mạng nơron, Nhà xuất bản Giáo dục.
Tiếng Anh
[6]. John Wiley & Sons (2003) - Data Mining-Concepts Models Methods And
Algorithms, Copyright © 2003 The Institute of Electrical and Electronics Engineers,
Inc.
[7]. Bao Ho Tu (1998), Introduction to Knowledge Discovery and Data mining,
Institute of Information Technology National Center for Natural Science and
Technology.
[8]. Jean – Marc Adamo (2001), Data Mining for Association Rules and
Sequential Patterns, Sequential and Parallel Algorithms, Springer – Verlag New
York, Inc.
[9]. Mohammet J. Zaki and Chin Jui Hasiao CHAM, An efficient Algorithm for
Close Itemset Mining.
[10]. Jean-Marc Adamo (2001), Data Mining for Association Rule and
Sequential Pattens, With 54 Illustrations. ISBN0-95048-6.
[11]. John Wiley & Son, Visual Data Mining: Techniques and Tools for Data
Visualization and Mining, by Tom Soukup and Ian Davidson, ISBN: 0471149993.
[12]. John Wiley & Sons (2003), Data Mining: Concepts, Models, Methods, and
Algorithms, by Mehmed Kantardzic, ISBN:0471228524.
[13]. W. H. Inmon, R. D. Hackthon, Using the Data Warehouse, A Wiley-QEA
Publication.
[14]. J.R. Quinlan (1986), Introduction of Decision Trees. Machine learning 1,
Kluwer Academic Press,81-106.
78
Địa chỉ trang Web
[15]
[16]
[17]
[18]
[19]
es-4spp.pdf
Các file đính kèm theo tài liệu này:
- LUẬN VĂN-PHÁ DỮ LIỆU ỨNG DỤNG TRONG ĐÀO TẠO.pdf