So sánh FP-Growth và Apriori

Một phần của tài liệu (LUẬN VĂN THẠC SĨ) Một số phương pháp khai phá dữ liệu sinh luật kết hợp Luận văn ThS Công nghệ thông tin 1.01.10 (Trang 49 - 58)

Qua minh hoạ trên phần nào cho ta thấy thuật toán FP-Growth nhanh hơn và tốt hơn thuật toán Apriori đặc biệt đối với các CSDL lớn và dày, đó là do những ưu điểm sau đây:

(1) Thuật toán FP-Growth sử dụng chiến lược chia để chế ngự (divide and conquer) và áp dụng ý tưởng khai phá phát triển (growth), hoàn toàn không sinh ứng cử.

(2) Sử dụng cấu trúc dữ liệu đặc biệt FP-tree để nén dữ liệu và tăng tốc khai phá trong khi vẫn duy trì đầy đủ thông tin cho khai thác các mẫu phổ biến. Cây FP-tree không bao giờ lớn hơn CSDL gốc và nếu áp dụng kỹ thuật sắp xếp giảm dần theo tần suất thì các mục phổ biến sẽ được chia sẻ nhiều hơn, độ nén sẽ cao hơn và tốc độ khai phá nhanh hơn. Độ cao của cây tổng thể chỉ bằng kích thước của giao dịch lớn nhất (sau khi đã lọc bỏ các mục không thoả minsup).

(3) Áp dụng tốt cho cả mẫu phổ biến ngắn hay dài, CSDL thưa hay dày. Chỉ quét CSDL đúng 2 lần.

(4) Tính đúng đắn của thuật toán FP-Growth đã được chứng minh [106]. Thời gian xây dựng cây FP-tree là O(n) với n là số lượng giao dịch. Tuy nhiên tổng thời gian khai phá trên các cây FP-tree phụ thuộc là tương đối khó đánh giá nhưng nó tỉ lệ với số mẫu phổ biến được sinh ra.

3.3. Thuật toán Charm

3.3.1. Giới thiệu

Như đã giới thiệu ở trên, quá trình khai phá luật kết hợp gồm 2 pha:

+ Pha 1: tìm tất cả các tập mục phổ biến. Ở pha này đòi hỏi sự tính toán lớn, những thuật toán như Apriori đòi hỏi phải duyệt CSDL nhiều lần. Không những vậy trong các tập mục phổ biến được sinh ra có nhiều tập mục không cần thiết (hay tập mục dư thừa - redundant itemsets).

+ Pha 2: sinh các luật từ các tập mục phổ biến tìm được. Ở pha này đòi hỏi sự tính toán ít hơn, song gặp phải vấn đề là có thể sinh ra quá nhiều luật kết hợp, vượt ra khỏi sự kiểm soát của khai phá hoặc người dùng và cũng giống Pha 1 là trong đó có nhiều luật không cần thiết (hay luật dư thừa - redundant rules).

Có một số giải pháp được đề xuất nhằm giảm bớt việc tính toán trong pha 1 và tránh sinh ra các luật dư thừa trong pha 2:

+ Giải pháp thứ nhất là chỉ cần khai phá các tập mục phổ biến cực đại (maximal frequent itemsets) ở pha 1, không cần khai phá tất cả các tập phổ biến. Số lượng cá tập mục phổ biến cực đại khai phá được sẽ nhỏ hơn rất nhiều so với số tập mục phổ biến. Tuy nhiên, nếu chỉ khai phá tập mục phổ biến cực đại thì có thể làm mất một số thông tin và vì vậy có thể mất một số luật.

+ Giải pháp thứ hai là chỉ cần khai phá các tập mục đóng phổ biến (closed itemsets) ở pha 1, không cần khai phá tất cả các tập phổ biến. Số lượng các tập mục đóng phổ biến khai phá được sẽ nhiều hơn số tập mục phổ biến cực đại nhưng nó vẫn nhỏ hơn rất nhiều so với số tập mục phổ biến. Tuy nhiên, mỗi tập mục đóng phổ biến lại xác định cho tập tất cả các tập mục phổ biến là tập con của nó. Vì vậy từ tập mục đóng phổ biến ta có thể sinh tất cả các luật cần thiết.

