Các thuật toán Apriori [4]

Một phần của tài liệu đồ án công nghệ thông tin nghiên cứu các thuật toán khai phá luật kết hợp nhanh và ứng dụng (Trang 32 - 65)

Các item trong itemset được lưu theo thứ tự từ điển. Ta sử dụng ký hiệu c[1]. c[2]….c[k] để biểu diễn cho mọt itemset k-itemset c gồm các item c[1], c[2], …, c[k], với c[1] < c[2] < …< c[k]. Nếu c = X.Y và Y là một m-itemset thì ta gọi Y là một m- extension của X. Mỗi itemset đều gắn với một trường số đếm để lưu support của itemset này. Trường số đếm này ban đầu được khởi tạo là 0 khi itemset lần đầu tiên được tạo ra.

Bảng 2 : Ký hiệu

k-itemset Một itemset có k item

Lk Tập các large k-itemset (thoả support tối thiểu). Mỗi phần tử của tập có hai trường:

i) itemset và ii)support count

Ck Tập các candidate k-itemset (tiềm năng sẽ là các large itemset). Mỗi phần tử của tập gồm hai trường:

i) itemset và ii) support count

k

C Tập các candidate k-itemset khi các TID của giao dịch sinh ra được kết hợp cùng với các canđiate này.

3.2.1. Thuật toán Apriori

1. L1 = {large 1-itemset}

2.for (k = 2;Lk-1≠φ; k++} begin

3. Ck = apriori-gen(Lk-1); // new candidate 4. forall transaction t∈D begin

5. Ct = subset(Ck,t) //các candidate được chứa trong t 6. forall candidate c∈Ct 7. c.count++; 8. end; 9. Lk = {c∈Ck | c.count ≥ minsup} 10. end; 11. return∪k Lk

Trong thuật toán Apiori, giai đoạn đầu chỉ là đếm support cho các item. Tập L1 là các large 1-item, thực chất là các item có support lớn hơn hoặc bằng minsup. Các giai đoạn sau gồm có hai pha: i) các large (k-1) itemset trong Lk-1 tìm được ở giai đoạn thứ k-1 được dùng để sinh ra các candidate itemset Ck nhờ thủ tục aprriori-gen. ii) CSDL được quét để tính support cho mỗi candidate trong Ck. Tại đây ta cần sử dụng giải pháp đếm nhanh hiệu quả để có thể xác định được các candidate nào trong Ck được chứa trong một giao dịch t cho trước .

Sinh tập candidate của thuật toán Apriori:

Function apriori-gen

@param: Lk-1 tập các large (k-1) itemset

@return: Tập cha của tất cả các large (k-1) itemset. //bước kết nối

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

//bước cắt tỉa: bỏ đi tất cả các itemset cCk mà có(k-1)-subset của c không có trong Lk-1

forall itemsets c∈ Ck do

forall (k-1)-subsets s of c do

if (s ∉ Lk-1) then deleete c from Ck;

Hình 10: Hàm sinh tập candidate của thuật toán Aprirori.

