Thuật toán Apriori

Một phần của tài liệu khai phá luật kết hợp trong cơ sở dữ liệu và ứng dụng (Trang 37 - 50)

Apriori là thuật toán khai phá tập mục thƣờng xuyên do R. Agrawal và R. Srikant đề xuất vào năm 1993. Thuật toán Apriori còn là nền tảng cho việc phát triển nhiều thuật toán khai phá tập mục thƣờng xuyên khác về sau.

Giả sử các mục dữ liệu trong mỗi giao tác đƣợc lƣu theo trật tự từ điển. Thuật toán sử dụng các ký hiệu sau đây:

Tập k mục Chức năng

Lk

Tập các k-tập mục thƣờng xuyên (với độ hỗ trợ tối thiểu minsup). Mỗi phần tử của tập này có 2 trƣờng:

i) Tập mục (itemsets) ii) Độ hỗ trợ (count)

Ck

Tập các k-tập mục ứng viên (các tập mục thƣờng xuyên tiềm năng). Mỗi phần tử của tập này có 2 trƣờng:

i) Tập mục (itemsets) ii) Độ hỗ trợ (count)

Ý tƣởng chính của thuật toán nhƣ sau: sinh ra các tập mục ứng viên từ các tập mục thƣờng xuyên ở bƣớc trƣớc, sử dụng kỹ thuật “tỉa” để bỏ đi những tập mục ứng viên không thoả mãn ngƣỡng hỗ trợ cho trƣớc. Cơ sở của kỹ thuật này là tính chất Apriori: Bất kỳ tập con nào của tập mục thƣờng xuyên cũng phải là tập mục thƣờng xuyên. Vì vậy các tập mục ứng viên gồm k mục có thể đƣợc sinh ra bằng cách kết nối các tập mục thƣờng xuyên có (k- 1) mục và loại bỏ tập mục ứng viên nếu nó có chứa bất kỳ một tập con nào không phải là thƣờng xuyên

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn

Thuật toán duyệt cơ sở dữ liệu nhiều lần. Mỗi lần duyệt, thuật toán thực hiện hai bƣớc: bƣớc kết nối và bƣớc tỉa. Trong lần lặp thứ k, thuật toán nối hai (k-1)-tập mục để sinh ra k-tập mục, sử dụng tính chất Apriori để tỉa các tập ứng viên. Bƣớc nối và bƣớc tỉa nhƣ sau:

* Bước kết nối (tìm Ck): Tập các k-tập mục ứng viên Ck đƣợc sinh ra bởi việc kết nối Lk-1 với chính nó. Hai tập mục L1 và L2 của Lk-1 đƣợc nối nếu chúng có (k-2) mục dữ liệu đầu bằng nhau , mục dữ liệu thứ (k-1) của L1 < L2: (L1[1] = L2[1])(L1[2] = L2[2]) …(L1[k-2] = L2[k-2])  (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] L2[2] … L1[k-2] L1[k-1] L2[k-1]

*Bước tỉa: Tập Ck chứa tập Lk, tức là tất cả các k-tập mục thƣờng xuyên đều thuộc tập Ck. Tập Ck có thể là rất lớn dẫn đến khối lƣợng tính toán lớn. Thuật toán áp dụng tính chất Apriori để rút gọn tập Ck. Nếu có một (k-1) - tập mục con nào đó của k- tập mục ứng viên mà không có mặt trong Lk-1 thì ứng viên đó không thể là thƣờng xuyên, có thể loại bỏ khỏi Ck. Việc kiểm tra các (k-1) - tập mục con có thể thực hiện nhanh bởi duy trì một cây băm của tất cả các tập mục thƣờng xuyên đã tìm thấy.

Thuật toán Apriori ( tìm các tập mục thƣờng xuyên) Input: Cơ sở dữ liệu DB, ngƣỡng độ hỗ trợ minsup

Output: Tập các tập mục thƣờng xuyên L trong DB Method:

(1)Tìm các 1-tập mục thƣờng xuyên, nhận đƣợc L1 ; (2) For (k=2; Lk-1≠; k++) do begin

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn

(4) For (each T DB) do begin

(5) C= subset(Ck,T) ; // Các tập mục ứng viên chứa trong T (6) For (each c C)

(7) c.count++ ; // tăng số đếm c lên một đơn vị (8) end ;

(9) Lk = { c Ck / c.count ≥ minsup} ; (10) End;

(11) L=Lk;

Sinh các tập mục ứng viên của thuật toán Apriori: hàm Apriori_gen()

Function Apriori_gen() Input: Tập các (k-1)- tập mục thƣờng xuyên Lk-1 Output: Tập các k- tập mục ứng viên Ck Method: // Bước kết nối (1)For (each (k-1)-tập mục l1  Lk-1) do (2) For (each (k-1)-tập mục l2  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]}; // kết nạp k-tập mục mới vào Ck

// Bước tỉa

(5)For (each ciCk) do

(6) If exist (s  ci) and (sLk-1) then (7) delete ci from Ck;

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn (adsbygoogle = window.adsbygoogle || []).push({});

Ví dụ 2.4: minh hoạ thuật toán Apriori.

Ta minh họa thực hiện thuật toán Apriori trên cơ sở dữ liệu cho trong bảng 2.9 với minsup=50%, tƣ́c là xuất hiện ít nhất 2 lần.

Bảng 2.9: CSDL giao tác minh hoạ cho thuật toán Apriori

TID Các mục dữ liệu T1 a, c, d T2 b, c, e T3 a, b, c, e T4 b, e - Duyệt CSDL lần thứ nhất: tính độ hỗ trợ cho các 1-tập mục đƣợc kết quả nhƣ sau: Kết nối L1 với L1 đƣợc C2: C1 Loại bỏ các 1-tập mục có count < 2 1-tập mục Count {a} 2 {b} 3 {c} 3 {d} 1 {e} 3 L1 1-tập mục Count {a} 2 {b} 3 {c} 3 {e} 3 2-tập mục {a, b} {a, c} {a, e} {b, c} {b, e} {c, e} C2

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn 3-tập mục {b, c, e} C3 - Duyệt CSDL lần thứ 2: tính độ hỗ trợ cho các 2-tập mục. Kết nối L2 với L2 đƣợc C3: - Duyệt CSDL lần thứ 3: tính độ hỗ trợ cho các 3-tập mục.

Nối L3 với L3 đƣợc L4=, thuật toán dừng.

Các tập mục thƣờng xuyên tìm đƣợc theo thuật toán Apriori là: L=L1L2L3 a,b,c,e,ac,bc,be,ce,bce

Nhận xét: Thuật toán duyệt cơ sở dữ liệu nhiều lần, số lần duyệt bằng độ dài của tập mục thƣờng xuyên dài nhất tìm đƣợc.

2-tập mục Count {a, b} 1 {a, c} 2 {a, e} 1 {b, c} 2 {b, e} 3 {c, e} 2 C2 Loại bỏ các 2-tập mục có count < 2 2-tập mục Count {a, c} 2 {b, c} 2 {b, e} 3 {c, e} 2 L2 3-tập mục Count {b, c, e} 2 C3 3-tập mục Count {b, c, e} 2 L3 Loại bỏ các 3-tập mục có count < 2

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn

2.5.2.Thuật toán FP_growth

Thuật toán Apriori gặp phải hai chi phí lớn:

- Chi phí sinh ra số lƣợng khổng lồ các tập ứng viên. Ví dụ, nếu có 104 mục thƣờng xuyên thì thuật toán Apriori sẽ cần sinh ra hơn 107 các ứng viên 2-tập mục và thực hiện kiểm tra độ hỗ trợ của chúng.