3.3.1.1. Một số khái niệm Ta ký hiệu: Ta ký hiệu:

+ I là tập các mục đơn (Itemset).

+ T = {1, 2,..., n} là tập các định danh của các giao dịch (Tidset). Khi đó CSDL là quan hệ nhị phân   I T.

Nếu mục i xuất hiện trong giao dịch t ta viết (i, t) hoặc i t.

Tập XI gọi là tập mục và YT là tập các định danh. Để thuận tiện, ta ký hiệu tập mục

Bảng 3.18: Cơ sở dữ liệu minh hoạ thuật toán Charm.

Với dữ liệu cho ở bảng trên thì I = {A,C,D,T,W}, T = {1,2,3,4,5,6}, minsup = 3 (50%). Với mỗi tập mục X I ta ký hiệu tập định danh tương ứng của nó là t(X), cụ thể t(X) là tập tất cả các định danh của T có chứa X, t là một ánh xạ được xác định như sau:

t: I T, t(X) = {yT |xX thì x y}, ngoài ra ta quy ước t() = T. Ví dụ: t(ACW) = 1345, t() = 123456.

Với mỗi tập giao dịch YT, ta ký hiệu tập mục tương ứng của nó là i(Y), cụ thể i(Y) là tập các mục của I mà tập mục này có trong tất cả các giao dịch trong Y, i là một ánh xạ được xác định như sau:

i: T I, i(Y) = {xI | yY, x y}, ngoài ra ta quy ước i() = I. Ví dụ: i(245) = CDW, i() = ACDTW.

Ta nói các ánh xạ ti định nghĩa một kết nối Galois () giữa các tập có thứ tự P(I)

Một số tính chất: (1) Tính chất 1: + t(X) = t(x) | xX. + i(Y) = i(y) | yY. Ví dụ: + t(ACW) = t(A) t(C) t(W) = 1345 123456 12345 = 1345. + i(245) = i(2) i(4) i(5) = CDW ACDW ACDTW = CDW. (2) Tính chất 2:

+ X1 X2 => t(X1) t(X2). + Y1 Y2 => t(Y1) t(Y2). Ví dụ:

+ ACW ACTW => t(ACW) = 1345 t(ACTW) = 135. + 245 2456 => i(245) = CDW t(2456) = CD. (3) Tính chất 3:

+ X i(t(X)). + Y t(i(Y)). Ví dụ:

+ i(t(AC)) = i(1345) = ACW AC. + t(i(24)) = t(CDW) = 245 24.

3.3.1.2. Toán tử đóng và tập đóng

Ký hiệu P(S) là tập các tập con của S.

+ Định nghĩa toán tử đóng: Cho tập S, hàm c: P(S) P(S) được gọi là toán tử đóng nếu X,Y S, c thoả mãn các tính chất sau:

+ Mở rộng (Extention): X c(X).

+ Đơn điệu (Monotonicity): nếu Y X thì c(Y) c(X). + Không tăng (Idenpotency): c(c(X)) = c(X).

Xét cit(X) = i(t(X)) là ánh xạ hợp từ P(I) P(I). Và cti(Y) = t(i(Y)) là ánh xạ hợp từ P(T) P(T).

Ta thấy cả 2 đều là toán tử đóng trên tập mục I và tập định danh T, ngoài ra ta còn thấy được tính chất xoay vòng (Round-trip) của citcti.

+ Định nghĩa tập đóng: Tập con X của S gọi là tập đóng khi và chỉ khi cit(X) = X. Với ví dụ đã xét ở trên ta có 19 tập mục phổ biến với minsup=50% nhưng chỉ có 7 tập đóng nhận được bằng cách lấy hợp của các tập mục phổ biến có cùng tập định danh, đó là:

ACW(1345), ACTW(135), C(123456), CD(2456), CDW(245), CT(1356), CW(12345). Trong các tập đóng có 2 tập mục phổ biến cực đại TAWCDWC.

Ta dễ thấy rằng: Nếu F là tập các tập mục phổ biến, C là tập các tập mục đóng phổ biến và M là tập các tập phổ biến cực đại thì ta có M C F.

Ta có hệ quả sau: để xác định tập X có phổ biến không, ta tìm tập đóng X’ bất kỳ chứa

X. Nếu không tồn tại X’ thì X không là tập phổ biến. Ví dụ: Để kiểm tra X = ATW có phổ biến không, chúng ta tìm được X’ = ACTW là tập đóng chứa X, do đó X = ATW là tập mục phổ biến.

3.3.1.3. Cây tìm kiếm “tập mục – tập định danh” và Lớp tương đương

// Itemset – Tidset search tree and Equivalence classes [110], [111].

Ký hiệu X t(X) hay X Y với Y = t(X) là một cặp “tập mục-tập định danh” (itemset- tidset pair) và gọi là 1 cặp IT-pair hay 1 khái niệm (concept).

Ta ký hiệu X1 Y1 là con của X2 Y2 như sau: X1 Y1 X2 Y2 khi và chỉ khi X1X2

hoặc Y2 Y1.

Quy ước phép hội và phép tuyển trên các IT-pair được xác định như sau: + (X1 Y1) (X2 Y2) = cit(X1 X2) (Y1 Y2). + (X1 Y1) (X2 Y2) = (X1 X2) cti(Y1 Y2). Ví dụ: + (ACDW 45) (CDT 56) = cit(ACDW CDT) (45 56) = cit(ACDTW) 5 = ACDTW 5. + (ACDW 45) (CDT 56) = (ACDW CDT) cti(45 56) = CD cti(456) = CD 2456. Định nghĩa:

+ Độ hỗ trợ của IT-pair (X Y), ký hiệu: sup(X Y) = |Y| = |t(X)|.

+ IT-pair (X Y) được gọi là phổ biến khi và chỉ khi sup(X Y)minsup.

+ Giả sử tập X có xét đến thứ tự các phần tử trong nó và hàm p(X, k) trả về tập các tiền tố (prefix) của X có độ dài k, ta nói k là một quan hệ tương đương trên cơ sở tiền tố của các tập hợp và được xác định như sau:

X, Y I, X k Y <=> p(X, k) = p(Y, k).

Điều đó có nghĩa là nếu XY thuộc cùng một lớp tương đương [P] thì có chung phần tiền tố có độ dài k. Ví dụ trong hình sau, các nút con thuộc cùng nút cha sẽ thuộc cùng một lớp tương đương theo k.

Hình 3.6: Cây IT-tree (Itemset-Tidset Search Tree). Bảng 3.19: Mô tả cây IT-tree.

(1) Gốc của cây có nhãn null, các cung biểu diễn quan hệ cha con (theo prefix).

(2) Mỗi nút N của cây là một IT-pair, tất cả các nút con của N thuộc cùng một lớp tương đương có chung phần tiền tố ứng với N. Mỗi nút bao gồm:

+ Tập mục của riêng nút (Itemset), nếu là nút gốc có giá trị null. + Tập định danh giao dịch (Tidset).

+ Danh sách các nút con (Children).

Chú ý: trong hình trên ta thể hiện đầy đủ tập mục của mỗi nút để tiện theo dõi, còn nếu chỉ xét tập mục riêng của mỗi nút, ta phải bỏ đi phần tiền tố (prefix) tương ứng. Ví dụ: nút

(AC 1345) thì tập mục của riêng nút chỉ là C.

+ Nếu ta ký hiệu một lớp tương đương là [P] = {l1, l2, ..., ln}, trong đó P là nút cha (prefix) và li là một mục đơn thể hiện nút (Pli t(Pli)), ví dụ nút gốc [] = {A, C, D, T, W}, [A] = {C, D, T, W}, .... Thì ứng với cách thể hiện trên cây IT-tree ta sẽ có nút N trong đó