Ví dụ 2-3 : Có L3 là {{1 2 3}, {1 2 4}, {1 3 4}, {1 3 5},{2 3 4}}, thì sau bước kết nối C4 sẽ là {{1 2 3 4}, {1 3 4 5}, bước cắt tỉa sẽ loại bỏ itemset {1 3 4 5} vì itemset {1 4 5} là không có trong L3.

Tính chính xác: Cần chỉ ra rằng Lk ⊆ Ck

Rõ ràng bất kỳ một subset nào của một large itemset cũng phải có support tối thiểu. Vì nếu ta mở rộng mỗi itemset trong Lk-1 với tất cả các item có thể có và sau đó bỏ đi tất cả các (k-1)-subset không thuộc Lk-1 của nó, ta sẽ còn lại một tập cha của các itemset thuộc Lk. Bước kết nối tương đương với việc mở rộng Lk-1 với mỗi item trong CSDL và sau đó loại bỏ khỏi (k-1)-itemset thu được item thứ (k - 1) không thuộc về Lk-1. Sau bước kết nối thì Lk ⊆ Ck. Bằng lập luận tương tự, sau bước cắt tỉa, tại đó ta loại bỏ khỏi Ck tất cả các itemset mà (k-1)-subset không thuộc về Lk-1 nhưng không loại bỏ bất kỳ itemset nào có thể thuộc về Lk.

Định nghĩa 11: Cây băm (hash tree) là một cấu trúc dữ liệu bao gồm các node lá hoặc node trong, node lá gồm một danh sách các itemset và node trong là một bảng băm (hash-table).

có độ sâu là d + 1. Các itemset được lưu trong các node là thành một danh sách liên kết. Khi thêm một itemset c, ta bắt đầu từ gốc đi xuống cho đến khi tới được một node lá. Tại một node trong có độ sâu là d, ta cần quyết định đi theo nhánh nào nhờ áp dụng hàm băm với item thứ d của itemset. Khi số lượng các itemset ở một node lá vượt quá một ngưỡng cho trước, node lá sẽ được chuyển đổi thành node trong.

3.2.2. Thuật toán AprioriTID:

Thuật toán AprioriTID được cho trong Hình 11.

@input: Tập các giao dịch D và minsup @output: Tập các frequent itemset trên D

1. L1 = {large 1-itemset} 2. C1= database D

3. for ( k = 2; Lk-1≠ φ; k++) begin

4. Ck = apriori-gen(Lk-1) 5. Ck = φ

6. forall entries t∈Ck−1 begin

7. //xác định các candidate itemset được chứa trong giao dịch với định danh t.TID

Ct = {c∈Ck| (c-c[k]) ∈t.set_of_itemset ∧ (c-c[k-1]) ∈t.set_of_itemset} 8. forall candidate c∈ Ctbegin

9. c.count++; 10. if (Ct≠φ) then Ck= Ck + <t.TID, Ct> 11. end 12. Lk = {c ∈Ck | c.count ≥ minsup} 13. end 14.return∪k Lk

Hình 11: Thuật toán AprioriTID

Thuật toán có sử dụng cùng hàm apriori-gen như thuật toán Apriori trong mục trước để xác định các candidate itemset trước khi mỗi giai đoạn được bắt đầu. Trong thuật toán này CSDL D không dùng để đếm support từ giai đoạn k>1 mà là tập Ck . Mỗi phần tử của tập Ck có dạng <TID, {Xk}>, trong đó Xk là một large k-itemset tiềm năng có mặt trong giao dịch định danh TID. Với k = 1, C1 tương ứng với CSDL D, trong đó mỗi item i được thay thế bởi một itemset {i}. Với k > 1, Ck được sinh ra bởi Ck = Ck + <t.TID, Ct>. Phần tử của Ck tương ứng với giao dịch t là <t.TID, {c∈Ck| c chứa trong t}>. Nếu một giao dịch không chứa bất kỳ candidate k-itemset nào thì Ck sẽ không có một điểm vào nào đối với giao dịch này. Do đó, số lượng điểm

vào trong Ck có thể nhỏ hơn số giao dịch trong CSDL, đặc biệt là với k khá lớn. Hơn nữa, với các giá trị k lớn, mỗi điểm vào có thể nhỏ hơn giao dịch tương ứng vì một số candidate có thể đã đượ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 điểm vào trong Ck bao gồm tất cả các candidate k-itemset được chứa trong giao dịch.

Ví dụ 2-4 : Xét CSDL có trong Bảng 3, giả sử rằng support tối thiểu là 2 giao dịch. Lời gọi hàm apriori-gen với L1 trong bước 4 cho ra tập candidate itemset C2 . Từ bước 6 đến bước 10, ta đếm support cho các candidate trong C2 bởi lặp qua các điểm vào trong C1 và sinh ra C2. Điểm vào đầu tiên trong C1 là {{1} {3} {4}} tương ứng với giao dịch 100. Tập Ct trong bước 7 tương ứng với đầu vào t là {{1 3}}, vì {1 3} là một phần tử của C2 và cả {{1 3}- {1}} và {{1 3}-{3}} đều là phần tử của t.set_of_itemset.

Bảng 3: Tập Ck và Lk qua các giai đoạn 1, 2, 3

Cơ sở dữ liệu

1

C L1

TID Item TID set_of_itemset Itemset Support 100 1 3 4 100 {{1},{3},{4}} {1} 2

200 2 3 5 200 {{2}, {3},{5}} {2} 3 300 1 2 3 5 300 {{1}, {2},{3},{5}} {3} 3 400 2 5 400 {{2}, {5}} {5} 3

Gọi hàm apriori-gen với L2 cho ra C3. Duyệt qua bộ dữ liệu với C2 và C3 cho ra C3 . Lưu ý rằng không có điểm vào nào trong C3 cho các giao dịch với TID bằng 100 và 400, vì các giao dịch này không chứa bất kỳ itemsset nào trong C3. Candidate {2 3 5} trong C3 được tìm thấy là large và cũng là một phần tử của L3. Khi ta sinh C4 mà sử dụng L3, vì tập L3 rỗng nên thuật toán kết thúc.

3.2.3. Thuật toán AprioriHybrid

Ta có nhận xét rằng cả thuật toán Apriori và AprioriTID cùng sử dụng thủ tục sinh candidate và do đó đếm được các itemset giống nhau. Trong các giai đoạn tiếp theo, số lượng candidate itemset giảm xuống. Tuy nhiên, Apriori vẫn kiểm tra từng giao dịch trong CSDL. Còn AprioriTID thay vì xét trên CSDL, chỉ quét Ck để thu được số đếm support, và kích thước của Ck nhỏ hơn kích thước của CSDL.

Thuật toán AprioriHybrid được xây dựng dựa trên những nhận xét này. Sử dụng thuật toán Apriori trong các giai đoạn đầu và chuyển sang thuật toán AprioriTID khi tập Ck ở cuối mỗi giai đoạn được mong muốn là sẽ khớp với bộ nhớ. Ta sẽ sử dụng mẹo sau để đánh giá nếu Ck là khớp với bộ nhớ trong giai đoạn tiếp theo. Ở cuối mỗi giai đoạn hiện tại, ta có số đếm của các candidate trong Ck. Ta ước lượng kích thước của Ck nếu nó đã được sinh ra. Kích thước này là (∑candidates c∈Cksupport(c)+ số lượng các giao dịch). Nếu Ck trong giai đoạn này là đủ nhỏ để khớp với bộ nhớ và có ít large candidate ở giai đoạn hiện tại so với giai đoạn trước, thì ta chuyển sang thuật

C2

2

C L2

Itemset Support TID set_of_itemset Itemset Support

{1 2} 1 100 {{1 3}} {1} 2 {1 3} 2 200 {{2 3},{2 5},{3 5}} {2} 3 {1 5} 1 300 {{1 2},{1 3},{1 5}, {2 3},{2 5}, {3 5}} {3} 3 {2 3} 2 400 {{2}, {5}} {5} 3 {2 5} 3 {3 5} 2 C3 3 C L3

Itemset Support TID set_of_itemset Itemset Support {2 3 5} 2 200 {{2 3 5}} {2 3 5 } 2

toán AprioriTID. Điều kiện trên được thêm vào để tránh chuyển thuật toán khi Ck

trong giai đoạn hiện tại khớp với bộ nhớ còn Ck trong giai đoạn sau thì không.

Chuyển đổi từ thuật toán Apriori sang thuật toán AprioriTID yêu cầu phải tốn chi phí. Giả sử rằng ta chuyển từ Apriori sang AprioriTID tại cuối giai đoạn thứ k. Trong giai đoạn thứ (k+1), sau khi tìm được các candidate itemset chứa trong một giao dịch, ta cũng sẽ thêm ID của giao dịch vào Ck+1. Chí phí phải chịu trong giai đoạn này liên quan đến việc thực hiện Apriori. Chỉ trong giai đoạn thứ (k+2) thuật toán AprioriTID mới được thực hiện. Nếu không có large (k+1)-itemset hay large (k+2)-itemset nào thì ta vẫn tốn chi phí cho việc chuyển đổi mà không thu được bất kỳ gì khi sử dụng AprioriTID.

3.3. Thuật toán DHP (Direct Hashing and Pruning) [16]

Thuật toán DHP được sử dụng để sinh large itemset hiệu quả. Thuật toán được đề xuất sử dụng phương pháp hàm băm cho việc sinh các candiadate itemset trong các bước lặp khởi tạo và áp dụng trong suốt kỹ thuật cắt tỉa để giảm nhanh chóng kích thước của CSDL giao dịch.

Thuật toán DHP đề xuất hai điểm chính: một là sinh hiệu quả các large itemset và hai là giảm nhanh chóng kích thước CSDL. Như trong thuật toán Apriori đã miêu tả quá trình sinh các candidate itemset, trong mỗi giai đoạn ta sử dụng tập các large itemset Li để tạo ra candidate itemset Ci+1 bởi việc nối Li với Li (ký hiệu là Li * Li) trên cơ sở (i-1) item chung cho giai đoạn tiếp theo. Ta quét trên toàn CSDL và đếm support của mỗi itemset trong Ci+1 để xác định được Li+1. Kết quả là càng nhiều itemset trong Ci thì càng tốn chi phí để xác định được Li. Thuật toán DHP sử dụng kỹ thuật hàm băm để lọc được những itemset không cần thiết cho việc sinh các candidate itemset tiếp theo. Khi support của candidate k-itemset được đếm nhờ duyệt trên CSDL, DHP tích luỹ những thông tin về các candidate k-itemset của mỗi giao dịch sau khi việc cắt tỉa được băm ra trên bảng băm. Mỗi vị trí trong bảng băm bao gồm một con số đại diện cho số itemset đã được băm cho tới vị trí này. Cần lưu ý rằng, dựa vào kết quả có được từ bảng băm, một vecto bit được xây dựng, tại đó giá trị của mỗi bit được đặt là 1 nếu con số tương ứng với điểm vào của bảng băm đó lớn hơn hoặc bằng

minsup. Vecto bit này sẽ được dùng để giảm số lượng itemset trong Ci. @input: minsup

@output: tập Ck

//Part 1

1. set all the bukets of H2 to zero; // H2 là một hash table 2. forall transaction t∈D dobegin

3. insert and count 1-items occurrences in hash tree; 4. forall 2-subsets x of t do

5. end

6. L1 = {c|c.count ≥ minsup, c is in a leaf node of the hash tree}

//Part 2

7. k = 2

8. Dk = D //một cơ sở của các large k-itemset 9. while (|{x|Hk[x] ≥ minsup}| ≥ LARGE) do

10. gen-candidate(Lk-1, Hk, Ck) 11. set all the buckets of Hk+1 to zero 12. Dk+1 = φ

13. forall transactions t∈Dkdo begin

14. count_support(t, Ck, k, τ) //τ⊆ t 15. if (|τ| > k) then do begin 16. make_hasht(τ,Hk, k Hk+1, t) 17. if (|t| > k) then Dk+1 = Dk+1 ∪ {t} 18. end 19. end 20. Lk = {c∈Ck| c.count ≥ minsup} 21. k + +; 22.end //Part 3 23. gen-candiate(Lk-1, Hk, Ck) 24.while (|Ck| > 0) do begin 25. Dk+1 = φ

26. forall transactions t∈Dkdo begin

27. count_support(t, Ck, k, τ) //τ⊆ t 28. if (|τ| > k) then Dk+1 = Dk+1 ∪ {t} 29. end

30. Lk = {c∈Ck| c.count ≥ minsup} 31. if (|Dk+1| = 0) then break;

32. Ck+1 = apriori-gen(Lk) //xem lại trong thuật toán Apriori 33. k + +;

34.end

Hình 12: Chương trình chính của thuật toán DHP

Procedure gen-candidate(Lk-1, Hk, Ck) 1. Ck =φ

2. forall c = cp[1]. ….cp[k-2].cp[k-1].cq[k-1] , cp, cq∈Lk-1, |cp ∩cq| = k-2 do

3. if (Hk[hk(c)] ≥ minsup ) then

4. Ck = Ck∪{c}; //thêm c vào hash tree

Procedure count_support()t, Ck, k, τ)

