Thuật toán Apriorid

Một phần của tài liệu Hỗ trợ hệ chuyên gia cho khai phá luật kết hợp (LV01063) (Trang 33 - 39)

2.1.3.1 Giới thiệu thuật toán

Thuật toán Apriori do R.Agrawal và R.Srikant đƣa vào năm 1944, nó là nền tảng cho việc phát triển các thuật toán sau này.

Thuật toán Apriori sinh ra các tập mục ứng cử từ các tập mục phổ biến trƣớc đó, nghĩa tìm ứng cử của k- tập mục phổ biến dựa vào (k-1)- tập mục, (k-2)- tập,…trƣớc k trong khi duyệt cơ sở dữ liệu. Apriori dựa vào phƣơng pháp tỉa để bỏ đi các tập mục X có sup(X) < minsup cho trƣớc. Cơ sở của của kỹ thuật này là tính chất của các tập phổ biến: “Mọi tập con của tập phổ biến đều là tập phổ biến”. Vì vậy các các tập ứng cử (vào tập mục phổ biến) gồm k mục có thể đƣợc sinh ra bằng cách nối tất cả các tập mục đã đƣợc sinh ra trƣớc đó và loại bỏ các tập ứng cử viên nếu nó có chứa tập con không phổ biến.

Giả sử các mục trong các giao dịch đƣợc lƣu theo thứ tự từ điển. Ký hiệu