N.Itemset=P, N.Children={N1, N2, ..., Nn}, và Ni.Itemset=li với (1in).

Định lý 1: Độ hỗ trợ của một tập mục X bất kỳ bằng độ hỗ trợ của toán tử đóng của nó, tức là sup(X) = sup(cit(X)).

Chứng minh: Ta có sup(X)=|t(X)|sup(cit(X))=|t(cit(X))| và sẽ ta chứng minh điều mạnh hơn t(X)=t(cit(X)).

Thật vậy cit là toán tử đóng nên: X cit(X) => t(X) t(cit(X)). Mặt khác cti là toán tử đóng, nên nó thoả mãn tính chất mở rộng hay:

t(X) cti(t(X)) = t(i(t(X))) = t(cit(X)). Do vậy t(X) = t(cit(X)) (đpcm).

Định lý trên cho thấy với mọi tập mục phổ biến đều xác định duy nhất 1 tập mục đóng phổ biến hoặc IT-pair phổ biến với cùng độ hỗ trợ. Hơn nữa, tập các tập mục đóng phổ biến là nhỏ hơn rất nhiều so với tập mục phổ biến, đặc biệt trong trường hợp CSDL dày. Với ví dụ trên ta thấy chỉ có 7 tập mục đóng phổ biến, trong khi có tới 19 tập mục phổ biến.

Định lý 2: Các tính chất của IT-pair

Cho f: P(I) N là ánh xạ 1 – 1 từ tập mục có thứ tự đến tập số tự nhiên N. Với hai tập mục bất kỳ XiXj ta nói Xif Xj, khi và chỉ khi f(Xi) f(Xj) với f xác định một thứ tự toàn phần trên các tập mục.

Ví dụ: Nếu f xác định theo thứ tự từ điển thì AC <f AD. Nếu f xác định theo thứ tự tăng dần của độ hỗ trợ, thì AD <f AC nếu sup(AD) < sup(AC).

Cho Xi t(Xi)Xj t(Xj) là hai phần tử của lớp [P], với Xif Xj, trong đó f là một hàm sắp thứ tự toàn phần. Theo đó ta có các tính chất sau:

+ Nếu t(Xi) = t(Xj) thì cit(Xi Xj) = cit(Xi) = cit(Xj).

+ Nếu t(Xi) t(Xj) thì cit(Xi) ≠ cit(Xj), nhưng cit(Xi Xj) = cit(Xi). + Nếu t(Xi) t(Xj) thì cit(Xi) ≠ cit(Xj), nhưng cit(Xi Xj) = cit(Xj). + Nếu t(Xi) ≠ t(Xj) thì cit(Xi) ≠ cit(Xj) ≠ cit(Xi Xj).

Chứng minh:

Tính chất 1: nếu t(Xi)=t(Xj) thì ta có i(t(Xi))=i(t(Xj)) hay cit(Xi)=cit(Xj).

Mặt khác t(Xi)=t(Xj) => t(XiXj) = t(Xi)t(Xj) = t(Xi) => i(t(XiXj)) = i(t(Xi)). Do vậy cit(XiXj) = cit(Xi) = cit(Xj) (đpcm).

Từ tính chất trên, ta có thể thay mỗi xuất hiện của Xi bằng XiXj và có thể loại bỏ Xj

khỏi [P], vì tập đóng của nó có thể xác định từ XiXj.

Tính chất 2: Nếu t(Xi) t(Xj) thì t(XiXj) = t(Xi)t(Xj) = t(Xi) ≠ t(Xj). Do vậy cit(XiXj) = cit(Xi) ≠ cit(Xj) (đpcm).

Từ tính chất trên, ta có thể thay mỗi xuất hiện của Xi bằng XiXj, vì hai tập đó cùng xác định 1 tập đóng. Nhưng t(Xi) ≠ t(Xj) nên ta không thể loại bỏ Xj, vì nó xác định 1 tập đóng khác.