1. forall c such that c∈Ck and c(= ti1…tik)∈t do begin

2. c.count + +;

4. end

5. for (i = 0, j = 0; i < |t|; i + +) do begin

6. if (a[i] ≥ k) then do begin

7. τj = tij; 8. j + +; 9. end 10.end Procedure make_hasht(τ, Hk, k, Hk+1, t) 1. forall (k+1)-subsets x (=τi1,…,τik) of τdo

2. if (for all k-subsets y of x, Hk[hk(y)] ≥ minsup) then do begin

3. Hk+1[hk+1(x)] + +;

4. for (j = 1; j ≤ k + 1; j + +) a[ij] + +; 5. end

6. for (i = 0,j = 0; i< |τ|; i + +) do begin

7. if then do begin

8. tj = τi

9. j + + 10. end

11.end

Hình 13: Các thủ tục của thuật toán DHP

Hình trên cho thấy thuật toán DHP được chia thành 3 phần. Phần 1 cho tập large 1-itemset và tạo ra một bảng băm (H2) cho 2-itemset. Phần 2 sinh ra tập các candidate itemset Ck dựa trên bảng băm (Hk) được sinh ra trong giai đoạn trước, để xác định tập các large k-itemset Lk, giảm kích thước của CSDL cho large itemset tiếp theo, và tạo ra một bảng băm cho các large (k+1)-itemset. Phần 3 về cơ bản là giống phần 2, ngoại trừ việc không áp dụng bảng băm. Lưu ý rằng, thuật toán DHP có mặt mạnh là xác định được các large itemset từ các bước đầu, do vậy cải thiện được tình trạng thắt cổ chai. Kích thước của Ck giảm xuống đáng kể trong các giai đoạn tiếp sau. Chính vì lý do này mà thuật toán sử dụng phần 2 cho các bước lặp ban đầu và phần 3 cho các bước lặp tiếp sau khi số lượng các vị trí băm với số đếm lớn hơn hoặc bằng minsup (ví dụ |{x| Hk[x]}| ≥ minsup trong Hình 12 phần 2) là nhỏ hơn một ngưỡng được định nghĩa trước LARGE.

