Thuật toán Apriori

Một phần của tài liệu Khai phá dữ liệu phát hiện luật kết hợp và ứng dụng đối với kho dữ liệu của ngân hàng (Trang 29)

Các thuật toán khai phá luật kết hợp được đưa ra đều thực hiện hai pha:

+ Pha 1: tìm tất cả các tập mục phổ biến (độ hỗ trợ lớn hơn minsup), đây là pha tốn khá nhiều thời gian. Các thuật toán khai phá luật kết hợp chủ yếu tập trung vào pha này.

+ Pha 2: tìm các luật kết hợp từ các tập mục phổ biến (độ tin cậy lớn hơn minconf), pha này đơn giản hơn và tốn ít thời gian hơn so với Pha 1.

Thuật toán Apriori được Rakesh Agrawal, Tomaz Imielinski, Arun Swanmi đề xuất năm 1993, cho đến nay thuật toán này vẫn được cho là thuật toán kinh điển nhất, được

Máy tính và Máy in sup = 20% Máy để bàn và Máy in đen trắng sup = 6% Mức 2 minsup = 20% Mức 3 minsup = 5% Máy để bàn và Máy in đen màu sup = 6% Máy xách tay và Máy in đen trắng sup = 5% Máy xách tay và Máy in màu sup = 3%

APRIORI được bắt nguồn từ “Algorithm PRIOR knowledgement of frequent Itemset properties” [107]. Thuật toán sử dụng chiến lược đi từ dưới lên (bottom-up) và tìm kiếm theo chiều rộng (breath-first search).

Trong thuật toán này chúng ta sẽ duyệt nhiều lần CSDL. Trong lần duyệt thứ nhất, chúng ta tính độ hỗ trợ của các mục riêng biệt và xác định các mục phổ biến trong chúng (độ hỗ trợ lớn hơn minsup) – ký hiệu L1. Trong các lần duyệt thứ k, chúng ta thực hiện như sau:

(1) Bắt đầu với tập hạt giống (ký hiệu Lk-1) là tập các tập mục phổ biến đã tìm thấy trong lần duyệt trước (thứ k-1) để sinh ra (generate) các tập mục phổ biến tiềm năng hay các tập mục ứng cử (ký hiệu Ck).

(2) Duyệt CSDL để xác định độ hỗ trợ cho từng tập mục ứng cử. Lọc ra các tập mục có độ hỗ trợ lớn hơn minsup ta thu được Lk để làm tập hạt giống cho lần duyệt tiếp theo.

(3) Giải thuật dừng khi không có tập mục phổ biến nào tìm thấy (Lk = ).

Ta thấy trong thuật toán Apriori, tập ứng cử Ck được sinh ra hoàn toàn dựa trên tập hạt giống Lk-1, chứ không phải dựa trên việc quét CSDL. Cơ sở của điều này là tính chất: bất kỳ tập con nào của tập mục phổ biến cũng phải là phổ biến. Vì vậy, tập các ứng cử Ck có thể được sinh ra bằng cách kết nối các thành viên của tập các mục phổ biến hạt giống Lk-1

loại đi các ứng cử nếu nó có chứa bất kỳ tập con nào không phổ biến. Thủ tục này nói chung dẫn đến một số nhỏ hơn nhiều các tập ứng cử viên thông qua chiến lược tỉa không gian tìm kiếm như trên. Ta xem xét cụ thể bước kết nốibước tỉa tại bước k: (Không mất tính tổng quát, ta giả định mọi phần tử trong tập mục bất kỳ đã được sắp theo trật tự từ điển).

+ Tại bước kết nối:

Để tìm Ck ta kết nối Lk-1 với chính nó. Ký hiệu li [j] là mục thứ j trong tập mục li. Như trên chúng ta đã quy ước các mục trong mọi giao dịch và trong mọi tập mục có trật tự từ điển. Phép nối Lk-1 với chính Lk-1 được thực hiện như sau: cho l1 , l2  Lk-1, l1 và l2 được kết nối nếu (l1 [1]=l2 [1]) ^ (l1 [2]=l2 [2]) ^ ... ^ (l1 [k-2]=l2 [k-2]) ^ (l1 [k-1]<l2 [k-2]).