Tính chất 3: Nếu t(Xi) t(Xj) thì t(XiXj) = t(Xi)t(Xj) = t(Xj) ≠ t(Xi). Do vậy cit(XiXj) = cit(Xj) ≠ cit(Xi) (đpcm).

Từ tính chất trên, ta có thể thay mỗi xuất hiện của Xj bằng XiXj, vì hai tập đó xác định cùng một tập đóng. Nhưng t(Xj) ≠ t(Xi) nên ta không thể loại bỏ Xi, vì nó xác định 1 tập đóng khác.

Tính chất 4: Nếu t(Xi) ≠ t(Xj) thì t(XiXj) = t(Xi)t(Xj) ≠ t(Xi) ≠ t(Xj)

Do vậy cit(XiXj) ≠ cit(Xi) ≠ cit(Xj) (đpcm).

Từ tính chất trên ta thấy: Không phần tử nào trong hai phần tử XiXj bị loại bỏ vì cả

XiXjdẫn tới các tập đóng khác nhau.

3.3.2. Thuật toán

Thuật toán Charm là một thuật toán kinh điển cho khai phá luật kết hợp đóng. Thuật toán thực hiện duyệt trên cả không gian tập mục và không gian tập định danh. Thuật toán tránh được việc tính toán để tìm ra tất cả các tập con có thể có của tập mục đóng rồi mới tìm tập mục đóng. Tính chất này là rất quan trọng đối với CSDL dày với các tập mục phổ biến dài. Duyệt qua cả không gian tập mục và không gian các tập định danh cho phép thuật toán Charm sử dụng phương pháp tìm kiếm mới, bỏ qua nhiều mức để tìm tập mục đóng phổ biến thay phải tính nhiều tập con không đóng. Hơn nữa thuật toán này sử dụng chiến lược tỉa: tỉa các ứng cử nếu tập con của nó không phổ biến, đồng thời tỉa các nhánh dựa trên tính chất không đóng, bất kỳ tập mục không đóng đều bị tỉa. Thuật toán Charm không yêu cầu sử dụng cấu trúc dữ liệu phức tạp, các phép toán cơ sở được sử dụng chỉ đơn giản là hợp hai tập mục và giao hai tập định danh.

Ý tưởng của thuật toán Charm là duyệt trên tập các IT-pair. Tất cả các tập không phổ biến cũng như các nhánh không phải tập đóng đều bị tỉa. Mỗi nút con của một nút được kết hợp với các nút con khác cùng mức để phát triển cây.

Giả sử cho bất kỳ tập mục X nào ta đều tìm được tập các định danh các giao dịch chứa

Xt(X) và ngược lại cho bất kỳ tập Y nào ta đều tìm được tập mục i(Y) của nó. Thuật toán Charm tính tất cả các khái niệm phổ biến từ CSDL vào. Ta có thể bắt đầu duyệt các khái niệm trong không gian các tập mục hoặc không gian tập định danh. Tuy nhiên, thực tế số các mục nhỏ hơn nhiều so với số các giao dịch và vì ta quan tâm đến các tập mục đóng, ta bắt đầu tìm các mục đơn và các tập định danh kết hợp chúng.

Bảng 3.20: Thuật toán Charm.

Input: CSDL D, độ hỗ trợ cực tiểu minsup.

Output: Tập các tập mục đóng phổ biến C.

Thực hiện: Charm(D, minsup).

(1) I = GetSingleItem(D); // I là tập các mục đơn trong D. (2) Root = new Node(); // Khởi tạo cây.

(3) // Khởi tạo các nút con của Root là các IT-pair ứng với các mục đơn phổ biến: (4) Root.Children = {li t(li) | li I & sup(li)  minsup};

(5) C = null;

(6) Charm_Extend(Root, C, minsup); // Từ Root thực hiện phát triển cây để tìm C. (7) Return C;