- Lặp nhiều lần duyệt cơ sở dữ liệu, số lần duyệt cơ sở dữ liệu của thuật toán Apriori bằng độ dài của tập mục thƣờng xuyên dài nhất tìm đƣợc. Thuật toán Apriori chỉ thích hợp cho các cơ sở dữ liệu thƣa (sparse), với các cơ sở dữ liệu dày (dense) thì thuật toán thực hiện kém hiệu quả.

Để khắc phục nhƣợc điểm trên của thuật toán Apriori, J. Han, J Pei, Y. Yin và R. Mao đề xuất thuật toán FP-growth [3], [11]. Thuật toán FP-growth đƣợc xây dựng với 3 kỹ thuật chính:

(1) Nén dữ liệu thích hợp vào một cấu trúc cây gọi là cây FP-tree. Chỉ có các 1-tập mục (1-item) ở trong cây và các nút của cây đƣợc sắp xếp để các nút xuất hiện thƣờng xuyên hơn có thể dễ dàng chia sẻ với các nút xuất hiện ít hơn.

(2) Thực hiện phƣơng pháp khai phá phát triển (growth) từng đoạn dựa trên cây FP-tree gọi là phƣơng pháp FP-growth.

(3) Kỹ thuật tìm kiếm đƣợc dùng ở đây là dựa vào sự phân chia, “chia để trị”, phân rã nhiệm vụ khai phá thành các nhiệm vụ nhỏ hơn.

Thuật toán FP-growth do nén toàn bộ cơ sở dữ liệu lên một cấu trúc dữ liệu nhỏ hơn là cây FP-tree nên tránh đƣợc việc duyệt nhiều lần cơ sở dữ liệu (thuật toán chỉ duyệt cơ sở dữ liệu 2 lần). Tiếp theo thuật toán khai phá cây bằng cách phát triển dần các mẫu mà không sinh các tập mục ứng viên, do đó tránh đƣợc khối lƣợng tính toán lớn. Phƣơng pháp FP- growth đã chứng tỏ đƣợc tính hiệu quả của nó và có thể thực hiện khai phá cho cả các mẫu ngắn và dài, nhanh hơn thuật toán Apriori , luôn chỉ cần duyệt CSDL 2 lần .

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn

Thuật toán FP- growth thực hiện nhƣ sau:

Đầu tiên, thuật toán duyệt CSDL lần thứ nhất để tính độ hỗ trợ của từng mục (đếm số lần xuất hiện của từng mục).

Tiếp đến, những mục không đủ độ hỗ trợ bị loại. Các mục còn lại đƣợc sắp theo thứ tự giảm dần của độ hỗ trợ (cũng tức là giảm dần theo số lần xuất hiện trong CSDL), ta nhận đƣợc danh sách L các mục đã sắp.

Duyệt CSDL lần thứ hai, với mỗi giao tác t, loại các mục không đủ độ hỗ trợ, các mục còn lại theo thứ tự giống nhƣ xuất hiện trong L (tức là thứ tự giảm dần theo độ hỗ trợ) đƣợc cất vào cây FP-tree.

Phần tiếp theo thuật toán khai phá tìm các mẫu thƣờng xuyên trên cây FP-tree đã xây dựng mà không cần duyệt lại CSDL nữa.

Để hiểu phƣơng pháp này làm việc thế nào, ta xét khai phá CSDL giao tác DB sau với độ hỗ trợ tối thiểu minsup = 3/5.

Bảng 2.10: CSDL giao tác minh hoạ cho thuật toán FP- growth.

TID Các mục dữ liệu Các mục thƣờng xuyên đã sắp t1 a, c, d, f, g, i, m, p f , c, a, m, p t2 a, b, c, f, l, m, o f, c , a, b, m t3 b, f, h, j, o f, b t4 b, c, k, p, s c, b, p t5 a, c, e, f, l, m, n, p f, c, a, m, p

Bước 1: Duyệt CSDL, đếm số lần xuất hiện của từng mục, loại các mục

không đủ độ hỗ trợ. (adsbygoogle = window.adsbygoogle || []).push({});

