7. Bố cục luận văn
1.2.3. Phương pháp Apriori
Apriori [1, 2, 7] là thuật toán khai phá luật kết hợp do Rakesh Agrawal, Tomasz Imielinski, Anin Sawami đề xuất vào năm 1993, là nền tảng cho việc phát triển những thuật toán sau này. Thuật toán sinh tập ứng viên từ những tập phổ biến ở bước trước, sử dụng kĩ thuật “tỉa” để bỏ đi tập ứng viên không thỏa mãn ngưỡng hỗ trợ cho trước.
Các ký hiệu sử dụng trong thuật toán:
Lk = {l1, l2,…, li, …} tập các k-itemset phổ biến.
Ck = {c1, c2,…, ci, …} tập các k-itemset ứng viên, mỗi ci có 2 trường itemset và
count dùng để chứa tập thuộc tính và độ phổ biến của tập thuộc tính đó trong cơ sở
dữ liệu.
Thuật toán:
INPUT: Tập các giao dịch D, ngưỡng hỗ trợ minsup OUTPUT: Tập Answer bao gồm các tập phổ biến trên D
Phương pháp:
L1 = {large 1-itemset};
for (k = 2; Lk-1 ≠ ∅; k++) do begin
Ck = apriori_gen(Lk-1); // sinh tập ứng viên mới Ck; forall giao dịch t ∈ D do begin
Ct = subset(Ck, t); // các tập ứng viên chứa trong t; forall tập các thuộc tính ứng cử c ∈ Ct do c.count ++ ; end; Lk = {c ∈ Ck | c.count ≥ minsup} end; Answer =kLk ;
Trong thuật toán này, giai đoạn đầu đơn giản chỉ là việc tính độ hỗ trợ của các thuộc tính. Để xác định L1, ta chỉ giữ lại các thuộc tính có độ hỗ trợ lớn hơn hoặc bằng minsup. Trong các giai đoạn thứ k sau đó (k > 1), mỗi giai đoạn gồm có 2 pha:
Pha thứ 2: CSDL D sẽ được quét để tính độ hỗ trợ cho mỗi ứng viên trong Ck. Các tập ứng 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 [2]
Hàm apriori_gen() thực hiện hai bước:
Bước kết nối: Bước này kết nối các phần tử trong Lk-1 với nhau. Giả sử rằng các thuộc tính trong các ứng viên đã được sắp xếp theo thứ tự từ điển. Nếu có k-2 item đầu tiên (gọi là tiền tố) của hai (k-1)-itemset l1, l2 nào đó mà giống nhau thì ta khởi tạo một k-itemset ứng viên cho Ck bằng cách lấy phần tiền tố này hợp với 2 item thứ
k-1 của l1 và l2 (có thể phải sắp lại thứ tự cho các item này). Điều kiện l1[k-1] < l2[k- 1] nhằm tránh trường hợp 2 ứng viên l1 và l2 giống nhau kết nối với nhau.
Bước cắt tỉa: Trong bước này, ta cần loại bỏ tất cả các k-itemset c ∈ Ck mà tồn tại một (k-1)-itemset s, s ⊂ c và s ∉ Lk-1. Giải thích điều này như sau: một (k-1)- itemset s, s ⊂ c và s ∉ Lk-1. Khi đó, sup(s) < minsup vì s không phải là tập phổ biến, mặt khác do c ⊃ s nên sup(c) ≤ sup(s) < minsup. Vậy c không thể là tập phổ biến, nó cần được loại bỏ ra khỏi Ck.
Hàm subset và cấu trúc cây băm:
Cấu trúc cây băm: Để tăng hiệu quả cho việc tìm các tập phổ biến và tính độ hỗ trợ cho các tập ứng viên, thuật toán sử dụng cấu trúc cây băm để lưu trữ tập ứng viên
Ck. Mỗi nút của cây băm hoặc chứa một danh sách của các ứng viên (nếu là nút lá) hoặc một bảng băm nếu là nút trong. Tại mỗi nút trong, mỗi phần tử của bảng băm trỏ đến một nút khác. Gốc của cây được định nghĩa có độ sâu bằng 1. Nút ở độ sâu d thì trỏ đến nút ở độ sâu (d +1). Các ứng viên được lưu trữ trong các nút lá tạo thành một danh sách liên kết và đã được sắp xếp. Khi số ứng viên lưu trong nút lá vượt quá ngưỡng thì nút lá chuyển thành nút trong. Khi thêm một ứng viên c vào cây, ta bắt đầu duyệt từ nút gốc trên cây cho đến khi tìm được nút lá phù hợp, cách thực hiện như sau: ở mỗi nút trong độ sâu d, chúng ta quyết định đi theo nhánh nào bằng cách sử dụng hàm băm đối với mục thứ d (c[d] lưu mục thứ d) của tập thuộc tính c.
Hàm subset(Ck, t): Hàm này dùng để tìm tất cả các tập ứng viên trong Ck có chứa trong giao dịch t. Để tìm tập ứng viên ta bắt đầu từ nút gốc: nếu nút gốc là nút
lá thì ta xem các tập ứng viên trong nút lá đó có chứa trong giao dịch t. Trường hợp nút trong, và là kết quả của việc áp dụng hàm băm cho mục thứ i của giao dịch t, thì ta tiếp tục thực hiện hàm băm cho mục thứ (i +1) của giao dịch t, cho đến khi tìm gặp nút lá. Thủ tục tìm này được thực hiện đệ quy.