Điều kiện (l1 [k-1]<l2 [k-2]) để đảm bảo không sinh lặp ứng cử. Kết quả của kết nối trên là tập mục sau: l = l1 [1]l1 [2]...l1 [k-2]l1 [k-1]l2 [k-1].

+ Tại bước tỉa:

Ta cần tìm Lk là tập tất cả các tập k-mục phổ biến. Ta khẳng định LkCk và do vậy chỉ cần quét CSDL để xác định độ hỗ trợ cho các tập mục trong Ck và so sánh với minsup là nhận được Lk. Tuy nhiên, Ck có thể rất lớn, và do đó khối lượng tính rất lớn. Để rút gọn kích thước của Ck, tính chất Apriori được áp dụng như sau: Bất kỳ tập con (k-1)-mục nào của ứng cử k-mục mà không có mặt trong Lk-1 thì ứng cử đó không phổ biến và ta loại nó khỏi Ck.

29

Bảng 2.5: Thuật toán Apriori.

Input: CSDL D, ngưỡng độ hỗ trợ cực tiểu minsup. Output: Tập L chứa mọi tập mục phổ biến trong D.

(1) k = 1; L = ;

(2) Generate candidate 1-itemsets C1 = {All the distinct value in item attribute} ; (3) Compute frequent 1-itemsets L1 = Gen_Frequent(1, C1);

(4) repeat {

k = k + 1;

Generate candidate k-itemsets Ck = Gen_Candidate(k, Lk-1);

Compute frequent k-itemsets Lk = Gen_Frequent(k, Ck); L = L Lk;

} until Lk = ; (5) return L;

Function Gen_Frequent(k, Ck)

// Generate frequent k-itemsets Lk from candidates Ck. (1) for each itemset c  Ck do c.frequency = 0; // Init. (2) for each transaction t  D do // Scan D for count

{

Ct = SubSet(Ck, t); // Get all subsets c of t | c Ck. for each candidate c  Ct do c.frequency++;

}

(3) return Lk = {c Ck | c.frequency minsup};

Function Gen_Candidate(k, Lk-1)

// Generate candidates k-itemsets Ck from Lk-1. (1) Ck = ; // Init.

(2) for each itemset I1 Lk-1 do // Scan to join for each itemset I2 Lk-1 do

if (First (k-2) items in I1 and I2 are the same but the last item is different) {

c = I1 join I2;

if ( s is subset (k-1) items of c | s Lk-1) delete c; else add c to Ck;

} (3) return Ck;

Bảng 2.6: Cơ sở dữ liệu minh hoạ thuật toán Apriori. TID Items T100 1, 2, 5 T200 2, 4 T300 2, 3 T400 1, 2, 4 T500 1, 3 T600 2, 3 T700 1, 3 T800 1, 2, 3, 5 T900 1, 2, 3

31

Hình 2.6: Minh hoạ thuật toán Apriori.

Itemset sup 1 6 2 7 3 6 4 2 5 2 C1 Itemset sup 1 6 2 7 3 6 4 2 5 2 L1 Itemset sup 1, 2 ? 1, 3 ? 1, 4 ? 1, 5 ? 2, 3 ? 2, 4 ? 2, 5 ? 3, 4 ? 3, 5 ? 4, 5 ? C2 Bắt đầu Quét D để tính sup Lọc lấy Itemset supminsup Sinh các ứng cử C2 từ L1 Quét D để tính sup Itemset sup 1, 2 4 1, 3 4 1, 4 1 1, 5 2 2, 3 4 2, 4 2 2, 5 2 3, 4 0 3, 5 1 4, 5 0 C2 Itemset sup 1, 2 4 1, 3 4 1, 5 2 2, 3 4 2, 4 2 2, 5 2 L2 Itemset sup 1, 2, 3 ? 1, 2, 5 ? C3 Sinh các ứng cử C3 từ L2 Itemset sup 1, 2, 3 2 1, 2, 5 2 C3 Lọc lấy Itemset supminsup Itemset sup 1, 2, 3 2 1, 2, 5 2 L3 Lọc lấy Itemset supminsup Quét D để tính sup Itemset sup null ? C4 Kết thúc Sinh các ứng cử C4 từ L3