Bước 2: Sắp các mục đủ độ hỗ trợ theo thứ tự giảm dần của độ hỗ trợ,

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn Mục Số lần xuất hiện f 4 c 3 b 3 m 3 p 3

Bước 3: Duyệt lại CSDL lần thứ hai và xây dựng FP-tree. Cây FP-tree được xây dựng như sau:

Khởi tạo cây T, gốc của cây có nhãn null.

Khi duyệt CSDL lần thứ hai, với mỗi giao tác, loại các mục không thƣờng xuyên, các mục còn lại sắp theo thứ tự giảm dần của số lần xuất hiện, dãy các mục thƣờng xuyên đó đƣợc thêm vào cây cùng với thay đổi số đếm của các mục trên cây cho phù hợp. Quá trình xây dựng cây nhƣ hình 2.2 sau:

Hình 2.2: Cây FP-tree đƣợc xây dựng dần khi thêm các giao tác t1, t2, t3.

root f:1 c:1 m:1 p:1 a:1 root f:2 c:2 m:1 p:1 a:2 b:1 m:1 root f:3 c:2 m:1 p:1 a:2 b:1 m:1 b:1

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn

Từ tập dữ liệu ban đầu, ta xây dựng header table của cây FP nhƣ sau:

item head of node-links item f c a b m p

Hình 2.3: Cây FP-tree của CSDL DB trong bảng 2.10

Cấu trúc cây FP-tree như sau:

o Gốc của cây nhãn null, các đƣờng đi trên cây biểu diễn item prefixs

o Các liên kết trên cây: liên kết các mục xuất hiện có tên giống nhau.

o Mỗi nút (trừ nút gốc) bao gồm: + Tên mục ( item identifier) + Count: số đếm

+ Node link: Liên kết đến nút tiếp theo trên cây có cùng tên.

o Bảng các đầu mục thƣờng xuyên (header table): bắt đầu cho các

liên kết.

Thủ tục thêm một dãy các mục (đã sắp giảm dần theo độ hỗ trợ) của một giao tác vào cây thực hiện đệ qui nhƣ sau:

Procedure insert_tree( string [p | P] , tree có gốc T)