Bảng 3.21: Thủ tục Charm_Extend.

Input: Nút N trên IT-tree mà từ đó bắt đầu phát triển, tập các tập đóng hiện tại C, độ hỗ trợ cực tiểu minsup.

Output: Tập các tập đóng kết quả C.

Thực hiện: Charm_Extend(N, C, minsup).

(1) Foreach (Ni in N.Children) { // Duyệt mọi con của N.

(2) Foreach (Nj in N.Children & j > i) { // Duyệt lần lượt các Nj là em của Ni. (3) X = Nj.Itemset;

(4) Y = Ni.Tidset  Nj.Tidset; (5) If (|Y|  minsup)

(6) Charm_Property(X, Y, N, Ni, Nj); // Kết nối Ni với Nj để phát triển cây. (7) }

(8) If (!Subsumption_Check(C, Ni)) { // Nếu Ni không bị phủ bởi C. (9) C = C  {Prefix(Ni)  Ni.Itemset}; // Bổ sung Ni vào C. (10) Charm_Extend(Ni, C, minsup); // Khai phá đệ quy với Ni. (11) }

(12) delete Ni; // Giải phóng tài nguyên. (13) }

(14) Return C;

Bảng 3.22: Thủ tục Charm_Property.

Input: IT-pair đang xét X Y, nút đang xét N, hai nút con của N cần kết nối Ni, Nj.

Output: Thực hiện kết nối NiNj dựa trên 4 tính chất của IT-pair.

Thực hiện: Charm_Property(X, Y, N, Ni, Nj). (1) If (Ni.Tidset = Nj.Tidset) { // Tính chất 1. (2) Ni.Itemset = Ni.Itemset  Nj.Itemset; (3) N.Children.Remove(Nj);

(4) }

(5) Else If (Ni.Tidset  Nj.Tidset) { // Tính chất 2. (6) Ni.Itemset = Ni.Itemset  Nj.Itemset; (7) }

(8) Else If (Ni.Tidset  Nj.Tidset) { // Tính chất 3. (9) Ni.Children.Add(X  Y);

(11) }

(12) Else { // Tính chất 4. (Ni.Tidset ≠ Nj.Tidset) (13) Ni.Children.Add(X  Y);

(14) } (15) Return;

Định nghĩa: Ta nói Xj phủ Xi hay Xi bị phủ hay bị gộp vào (subsumed by) Xj khi và chỉ khi |t(Xi)|=|t(Xj)|XiXj. Và cũng nói Xi bị phủ bởi C nếu tồn tại XjC thoả Xj phủ Xi.

Bảng 3.23: Thủ tục Subsumption_Check.

Input: Kiểm tra xem tập mục ứng với nút N trên IT-tree có bị phủ bởi C không.

Output: true nếu tập mục tương ứng thuộc C. Ở đây sử dụng Hashtable để tăng tốc.

Thực hiện: Subsumption_Check (C, N).

(1) // Vì số tổ hợp Tidset là cực lớn nên ta áp dụng heuristic băm theo tổng Tid: (2) SumTid = Sum(N.Tidset); // Tính tổng tất cả các Tid để dùng cho hàm băm. (3) // Duyệt các item trong bucket có cùng giá trị SumTid:

(4) Foreach (Y in Hashtable[SumTid].ItemList) { // Hashtable là biến tổng thể ứng với C. (5) // Bản chất ta chỉ cần kiểm tra (Y = N.Tidset) nhưng để tăng tốc

(6) // ta kiểm tra (|Y| = |N.Tidset|) trước (Y = N.Tidset) như sau: (7) If (|Y| = |N.Tidset| & Y = N.Tidset) // Trường hợp N thuộc C: (8) Return true;

(9) }

(10) Return false;

Một phần của tài liệu (LUẬN VĂN THẠC SĨ) Một số phương pháp khai phá dữ liệu sinh luật kết hợp Luận văn ThS Công nghệ thông tin 1.01.10 (Trang 49 - 58)

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

(83 trang)