Cụ thể:

(1) Trong lần lặp đầu tiên của thuật toán, mỗi mục là phần tử của tập ứng cử 1-mục: C1. Thuật toán đơn giản quét tất cả các giao dịch theo thứ tự để tính số lần xuất hiện của mỗi mục.

(2) Lọc lấy các phần tử thoả minsup ta được L1.

(3) Sinh ra tập ứng cử 2-mục: C2 bằng thực hiện phép kết nối L1 với L1. Chú ý là trong bước này ta có áp dụng tính chất Apriori, nhưng trong lần kết nối này nó không có tác dụng vì mọi tập con khác rỗng của các ứng cử đều phổ biến. Do đó số ứng cử được sinh ra chính là số tổ hợp C(2, |L1|) = C(2, 5) = 5!/(2!*3!) = 10.

(4) Quét CSDL D để tính độ hỗ trợ cho các phần tử trong C2.

(5) Lọc lấy các phần tử thoả minsup ta được L2={{1,2}, {1,3}, {1,5}, {2,3}, {2,4}, {2,5}}. (6) Sinh ra tập ứng cử 3-mục: C3. Thực hiện phép kết nối L2 với L2 ta thu được các ứng cử

{{1,2,3}, {1,2,5}, {1,3,5}, {2,3,4}, {2,3,5}, {2,4,5}}. Áp dụng tính chất Apriori rằng tất cả các tập con của tập mục phổ biến phải là phổ biến, ta loại đi 4 ứng cử cuối (ví dụ loại {2,4,5}{4,5}L2). Ý nghĩa của việc này là giảm tối đa sự cố gắng không cần thiết tính độ hỗ trợ cho các ứng cử khi quét CDSL và cũng chú ý là với ứng cử k-mục, ta chỉ cần xét sự tồn tại của các tập con (k-1)-mục trong L2 là đủ vì các tập con nhỏ hơn đã được kiểm tra trong các bước trước rồi. Kết quả C3 = {{1,2,3}, {1,2,5}}.

(7) Quét CSDL D để tính độ hỗ trợ cho các phần tử trong C3. (8) Lọc lấy các phần tử thoả minsup ta được L3={{1,2,3}, {1,2,5}}.

(9) Sinh ra tập ứng cử 4-mục: C4. Thực hiện phép kết nối L3 với L3 ta thu được duy nhất ứng cử {1,2,3,5}. Áp dụng tính chất Apriori rằng tất cả các tập con của tập mục phổ biến phải là phổ biến, ta loại đi ứng cử cuối (vì {2,3,5}L3). Do vậy C4 =  và kết thúc quá trình lặp. (10) Kết quả L = L1 L2 L3 = { {1}, {2}, {3}, {4}, {5}, {1,2}, {1,3}, {1,5}, {2,3}, {2,4}, {2,5}, {1,2,3}, {1,2,5} } 2.3. Đánh giá

Tính đúng đắn của thuật toán Apriori đã được chứng minh trong [107], về độ phức tạp để khai phá được một mẫu phổ biến kích thước là l thì thuật toán phải sinh và kiểm tra (2l- 1) mẫu phổ biến tiềm năng (số lượng tập con có thể có ngoại trừ rỗng). Và nếu coi mọi phép tính toán, kiểm tra và so sánh là 1 đơn vị thì trong trường hợp xấu độ phức tạp của