(Ở đó p là mục thứ nhất của dãy các mục và P là phần còn lại. Trong lần duyệt thứ hai, với mỗi giao tác t , gọi thủ tục insert_tree( t' , T), ở đó t' là

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn

nội dung của giao tác t sau khi đã bỏ các mục không thường xuyên và sắp theo thứ tự giảm dần của độ hỗ trợ, T là gốc của cây.)

Tìm các tập mục thường xuyên :

Sau khi xây dựng xong FP-tree cho CSDL, việc khai phá tìm các tập mục thƣờng xuyên chỉ thực hiện trên FP-tree mà không cần duyệt CSDL nữa.

Thuật toán FP- growth nhƣ sau:

Bắt đầu từ dƣới lên của bảng header và cây, với mỗi mục A: dùng nút liên kết duyệt qua tất cả các nút trên cây mà xuất hiện A, với mỗi nút N mà N.itemname = A, xác định các tập mục thƣờng xuyên có xuất hiện A, thực hiện bằng cách chỉ cần tìm các đƣờng đi từ gốc tới N. Ví dụ : đầu tiên xét mục p, sau đó đến m, ... nhƣ sau:

o Mục p:

+ Có 2 đƣờng:

- f : 4, c : 3, a : 3, m : 2, p : 2 - c : 1, b : 1, p : 1 (adsbygoogle = window.adsbygoogle || []).push({});

(Tức là: fcam xuất hiện hai lần với p và cb chỉ một lần. Số lần xuất hiện của p là 2+1=3.)

Procedure insert_tree( string [p | P] , tree có gốc T)

1. Nếu T có nút con N mà N.itemname = p thì N.count++ 2. ngƣợc lại

3. Tạo một nút mới N;

4. N.itemname := p; N.count := 1;

5. Thay đổi nút liên kết cho p bao gồm N;

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn

+ Từ đó suy ra cơ sở mẫu phụ thuộc (conditional pattern base) của p là:

- f : 2, c : 2, a : 3, m : 2 - c : 1, b : 1

Các tập mục thƣờng xuyên chứa p là đƣợc xác định bởi cơ sở mẫu phụ thuộc này.

+ Xây dựng đệ qui cây FP-tree cho cơ sở phụ thuộc (condition base) và tìm các tập mục thƣờng xuyên ở trên cây đó, sau đó thêm p vào tất cả chúng.

Ở đây, cơ sở phụ thuộc là:

- f : 2, c : 2, a : 2, m : 2 - c : 1, b : 1

Trong đó chỉ có c là thƣờng xuyên (xuất hiện 3 lần) do đó tập mục thƣờng xuyên tìm đƣợc là cp, tần xuất 3/5.

o Mục m:

+Có 2 đƣờng:

- f : 4, c: 3, a: 3, m : 2

- f : 4, c : 3, a : 3, b : 1, m : 1

(bây giờ ta bỏ qua p vì các tập mục thƣờng xuyên chứa nó đã tìm rồi) + Cơ sở mẫu phụ thuộc của m là:

- f : 2, c: 2, a: 2

- f : 1, c : 1, a : 1, b : 1

+ FP-tree phụ thuộc của m là chỉ có một đƣờng: - f : 3, c: 3, a : 3

+ Tìm theo cách đệ qui các tập mục thƣờng xuyên trên FP-tree phụ thuộc, đầu tiên cho a, sau đó cho c và f. Cây FP-tree phụ thuộc của m nhƣ hình 2.4 sau:

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn

Hình 2.4: FP-tree phụ thuộc của m

Hình 2.5 : Các FP-tree phụ thuộc của am, cm và cam "am" : "am" root f:3 c:3 (f:3, c:3) "cm" : "cm" root f:3 (f:3) "cam" : "cam" root f:3 (f:3)

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn

Thuật toán FP- growth :

Khai phá FP-tree đƣợc thực hiện bởi gọi lần đầu FP- growth (FP-tree, null), thực hiện nhƣ sau:

Đánh giá thuật toán FP- growth: Thuật toán này nhƣ đã phân tích ở trên, nó thực hiện hiệu quả hơn thuật toán Apriori, thực hiện tốt cho tập mục thƣờng xuyên ngắn cũng nhƣ dài. Ta có một số nhận xét về thuật toán nhƣ sau: (adsbygoogle = window.adsbygoogle || []).push({});

o Độ phức tạp về thời gian: Chỉ duyệt CSDL 2 lần.

o Độ phức tạp về không gian: Độ cao của cây đƣợc giới hạn bởi kích thƣớc của giao tác lớn nhất.

o Thuật toán không bao giờ bị ngắt bởi một mẫu dài nào của mọi giao tác. Cây FP-tree duy trì đầy đủ thông tin cho khai phá các tập thƣờng xuyên. Đồng thời thuật toán cũng rút gọn hợp lý các thông tin không cần thiết bởi cách là các mục không thƣờng xuyên đã bị loại bỏ ngay từ đầu.

Procedure FP-growth (Tree , )

1.Nếu cây Tree chứa một đƣờng đơn P thì

2. với tất cả các tổ hợp (kí hiệu ) của các nút trong đƣờng đi P 3. sinh ra mẫu   với support = độ hỗ trợ nhỏ nhất của các nút trong ;

4. Ngƣợc lại: với mỗi mục ai trong header table của Tree { 5. sinh ra  := ai với support= ai.count;

6. Xây dựng cơ sở mẫu phụ thuộc của  và sau đó FP-tree phụ thuộc của  là Tree ;

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn

o Dùng kỹ thuật sắp theo trật tự giảm dần của tần số xuất hiện, điều đó dẫn đến các mục thƣờng xuyên hơn đƣợc chia xẻ nhiều hơn. Cây FP-

Một phần của tài liệu khai phá luật kết hợp trong cơ sở dữ liệu và ứng dụng (Trang 37 - 50)