Ví dụ 3-5 : C1 count {A} 2 {B} 3 {C} 3 {D} 1 {E} 3

Nghiên cứu các thuật toán khai phá luật kết hợp nhanh và ứng dụng

minimum support , minsup = 2 Tạo ra một bảng băm

H[(x y)] = ((order of x) * 10 + (order of y)) mod 7;

{C E} {B E} {A C}

{C E} {B C} {B E} {C D}

{A D} {A E} {B C} {B E} {A B} {A C}

3 1 2 0 3 1 3 Hash table H2

0 -1 2 3 4 5 6 Hash address

Số lượng các item đã băm đối cới vị trí thứ 2 Sinh ra tập C2

support tại từng vị trí và itemset

Hình 14: Ví dụ về bảng băm và phép sinh C2 Giảm kích thước của CSDL giao dịch

Lưu ý rằng theo [3], bất kỳ một tập con nào của large itemset cũng đều phải là large itemset. Thực tế này đã chỉ ra rằng, một giao dịch được dùng để xác định tập các large (k+1)-itemset chỉ nếu nó gồm (k+1) large k-itemset trong giai đoạn trước đó. Khi k-subset của một giao dịch được đếm có thể biết được giao dịch đó có thoả điều kiện cần để chứa large (k+1)- itemset. Nghĩa là nếu có số lượng các candidate itemset gần với số lượng các large itemset khi cắt tỉa k-subset, có thể loại bỏ các giao dịch và giảm số lượng các giao dịch bởi triệt tiêu được các item mà không sử dụng đến trong việc sinh các large itemset.

Ta sẽ xem cách kích thước giao dịch được cắt tỉa trong DHP. Nếu một giao dịch có chứa các large (k+1)-itemset, thì bất kỳ item nào nằm trong những (k+1)-itemset này sẽ phải xuất hiện ít nhất trong k candidate k-itemset trong Ck. Một item sẽ được

{B} {C} {E} {A B} 1

Một phần của tài liệu đồ án công nghệ thông tin nghiên cứu các thuật toán khai phá luật kết hợp nhanh và ứng dụng (Trang 32 - 65)

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

(98 trang)
w