33

thuật toán là O(n*2lmax) trong đó lmax là độ dài của tập mục phổ biến lớn nhất và n là số lượng tập mục.

2.4. Khai phá luật kết hợp với OLAP

Khai phá luật kết hợp sử dụng OLAP (OLAP-based association mining) được hiểu là sử dụng OLAP-engine và Data-cube trong quá trình khai phá luật kết hợp, đặc biệt nó rất hiệu quả trong khai phá luật kết hợp đa chiều và đa mức. Về cơ bản, chúng ta có thể chia quá trình khai phá luật kết hợp với OLAP thành 2-3 bước.

- Xây dựng Data-cube tương ứng với những tiêu chí mà ta quan tâm (Xem 2.4.1). - Trực tiếp khai phá các luật kết hợp từ Data-cube (Xem 2.5.2). Hoặc khai phá các

tập mục phổ biến từ Data-cube (Xem 2.4.2) rồi khai phá các luật kết hợp từ các tập mục phổ biến tìm được (Xem 2.5).

2.4.1. Xây dựng Data-cube

Xây dựng Data-cube chính là bước đầu tiên trong quá trình khai phá luật kết hợp sử dụng OLAP. Chúng ta cùng xem xét CSDL thống kê tài khoản giao dịch tại một ngân hàng trong 1 tháng:

Bảng 2.7: Minh hoạ CSDL thống kê tài khoản giao dịch.

Tid Customer (Tên khách hàng) Gender (Giới tính) Age

(Tuổi) Address (Địa chỉ) (Loại tài khoản) Account Type

Average Balance (Số dư TB) Transaction Count (Số lượng giao dịch) ...

1 TV Hoàng Nam 30 HàNội.BaĐình Cá nhân 50.5 12 ...

2 NT Trang Nữ 29 HàNội.HaiBàTrưng Cá nhân 20.1 3 ...

3 PV Khánh Nam 20 HàNội.ĐôngAnh Cá nhân 520.9 4 ...

4 TV Hà Nam 25 HàNội.ĐốngĐa Cá nhân 1.5 5 ...

5 ECC Khác 3 HàNội.BaĐình Doanh nghiệp 5500 250 ...

6 NV Hải Nam 45 HCM.Quận1 Cá nhân 120 8 ...

7 TQ Huy Nam 50 HCM.Quận1 Cá nhân 25.7 6 ...

8 TL Hương Nữ 35 HCM.Quận2 Cá nhân 12.4 9 ...

… … … … … … … … ...

Trong minh hoạ ở đây giả sử chúng ta chỉ quan tâm tới:

- Chỉ những tài khoản giao dịch có AccountType“Cá nhân”, - Chỉ quan tâm tới các thuộc tính Gender, Age, AverageBalance. Đồng thời thực hiện rời rạc hoá dữ liệu theo các tiêu chí:

Bảng 2.8: Tiêu chí rời rạc hoá CSDL thống kê TKGD.

Age Rank Range Value Balance Rank Range Value

Trẻ Dưới 25 Nhỏ Dưới 20

Trung bình 25 – 35 Vừa phải 20 – 100

Trung niên 35 – 50 Lớn 100 – 500

Già Trên 50 Rất Lớn Trên 500

Ta thu được bảng sau:

Bảng 2.9: CSDL thống kê TKGD sau khi rời rạc hoá.

Gender Age Rank Balance Rank Count

Nam Trẻ Nhỏ 60,000

Nam Trẻ Vừa phải 24,000

Nam Trẻ .Lớn 600

Nam Trẻ .Rất lớn 120 Nam Trung bình Nhỏ 120,000 Nam Trung bình Vừa phải 180,000 Nam Trung bình .Lớn 32,000 Nam Trung bình .Rất lớn 3,200 Nam Trung niên Nhỏ 100,000 Nam Trung niên Vừa phải 120,000 Nam Trung niên .Lớn 48,000 Nam Trung niên .Rất lớn 12,000

