Nhóm thuật tốn duyệt theo chiều sâu

Một phần của tài liệu Phát triển thuật toán khai phá luật kết hợp dựa vào sự phân lớp dữ liệu (Trang 29 - 36)

CHƯƠNG 1 TỔNG QUAN VỀ KHAI PHÁ DỮ LIỆU

1.4 KHAI PHÁ LUẬT KẾT HỢP

1.4.3 Nhóm thuật tốn duyệt theo chiều sâu

Để giải quyết hai hạn chế trong nhóm thuật tốn duyệt theo chiều rơng,

Nhóm thuật tốn duyệt theo chiều sâu chuyển tồn bộ dữ liệu vào bộ nhớ trong thành cấu trúc cây, quá trình tìm tập thường xuyên là q trình duyệt cây.

1.4.3.1 Thuật tốn FP_ Tree (Frequent Pattern Tree)

Thuật tốn FP_Tree do nhóm nghiên cứu của Jiawei Han trường đại học

Illinois Hoa Kỳ đề xướng năm 2000 [14]. FP_Tree là một cột mốc mới trong

sự phát triển khai phá luật kết hợp, nó giải quyết được hai điểm nút trong nhóm thuật tốn duyệt theo chiều rộng. Những tập mục dữ liệu thường xuyên được phát hiện với hai lần duyệt cơ sở dữ liệu và khơng có q trình phát sinh các tập ứng viên. FP_Tree là thuật toán chạy nhanh hơn thuật toán Apriori.

Quá trình phát hiện các tập mục dữ liệu thường xuyên bao gồm hai bước: Xây dựng FT_Tree và phát hiện các tập mục dữ liệu thường xuyên từ FP_Tree.

a) Xây dựng FP_Tree

Mục tiêu của việc xây dựng FP_Tree là đưa toàn bộ dữ liệu vào bộ nhớ trong. FP_Tree là một cây đa cấp không đầy đủ. Mỗi nút của cây gồm hai phần: Item_name chứa tên một mục dữ liệu, Item_count chứa số lần duyệt qua nút này khi xây dựng cây. Số nhánh tại các nút không bằng nhau. Nút gốc R của cây là nút đặc biệt: R.Item_name = ∅ và R.Item_count = 0.

Bước 1: Duyệt cơ sở dữ liệu lần thứ nhất để tính độ hỗ trợ cho mỗi mục dữ

liệu, tìm ra được danh sách các mục dữ liệu thường xuyên và sắp xếp chúng theo thứ tự giảm dần của độ hỗ trợ (hình 1.7.b).

Bước 2: Tạo cây:

• Tạo ra nút gốc R của FP_Tree, gắn nhãn Root.

• Duyệt cơ sở dữ liệu lần thứ hai, ứng với mỗi giao tác:

- Lọc ra những mục dữ liệu thường xuyên thành danh sách L và sắp xếp L theo thứ tự giảm dần của độ hỗ trợ tính ở bước 1.

- Nếu L ≠ ∅, phân L thành [x | L1], với x là mục dữ liệu đầu tiên

trong L, gọi hàm Insert([x | L1], R).

Hàm Insert([x | L], R) làm việc như sau: Nếu nút R có một nút con Q sao

cho Q.Item_name = x thì Q.Item_count := Q.Item_count +1, ngược lại, tạo một nút Q mới là con của nút R và gán Q.item_name := x và Q.Item_count := 1. Nếu L ≠ ∅,

gọi đệ quy Insert([y | L1], Q) với y là thuộc tính đầu của L và L1 là phần cịn lại.

b) Tìm tập thường xuyên

Thủ tục FP_Growth duyệt qua cây để sinh ra tập những tập mục dữ liệu thường xuyên. Xem chi tiết thủ tục này trong [14].

Chạy thuật toán FP_Tree với dữ liệu cho ở bảng 1.1 với S0 = 2:

tid Những MDL TX 1 MDL Độ hỗ trợ tid Tập MDL có thứ tự t1 A, B, E B 7 t1 B, A, E t2 B, D A 6 t2 B, D t3 B, C C 6 t3 B, C t4 A, B, D D 2 t4 B, A, D t5 A, C E 2 t5 A, C t6 B, C t6 B, C t7 A, C t7 A, C t8 A, B, C, E t8 B, A, C, E t9 A, B, C t9 B, A, C

(1.7.a) Dữ liệu gốc (1.7.b) L1 (1.7.c) DL đã biến đổi

a) Tạo cây

Hình 1.8 FP_Tree của dữ liệu bảng 1.1

Hình 1.9 Thành phần của FP_Tree b) Chạy thủ tục FP_Growth b) Chạy thủ tục FP_Growth xj1:Cj1 xj2:Cj2 xjk:Cjk xij 1:Cij 1 Thân xsj 1:Csj 1 xij 2:Cij 2 xsj 2:Csj 2 Cành A:4 Đầu bảng Mục DL Đầu của các nút kết nối B A C D E Root B:7 A:2 C:2 D:1 E:1 C:2 E:1 D:1 C:2

1. Gọi đệ quy FP_Growth(Pt1, ∅): Có thân: (B:7) và ba nhánh con Pt11:

(A:4)…, Pt12:(C:2) và Pt13:(D:1). Thân (B:7) chỉ có một nút nên được tập mục dữ

liệu FP_Set(Pt1)={(B:7)}.

2. Gọi đệ quy FP_Growth(Pt11, ∅): Có thân: (A:4) và ba nhánh con Pt111:

(E:1)…, Pt112:(C:2) …. Và Pt113: (D:1). Thân (A:4) chỉ có một nút nên được tập

mục dữ liệu FP_Set(Pt11)={(A:4)}.

3. Gọi đệ quy FP_Growth(Pt111, ∅): Có thân: (E:1) và khơng có nhánh con.

Thân (E:1) chỉ có một nút nên được tập mục dữ liệu trả về: FP_Set(Pt111)={(E:1)}. 4. Gọi đệ quy FP_Growth(Pt112, ∅): Có thân: {(C:2), (E:1)} và khơng có

nhánh con. Thân {(C:2), (E:1)} có hai nút nên được tập mục dữ liệu trả về: FP_Set(Pt112)={(C:2), (E:1), (CE:1)}.

5. Gọi đệ quy FP_Growth(Pt113, ∅): Có thân: {(D:1)} và khơng có nhánh con nên được tập mục dữ liệu trả về: FP_Set(Pt113)={(D:1)}.

Có ba nhánh con: Pt111, Pt112 và Pt113:

β1 = FP_Set(Pt111) ∪ FP_Set(Pt112) ∪ FP_Set(Pt113)= {(C:2), (E:2), (D:1), (CE:1)}.

Trả về: β2 = FP_Set(Pt11) ∪ β1 ∪ {FP_Set(Pt11) x β1}

= {(A:4), (C:2), (E:2), (D:1), (CE:1), (AC:2), (AE:2), (AD:1), (ACE:1)}. 6. Gọi đệ quy FP_Growth(Pt12, ∅): Có thân: (C:2) và khơng có nhánh con.

Thân (C:2) chỉ có một nút nên trả về tập mục dữ liệu FP_Set(Pt12)={(C:2)}.

7. Gọi đệ quy FP_Growth(Pt13, ∅): Có thân: (D:1) và khơng có nhánh con.

Thân (D:1) chỉ có một nút nên trả về tập mục dữ liệu FP_Set(Pt12)={(D:1)}.

Hợp ba nhánh con Pt11, Pt12 và Pt13:

β3 = FP_Set(Pt11) ∪ FP_Set(Pt12) ∪ FP_Set(Pt13)=

= {(A:4), (C:4), (D:2), (E:2), (CE:1), (AC:2), (AE:2), (AD:1), (ACE:1)}.

= {(B:7), (A:4), (C:4), (D:2), (E:2), (CE:1), (AC:2), (AE:2), (AD:1), (ACE:1), (BA:4), (BC:4), (BE:2), (BD:2), (BCE:1), (BAC:2), (BAE:2), (BAD:1), (BACE:1)}.

8. Gọi đệ quy FP_Growth(Pt2, ∅): Có thân: {(A:2),(C:2)} và khơng có nhánh

con. nên trả về tập mục dữ liệu FP_Set(Pt2)={(AC:2), (A:2), (C:2)}. FP_Growth(Root, ∅) trả về:

FP_Set = β4 ∪ FP_Set(Pt2) = {(B:7), (A:6), (C:6), (D:2), (E:2), (CE:1),

(AC:4), (AE:2), (AD:1), (ACE:1), (BA:4), (BC:4), (BE:2), (BD:2), (BCE:1), (BAC:2), (BAE:2), (BAD:1), (BACE:1)}.

Từ tập FP_Set ta lọc ra các tập mục dữ liệu thường xuyên là:

FP = {A, B, C, D, E, AC, AE, BA, BC, BE, BD, BAC, BAE}.

Dựa vào bảng dữ liệu đầu của các mục dữ liệu và cây FP_Tree, có thể tìm ra dễ dàng tập các mục dữ liệu thường xuyên và cũng dễ dàng tìm ra tập tất cả các tập mục dữ liệu thường xuyên chứa một mục dữ liệu cho trước. Ví dụ, với E, ta có các nhánh chứa nó: {B→A→E} và {B→A→C→E}.

Thuật tốn FP_Tree có hiệu quả trong tính tốn vì ba lý do sau đây. Thứ nhất, quá trình giải bài toán chỉ xét trên những mục dữ liệu thường xuyên, các

mục dữ liệu khơng thường xun bị cắt bỏ, do đó dữ liệu xét sẽ nhỏ hơn nhiều.

Thứ hai là thuật toán này chỉ duyệt cơ sở dữ liệu hai lần. Thứ ba là, FP_Tree sử

dụng phương pháp "chia để trị" để làm giảm đáng kể kích thước của cây, một nhánh dài được sinh ra bằng nối thêm mục dữ liệu vào một nhánh ngắn, không phải làm lại từ đầu.

1.4.3.2 Thuật toán RARM (Rapid Association Rule Mining)

