Chơng 6 Các thuật toán phát hiện luật kết hợp trong các CSDL lớn
6.2.2 Thuật toán Aprior
Thuật toán Apriori phát sinh các dự tuyển tập mục đợc đếm trong một lần duyệt mà chỉ sử dụng các tập mục lớn đợc tìm thấy trong bớc trớc.
Thuật toán Apriori bao gồm các bớc hình thức sau: procedure AprioriAlg()
begin
L1 := {Các 1-tập mục};
for (k:=2; Lk-1 <> 0; k++) do {
Ck := apriori-gen(Lk-1); // dự tuyển mới for mọi giao dịch t trong dữ liệu do{
for mọi dự tuyển c thuộc về Ck nằm trong t do c.count++;
}
Lk := {c thuộc Ck | c.count >= ngỡng support} }
Traloi := Uk Lk; end
Theo đó, thuật toán Apriori thực hiện nhiều phép duyệt CSDL. Trong lần đầu tiên, thuật toán chỉ đếm sự có mặt của các mục để xác định các 1-tập mục. Một lần duyệt thứ k diễn ra thao hai bớc.
Đầu tiên, các tập mục Lk-1 đợc tìm thấy trong lần duyêt thứ k-1 đợc sử dụng để phát sinh các tập mục Ck sử dụng hàm apriori-gen(). Hàm này đầu tiên kết nối Lk-1 với Lk-1. Đây là cải tiến đáng kể của thuật toán so với kiểu thêm liệt kê trong các thuật toán AIS và SETM bởi vì nó cho rằng các kết hợp khác không thể cho các support vợt quá ngỡng.
Điều kiện kết nối là nếu hai tập mục có k-2 mục đầu tiên giống nhau thì kết nối lại và thêm hai mục tiếp theo để trở thành k tập mục.
insert into Ck
select p.item1, p.item2, ...., p.itemk-1 , q.itemk-1
from Lk-1 p Lk-1 q
where p.item1, = q.item1,..., p.itemk-2 = q.itemk-2, p.itemk-1 < q.itemk-1;
Tiếp theo, trong bớc tỉa, ta xoá tất cả các tập mục c thuộc Ck mà (k-1)-tập con không nằm trong Ck-1:
for mỗi tập mục c thuộc Ck do
for mỗi (k-1)-tập con s của c do if (s không thuộc Lk-1) then
delete c khỏi Ck;
Chẳng hạn, cho L3 là {{1 2 3}, {1 2 4}, {1 3 4}, {1 3 5}, {2 3 4}}. Sau bớc kết nối, C4
sẽ là {{1 2 3 4},{1 3 4 5}}. Bớc tỉa sẽ xoá đi tập mục {1 3 4 5} vì tập mục {1 4 5} không nằm trong L3. Cuối cùng ta chỉ còn lại {1 2 3 4} nằm trong C4.
Tiếp theo thuật toán sẽ duyệt CSDL. Đối với mỗi giao dịch, nó xác định dự tuyển nào trong C4 nằm trong giao dịch và tăng dần số đếm các dự tuyển khi nó thuộc về giao dịch đang xét. Vào cuối phép duyệt, Ck đợc kiểm tra ngờng support cho các dự tuyển và hình thành C4. Thuật toán sẽ kết thúc khi Lk rỗng.
Thuật toán AprioriTid có đặc tính thêm là CSDL hoàn toàn không cần sử dụng cho việc đếm để tính support của tập mục dự tuyển sau lần duyệt đầu tiên mà việc đó đợc sử dụng ngay trong lần duyệt trớc.
6.2.2 Thuật toán AprioriTid
Thuật toán này cũng sử dụng hàm apriori-gen để xác định các tập mục dự tuyển trớc khi một lần duyệt bắt đầu. Điều thú vị của thuật toán này là CSDL D không cần thiết phải sử dụng cho việc tính support sau lần duyệt đầu tiên. Ký hiệu C’k là tập có các phần tử có dạng < TID, {Xk}>, trong đó mỗi Xk là k-tập mục lớn tiểm năng nằm trong giao dịch với định danh TID. Với k = 1, C’1 chính là CSDL D mặc dù về khái niệm, mỗi mục i đ- ợc thay bởi tập một phần tử {i}. Với k >1, C’k đợc phát sinh bởi thuật toán. Thành phần của C’k tơng ứng với giao dịch t là <t.TID,{c thuộc Ck | c bao gồm trong t}>. Nếu một giao dịch không chứa k-tập mục dự tuyển nào thì C’k sẽ không có phần tử nào cho giao dịch này. Nh vậy số các phần tử tập các tập mục của C’k có thể sẽ nhỏ hơn số giao dịch trong CSDL đặc biệt khi giá trị k lớn.
L1 = {tập các 1-tập mục lớn}; C’1 = CSDL D;
for (k = 2; Lk-1 <> 0; k++) do begin
Ck = apriori-gen(Lk-1); //Dự tuyển mới C’k = O //rỗng
for mỗi phần tử t thuộc C’k-1 do begin
//xác định các tập mục dự tuyển trong Ck
Ct = {c thuộc Ck | (c – c[k]) thuộc t. tập các tập mục và (c – c[k-1]) thuộc t. tập các tập mục};
for mọi dự tuyển c thuộc Ct do c.count++;
if (Ct <>O) then C’k +=<t.TID, Ct>; end
Lk = {c thuộc Ck | c.count >= nguỡng support} end
Trả lời = Uk Lk;
Theo thuật toán này, đầu tiên apriori đợc gọi với L1 để tạo ra C2. Các bớc tiếp theo thuật toán tính support của các phần tử trong C2 nhờ vào việc xác định các tập mục nằm trong C2 nhng lại chứa trong giao dịch t. Việc này đợc thực hiện không phải bằng cách duyệt tất cả các giao dịch trong CSDL mà chỉ là tính toán dựa trên logic về tập hợp.