Nam Già Nhỏ 4,000

Nam Già Vừa phải 32,000

Nam Già .Lớn 40,000 Nam Già .Rất lớn 34,000 Nữ Trẻ Nhỏ 80,000 Nữ Trẻ Vừa phải 48,000 Nữ Trẻ .Lớn 1,600 Nữ Trẻ .Rất lớn 80 Nữ Trung bình Nhỏ 150,000 Nữ Trung bình Vừa phải 160,000 Nữ Trung bình .Lớn 20,000 Nữ Trung bình .Rất lớn 400 Nữ Trung niên Nhỏ 40,000 Nữ Trung niên Vừa phải 200,000 Nữ Trung niên .Lớn 120,000 Nữ Trung niên .Rất lớn 8,000

Nữ Già Nhỏ 4,000

Nữ Già Vừa phải 60,000

Nữ Già .Lớn 60,000

Nữ Già .Rất lớn 8,000

Từ bảng dữ liệu này, OLAP-engine sẽ thực hiện tính toán trước các toán tử nhóm và lưu trữ dữ liệu tính toán này vào các ô dữ liệu (Cell) của Data-cube tương ứng với các chiều. Tuy nhiên việc mô tả trực tiếp Data-cube n chiều trên không gian 2 chiều là việc rất

35

khó khăn, chúng ta cần thiết phải sử dụng những công cụ đặc biệt mà một trong những công cụ hiệu quả nhất là Pivot-table (ở đây Data-cube chúng ta đang xem xét có 3 chiều do đó chúng ta cần tối thiểu 2 “góc nhìn” vào nó):

2.4.2. Khai phá các tập mục phổ biến dựa trên Data-cube

Dựa trên công cụ OLAP, chúng ta có thể khai phá tập mục phổ biến đa chiều trực tiếp từ Data-cube mà không cần qua bước trung gian là khai phá tập mục phổ biến nhị phân. Thuật toán thực hiện khai phá tập mục phổ biến được thực hiện hiệu quả hơn nhiều vì độ hỗ trợ của mọi ứng cử đã được tính toán trước và lưu trữ sẵn trong các cell thuộc Data- cube, và do đó chúng ta sẽ không phải thực hiện quét lại toàn bộ CSDL để tính độ hỗ trợ cho các ứng cử nữa. Tuy nhiên có vấn đề xảy ra khi bản thân các mục thuộc cùng một thuộc tính cũng có quan hệ kết hợp với nhau, nói cách khác lúc này sẽ không có cell nào thuộc Data-cube phản ánh mối quan hệ đó, giải pháp trong trường hợp này là tách mỗi mục này thành một Boolean-dimension (nhận giá trị 1 khi mục tồn tại và 0 khi mục đó không tồn tại) và bổ sung các dimension mới này vào Data-cube.

Một trong những thuật toán tiêu biểu khai phá tập mục phổ biến từ Data-cube được đề xuất bởi Hua Zhu [111], về cơ bản giải thuật này tương tự như giải thuật Apriori trong đó tận dụng cấu trúc Data-cube.

Bảng 2.11: Thuật toán tìm tập mục phổ biến từ Data-cube của Hua Zhu.

Input: Data-cube n chiều DC[d1, ..., dn], ngưỡng độ hỗ trợ cực tiểu minsup. Output: Tập L chứa mọi tập mục phổ biến k chiều trong DC.

(1) k = 1; L = ;

(2) Generate candidate 1-itemsets for each dimension

C1 =  C1, di (i = 1 to n), in which C1, di = {all distinct values in dimension di} ; (3) Compute frequent 1-itemsets L1 = Gen_Frequent(1, C1);

(4) repeat {

k = k + 1;

Generate candidate k-itemsets Ck = Gen_Candidate(k, Lk-1);

Compute frequent k-itemsets Lk = Gen_Frequent(k, Ck); L = L Lk;

} until Lk = ; (5) return L;