Việc đưa toàn bộ dữ liệu vào bộ nhớ trong để xây dựng FP_Tree là không thể thực hiện được với dữ liệu lớn. Năm 2001, Amitabha Das và đồng nghiệp ở trường Đại học Nangyang, Singapore công bố thuật toán RARM [8], là phương pháp khai phá luật kết hợp sử dụng cấu trúc cây để biểu diễn cơ sở dữ liệu gốc và phát sinh các ứng viên trong quá trình xử lý.

RARM dùng cấu trúc cây SOTrieIT (Support Ordered Trie Itemset Tree) chỉ có hai mức như sau: Một gốc có nhãn Root và có n nhánh (n là số mục dữ liệu). Mỗi nút mức 1 trên mỗi nhánh ứng với mỗi mục dữ liệu gồm hai trường: Tên nút là tên của mục dữ liệu và số đếm là số lần xuất hiện của mục dữ liệu này trong cơ sở dữ liệu. Nút mức 2 cũng gồm hai trường: Tên nút là tên của mục dữ liệu cùng xuất hiện trong một giao tác với mục dữ liệu của nút mức 1 và số đếm là số lần cùng xuất hiện với mục dữ liệu ở nút mức 1 trong một giao tác.

Hình 1.10 Cấu trúc cây SOTrieIT

Thuật tốn RARM tìm các tập mục dữ liệu thường xuyên theo các bước: Đầu tiên tạo SOTrieIT cho tất cả các mục dữ liệu, sau đó dùng thủ tục RARM để tìm tập mục dữ liệu thường xuyên theo ngưỡng S0 tùy ý.

Tạo SOTrieIT

SOTrieIT được tạo theo các bước:

Bước 1: Tạo nút gốc Root và n nút mức 1 ứng với n mục dữ liệu, gán số đếm

Bước 2: Duyệt qua cơ sở dữ liệu, ứng với mỗi giao tác, ta thực hiện:

- Duyệt qua các nút mức 1 của cây, tăng số đếm lên 1 tại những nút có mục dữ liệu xuất hiện trong giao tác.

- Tổ hợp các mục dữ liệu trong giao tác thành các cặp 2 mục dữ liệu, các phần tử trong cặp được xếp theo thứ tự xuất hiện trong danh mục các mục dữ liệu. Chèn từng cặp 2 mục dữ liệu này vào cây như sau: Tìm nút mức 1 có tên là tên mục dữ liệu thứ nhất trong cặp, xem tại nút này có nút con mức 2 có mục dữ liệu trùng với mục dữ liệu thứ hai trong cặp hay khơng. Nếu đã có thì tăng số đếm của nút con này lên 1, ngược lại, tạo một nút con mức 2, gán mục dữ liệu là mục dữ liệu thứ hai và có số đếm là 1.

Bước 3: Sắp xếp lại cây: Các nút mức 1 từ trái sang phải theo thứ tự giảm

dần của số đếm của mục dữ liệu. Trên mỗi nhánh con, sắp xếp các nút mức 2 từ trái sang phải theo thứ tự giảm dần của số đếm của mục dữ liệu.

Với dữ liệu ở bảng 1.1, tạo được cây SOTrieIT như sau:

Hình 1.11 SOTrieIT của dữ liệu ở bảng 1.1

Thủ tục RARM

Thủ tục RARM tìm các tập mục dữ liệu thường xuyên qua hai bước.

Root B:7 A:6 C:6 D:2 E:2 C:4 E:3 D:2 B:4 C:4 E:2 D:1 E:1

xuyên và độ hỗ trợ là mục dữ liệu và số đếm của nút. Duyệt trên các nút mức 2, bắt đầu từ nút trái nhất, nếu tại nút có số đếm lớn hơn ngưỡng thì trích ra tập mục dữ liệu có 2 phần tử gồm phần tử tại nút và phần tử ở nút mức 1 tương ứng, độ hỗ trợ của tập này là số đếm ở nút mức 2. Tiếp tục các nút bên phải cho đến khi gặp một nút có số đếm nhỏ hơn ngưỡng hay hết nút. Việc duyệt trên nút mức 1 cũng từ trái sang phải cho đến khi gặp một nút có số đếm nhỏ hơn ngưỡng hay hết nút.

Bước 2: Từ tập các tập thường xuyên có 1 và 2 mục dữ liệu, dùng thuật tốn

Apriori để tìm ra các tập thường xun có nhiều hơn 2 mục dữ liệu.

Thuật tốn RARM có thể lưu SOTrieIT ra bộ nhớ ngồi vào khơi phục lại cây khi cần thiết. Khi dữ liệu gia tăng, có thể thêm dữ liệu vào cây và sắp xếp lại. Thuật toán này giải quyết được vấn đề dữ liệu gia tăng, tuy nhiên việc tìm các tập mục dữ liệu thường xuyên có hơn 2 mục dữ liệu thì gặp lại vấn đề của Apriori là có thể bùng nổ tập ứng viên và số lần duyệt cơ sở dữ liệu.

Một phần của tài liệu Phát triển thuật toán khai phá luật kết hợp dựa vào sự phân lớp dữ liệu (Trang 29 - 36)

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

(63 trang)