Lk là tập các tập phổ biến có k hạng mục (mỗi phần tử của nó đều hai đối tƣợng: là tập mục và độ hỗ trợ của tập mục đó.

Ck phần tử ứng cử viên hai đối tƣợng: là tập mục và độ hỗ trợ của tập mục đó.

Quá trình khai phá gồm hai bƣớc: kết nối và tỉa

Bước nối:

Để tìm Lk là tập các tập ứng cử viên có k mục đƣợc sinh ra bởi việc nối Lk-1 với chính nó. l1 và l2 Lk-1 đƣợc nối nếu:

l1[1] == l2[1] And l1[2]==l2[2] And… And l1[k-2] = l2[k-2]

And l1[k-1] < l2[k-1]

Dạng của tập mục nhận đƣợc bởi nối l1 và l2 là: l1[1] l1[2] …. l1[k-2] l1[k-1] l2[k-1]

Bước tỉa:

Giả sử Ck chứa Lk, tức là các thành phần của Ck có thể là phổ biến hoặc không, nhƣng tất cả các tập phổ biến k mục đều thuộc Ck điều này làm cho

Card(Ck) sẽ rất lớn nên khối lƣợng tính toán sẽ lớn. Dựa vào tính chất “Mọi tập con của tập phổ biến đều là tập phổ biến” chúng ta có thể bỏ đi ứng cử viên trong Ck nếu nó có tập mục mà tập mục này không có mặt trong Lk-1. Việc duyệt các tập có k-1 mục sẽ rất nhanh bởi thuật toán luôn duy trì cây băm của tất cả các tập mục phổ biến đã tìm đƣợc.

2.1.3.2 Thuật toán Apriori

Thuật toán tìm các tập mục phổ biến dựa trên cơ sở sinh ứng cử viên Input: CSDL D, độ hỗ trợ minsup.

Output: Tập các tập mục phổ biến L trong D. Method:

1. Tìm tập mục phổ biến 1 mục L1 = {Các tập phổ biến 1 mục}; 2. For (k=2 ; Lk-1 != ; k++)

3. Do Begin(1) {Ck = apriori_gen(Lk-1, minsup); //Sinh các ứng cử mới Ck từ Lk-1 4. For (Each t In D)

5. Do Begin(2)

6. Ct= Subset (Ck, t); // ứng cử viên đƣợc chứa trong giao dịch t 7. For (Each c In Ct) c.count ++ ; // tăng 1 cho số đếm c 8. End (2);

9. Lk = {c in Ck | c.count minsup);

10. End(1)

11. L = k Lk

//______Sinh ứng cử viên mới hàm apriori_gen ________ Input: Tập k-1 tập mục phổ biến Lk-1, minsup Output: Tập k các tập ứng cử viên Ck

Method:

Void apriori_gen(Lk-1, minsup) // Bƣớc nối

1. For (Each (k-1) itemset l1 In Lk-1 Do 2. For (Each (k-1) itemset l2 In Lk-1 Do

3. If l1[1] == l2[1] And l1[2]==l2[2] And… And l1[k-2] = l2[k-2]

And l1[k-1] < l2[k-1] Then

4. Ck {l1[1], l1[2], …, l1[k-2], l1[k-1], l2[k-1] ; // Bƣớc tỉa

5. For (Each c In Ck Do

6. For (Each subset s In c Do

7. if (s NotIn Lk-1 Then

8. delete c From Ck;

9. Return Ck

2.1.3.3 Giải thích và ví dụ minh họa thuật toán Apriori a. Giải thích

Lần duyệt đầu tiên, sẽ tính số lần xuất hiện của mỗi mục để xác định các 1- itemset phổ biến. Lần duyệt thứ k (k 2) sẽ bao gồm 2 giai đoạn:

* Giai đoạn 1:

Tập phổ biến Lk-1đã tìm thấy ở lần duyệt thứ k-1đƣợc sử dụng để sinh ra các tập ứng cử viên Ck bằng việc sử dụng hàm Apriori_gen.

* Giai đoạn 2:

Dựa vào cơ sở dữ liệu, tính độ hỗ trợ của các ứng của viên trong Ck. Các ứng cử viên trong Ck mà đƣợc chứa trong giao dịch t có thể đƣợc xác định một cách hiệu quả bằng việc sử dụng cây băm đƣợc mô tả nhƣ sau:

Trong giai đoạn 2 (giai đoạn sửa, tỉa): xoá bỏ các tập c Ck sao cho một vài (k-1) – tập con của c không nằm trong Lk-1. Thủ tục này là đầy đủ bởi đối với bất kì tập nào Lk với độ hỗ trợ tối thiểu thì các tập con kích cỡ (k-1) cũng có độ hỗ trợ tối thiểu, do đó nếu ta mở rộng mỗi tập trong Lk-1với tất cả các tập mục có thể và sau đó xoá tất cả các tập mà (k-1) – tập con của nó không nằm trong Lk-1, ta sẽ nhận đƣợc tất các tập trong Lk.

Việc kết nối là tƣơng đƣơng với việc mở rộng Lk-1 với mỗi mục nằm trong cơ sở dữ liệu và sau đó xoá bỏ các tập này mà đối với nó (k-1) – itemset nhận đƣợc bằng việc xoá đi mục thứ (k-1) không nằm trong Lk-1. Ở giai đoạn này Ck

Lk.Với lập luận nhƣ vậy, giai đoạn tỉa là giai đoạn ngƣời ta xoá khỏi Ck tất cả các tập mà các (k-1) tập con của nó không nằm trong Lk-1, cũng không xoá bất kỳ một tập nào có thể nằm trong Lk.

Hàm Subset: Các tập ứng cử viên Ck đƣợc lƣu trữ trong một cây băm. Một nút của cây này hoặc là chứa một danh sách của các tập (nút lá) hoặc bảng băm (một nút trong). Trong mỗi một nút trong, mỗi bucket của bảng băm chỉ đến một nút khác. Gốc của cây băm đƣợc xem ở độ sâu là 1. Một nút trong ở độ sâu d sẽ dẫn đến nút ở độ sâu d+1. Các tập đƣợc lƣu trữ trong các lá. Khi ta bổ sung thêm một tập c, ta bắt từ nút gốc và đi xuống cây cho đến khi ta chạm vào một lá. Tại một nút ở độ sâu d, ta quyết định sẽ đi theo cành nào bằng việc áp dụng hàm băm đối với mục thứ d của tập đó và theo con trỏ trong Bucket tƣơng ứng. Tất cả các nút ban đầu đƣợc tạo ra nhƣ là nút lá. Khi số các tập trong một nút lá vƣợt quá ngƣỡng đƣợc chọn, nút lá này đƣợc chuyển thành một nút trong.

Bắt đầu từ nút gốc, hàm Subset tìm tất cả các ứng cử viên đƣợc chứa trong giao dịch t nhƣ sau: Nếu ta bắt đầu tại một lá, ta tìm những tập trong nút lá này đƣợc chứa trong giao dịch t và bổ sung các mối quan hệ với chúng đối với tập kết quả mong muốn. Nếu ta đang ở một nút trong và ta đến đƣợc nó bằng việc băm mục i, ta băm trên mỗi mục đi sau i trong t và áp dụng một cách đệ quy thủ tục đó đối với nút này trong Bucket tƣơng ứng. Đối với nút gốc, ta băm theo mỗi mục trong t.

Để thấy đƣợc tại sao hàm Subset trả lại tập các tham khảo mong muốn hãy để ý đến những gì sẽ xảy ra tại nút gốc. Đối với bất kỳ tập c nào đƣợc chứa trong giao dịch t, mục đầu tiên cần phải có trong t. Tại nút gốc, việc băm mọi mục trong t đảm bảo đƣợc rằng ta chỉ không biết các tập mà nó bắt đầu với một mục không nằm trong t.

b. Ví dụ minh họa

Bảng 2.1. Các mặt hàng và nhãn

STT Tên mặt hàng Nhãn

1 Bột giặt B

2 Nƣớc sả vải N

3 Dầu gội đầu D

4 Xà phòng bánh X

5 Sữa tắm S

6 Kem đánh răng K

Ta có cơ sở dữ liệu giao dịch D trong bảng sau: Bảng 2.2. Các giao dịch

TID Nội dung giao dịch

T1 {K, B, D, N}

T2 {D, B, S, X, N}

T3 {S, B, N, X}

T4 {N, B, D}

Giả sử độ hỗ trợ tối thiểu cho trƣớc minsup = 60%. Các tập ứng cử viên C1 chỉ gồm 1 hạng mục và độ hỗ trợ tƣơng ứng trong bảng 2.3.

Lấy tích L1 L1 (nối L1và L1) để có C2 Bảng 2.5. Ứng viên C2 Bảng 2.6. Ứng viên C2 Tính độ hỗ trợ trong C2 để có L2 Bảng 2.7. Ứng viên C2 Bảng 2.8. Ứng viên L2 Lấy tích L2 L2 (nối L2 và L2) để có C3 Bảng 2.9. Ứng viên C3 Cuối cùng chúng ta có L = L1 L2 L3 = {{B}, {N}, {D}, {B, N}, {B, D}, {N, D}, {B, N, D}} Ta có các luật: B N; B D ; N D N B; D B ; D N B N, D; N B, D ; D B, N ; B, N D ; B, D D ; N, D B; 2-hạng mục {B, N} {B, D} {N, D} 2-hạng mục Độ hỗ trợ {B, N} 4/4 = 100% {B, D} 4/4 = 100% {N, D} 3/4 = 75% 3-hạng mục {B, N, D} 3-hạng mục {B, N, D} Bỏ các hạng mục có sup < minsup = 60% Bỏ các hạng mục có sup < minsup = 60%

Một phần của tài liệu Hỗ trợ hệ chuyên gia cho khai phá luật kết hợp (LV01063) (Trang 33 - 39)

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

(71 trang)