Function Gen_Frequent(k, Ck)

// Generate frequent k-itemsets Lk from candidates Ck. (1) Lk = ; // Init.

(2) for each candidate I = {i1, ..., ik} Ck do // Scan all candidate {

37

I.frequency = Value of cell (i1, ..., ik) in DC;

if (I.frequency  minsup) Lk = Lk {I};

}

(3) return Lk;

Function Gen_Candidate(k, Lk-1)

// Generate candidates k-itemsets Ck from Lk-1. (1) Ck = ; // Init.

(2) for each itemset I1 Lk-1 do // Scan to join for each itemset I2 Lk-1 do

if (I1 and I2 has (k-2) same dimension-and-value but the other one is different dimension) {

c = I1 join I2;

if ( s is subset (k-1) items of c | s Lk-1) delete c; else add c to Ck;

} (3) return Ck;

Minh hoạ thuật toán tìm tập mục phổ biến từ Data-cube trong Bảng 2.10 với giả định

minsup = 177000 (10%):

(I) Sinh tập ứng cử 1-itemset C1 = C1, di (i = 1 to n), trong đó:

C1, Gender = {Nam (809920), Nữ (960080)};

C1, AgeRank = {Trẻ (214400), Trung bình (665600), Trung niên (648000), Già (242000)}; C1, BalanceRank = {Dư Nhỏ (558000), Dư Vừa phải (824000)

, Dư Lớn (322200), Dư Rất lớn (65800)};

(II) Tìm tập mục phổ biến 1-itemset L1 với minsup = 177000 ta có:

L1 = { Nam (809920), Nữ (960080)

, Trẻ (214400), Trung bình (665600), Trung niên (648000), Già (242000) , Dư Nhỏ (558000), Dư Vừa phải (824000), Dư Lớn (322200)

}

(III) Bước lặp:

// Chú ý: Các mục cùng dimension sẽ không được kết hợp với nhau vì độ hỗ trợ luôn là 0. (1) k = 2, ta có:

C2 = {{Nam, Trẻ} (84720), {Nam, Trung bình} (335200) , {Nam, Trung niên} (280000), {Nam, Già} (110000) , {Nam, Dư Nhỏ} (284000), {Nam, Dư Vừa phải} (356000) , {Nam, Dư Lớn} (120600)

, ...

, {Già, Dư Lớn} (100000) }

=> L2 = {{Nam, Trung bình} (335200), {Nam, Trung niên} (280000) , {Nam, Dư Nhỏ} (284000), {Nam, Dư Vừa phải} (356000) , {Nữ, Trung bình} (330400), {Nữ, Trung niên} (368000) , {Nữ, Dư Nhỏ} (274000), {Nữ, Dư Vừa phải} (468000) , {Nữ, Dư Lớn} (201600)

, {Trung bình, Dư Nhỏ} (270000), {Trung bình, Dư Vừa phải} (340000) , {Trung niên, Dư Vừa phải} (320000)

}

(2) k = 3, ta có:

C3 = {{Nam, Trung bình, Dư Nhỏ} (120000)

, {Nam, Trung bình, Dư Vừa phải} (180000) , ...

, {Nữ, Trung niên, Dư Lớn} (120000) }

=> L3 = {{Nam, Trung bình, Dư Vừa phải} (180000) , {Nữ, Trung niên, Dư Vừa phải} (200000) }

(3) k = 4, ta có:

C4 =  => L4 = 

(IV) Kết quả L = L1  L2  L3;

Nhận xét: giải thuật mà Hua Zhu đề xuất chưa tận dụng tối đa cấu trúc dữ liệu Data- cube, đơn cử chúng ta có thể đề ra giải thuật DataCubeSimpleGenFrequentItemsets tận

Một phần của tài liệu Khai phá dữ liệu phát hiện luật kết hợp và ứng dụng đối với kho dữ liệu của ngân hàng (Trang 29)

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

(60 trang)