Minh hoạ xây dựng cây FP-tree

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 45 - 49)

Bước 4: Khai phá các tập mục phổ biến từ cây FP-tree (T) tổng thể.

Ý tưởng ở đây là khai phá phát triển (growth): nếu A là một tập mục phổ biến trong D, và ký hiệu TDB|A là CSDL phụ thuộc mẫu A, giả sử BTDB|A thì (AB) là tập mục phổ biến khi và chỉ khi B là phổ biến trong TDB|A, và ta lặp lại giải thuật với (AB).

Căn cứ trên bảng Header, chúng ta có thể chia tất cả các mẫu phổ biến thành 6 tập con độc lập (không giao nhau) như sau: (Ở đây ta duyệt từ dưới lên để dễ trình bày về sau)

+ Tương ứng với p, ta có các mẫu chứa p.

+ Tương ứng với m, ta có các mẫu chứa m nhưng không chứa p. + Tương ứng với b, ta có các mẫu chứa b nhưng không chứa p,m. + Tương ứng với a, ta có các mẫu chứa a nhưng không chứa p,m, b. + Tương ứng với c, ta có các mẫu chứa c nhưng không chứa p,m, b, a. + Tương ứng với f, ta có các mẫu chứa f nhưng không chứa p,m, b, a, c.

+ Với mỗi mục x (x{p,m,b,a,c,f}) ta xây dựng CSDL phụ thuộc mẫu (Conditional pattern base) tương ứng, ký hiệu TDB|x như sau:

+ Xuất phát từ x trong bảng Header ta dùng liên kết để tìm tất cả các nút N

N.ItemName = x.

+ Từ N ta lần ngược lên cha của nó và cứ như vậy cho đến khi gặp gốc (null) ta sẽ thu được đường đi từ gốc tới N.

+ Tập các đường đi chính là TDB|x trong đó tần suất của mỗi giao dịch trong TDB|x

là tần suất nhỏ nhất của mục nào đó trên đường đi.

(4) Bổ sung t’=cbp null Item Head of node linked f: 4 c: 4 a: 3 m: 3 p: 3 b: 3 f:3 c:2 a:2 m:1 p:1 b:1 m:1 b:1 c:1 b:1 p:1 (5) Bổ sung t’=fcamp null Item Head of node linked f: 4 c: 4 a: 3 m: 3 p: 3 b: 3 f:4 c:3 a:3 m:2 p:2 b:1 m:1 b:1 c:1 b:1 p:1

+ Xây dựng cây FP-tree phụ thuộc mẫu, ký hiệu FP-tree|x dựa trên TDB|x. Chú ý, ta có thể hiểu cây FP-tree tổng thể chính là FP-tree|x trong đó x = null.

+ Kiểm tra nếu FP-tree|x rỗng hoặc nó chỉ chứa 1 đường đơn ( nút NFP-tree|x đều thoả N.Children.Count < 2) thì ta sinh các tập mục phổ biến bằng cách lấy tổ hợp bất kỳ của các mục trên đường đơn ghép với x, trong đó độ hỗ trợ chính là tần suất nhỏ nhất trên đường đi.

+ Ngược lại ta thực hiện khai phá đệ quy với cây FP-tree|x.

+ Tập hợp tất cả các tập mục phổ biến được sinh ra, ta thu được tập mục phổ biến cần tìm ứng với FP-tree tổng thể.

Với ví dụ đang xét ta thu được tập mục phổ biến là:

L = { p:3, cp:3

, m:3, am:3, cm:3, fm:3, cam:3, fam:3, fcm:3, fcam:3 , b:3

, a:3, ca:3, fa:3, fca:3 , c:4, fc:3

, f:4 }

Cụ thể được minh hoạ qua bảng sau (minsup = 3):

Item Conditional pattern base (Raw) Conditional pattern base Conditional pattern base (Filter by minsup=3) Conditional FP- tree Frequent pattern p:3 (f:4,c:3,a:3,m:2,p:2), (c:1,b:1,p:1) (f:2,c:2,a:2,m:2), (c:1,b:1) (c:2), (c:1) {(c:3)}|p p:3, cp:3 m:3 (f:4,c:3,a:3,m:2), (f:4,c:3,a:3,b:1,m:1) (f:2,c:2,a:2), (f:1,c:1,a:1,b:1) (f:2,c:2,a:2), (f:1,c:1,a:1) {(f:3,c:3,a:3)}|m m:3, am:3, cm:3, fm:3, cam:3, fam:3, fcm:3, fcam:3 b:3 (f:4,c:3,a:3,b:1), (f:4,b:1), (c:1,b:1) (f:1,c:1,a:1), (f:1), (c:1) Null Null b:3

a:3 (f:4,c:3,a:3) (f:3,c:3) (f:3,c:3) {(f:3,c:3)}|a a:3, ca:3, fa:3, fca:3

c:4 (f:4,c:3), (c:1) (f:3) (f:3) {(f:3)}|c c:4, fc:3

f:4 (f:4) Null Null Null f:4

3.2.2. Thuật toán

Việc thêm 1 tập mục t’ vào FP-tree (T) sẽ thực hiện qua lời gọi InsertIntoFPTree(t’, T) và thủ tục này được mô tả đệ quy như sau:

Bảng 3.14: Thủ tục thêm 1 tập mục vào FP-tree.

Input: Tập mục cần chèn I bắt đầu từ nút hiện tại N trên cây T.

Output: Cây FP-tree T.

Thực hiện: InsertIntoFPTree(I, N).

(1) i = GetFirstItem(I); // Lấy i là mục đầu tiên trong I. (2) Tail = I \ {i}; // Tail là phần còn lại của I sau khi bỏ i. (3) If (MyNode in N.Children & MyNode.ItemName = i) (4) MyNode.Count++; // Tích luỹ biến đếm.

(5) Else {

(6) MyNode = new Node(); (7) MyNode.ItemName = i; (8) MyNode.Count = 1; (9) MyNode.Parent = N;

(10) N.Children.Add(MyNode); // Bổ sung nút mới. (11) GetLastNode(i).Link = MyNode; // Cập nhật liên kết. (12) }

(13) If (Tail != null)

(14) InsertIntoFPTree(Tail, MyNode); // Insert phần còn lại. (15) Return;

Bảng 3.15: Thủ tục tạo cây FP-tree T từ CSDL D.

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

Output: Cây FP-tree T.

Thực hiện: CreateFPTree(D, minsup). (1) L = null; // Khởi tạo.

(2) Foreach (t in D) { // Quét D lần thứ nhất để tìm tần suất xuất hiện của từng mục. (3) Foreach (x in t) {

(4) L = L{x}; (5) Count(x)++; (6) }

(7) }

(8) L = L \ {x | Count(x) < minsup}; // Loại các mục không thoả minsup.

(9) L = SortDescending(L); // Sắp các mục còn lại theo chiều giảm dần của độ hỗ trợ. (10) T = new FPTree(); // Khởi tạo T.

(11) Foreach (t in D) { // Quét D lần thứ 2 để xây dựng FP-tree.

(12) t’ = Filter(t, L); // Lọc lấy các mục x trong t sao cho xL và đúng thứ tự trong L. (13) InsertIntoFPTree(T, t’); // Insert t’ vào T.

(14) }

(15) Return T;

Bảng 3.16: Thủ tục tạo CSDL phụ thuộc mẫu từ cây T.

Input: Cây FP-tree gốc T, mục đang xét x trong bảng Header.

Output: CSDL phụ thuộc mẫu D ứng với xT.

Thực hiện: CreateDB(T, x). (1) D = null; // Khởi tạo.

(2) // Duyệt qua mọi nút có ItemName = x nhờ con trỏ trong bảng Header: (3) Foreach (N in LinkListFromHeaderTable(x)) {

(4) // Tìm đường đi từ gốc T tới N: (có thể đi ngược từ N về T theo trường Parent) (5) t = FindPath(T, N);

(6) // Bổ sung t vào D với độ hỗ trợ bằng độ hỗ trợ nhỏ nhất của các mục trong t, (7) // đồng thời không xét tới mục x trong t nữa:

(8) D = D  {(t\{x}) with support=MinSupport(t)}; (9) }

(10) Return D;

Sau khi đã xây dựng xong cây FP-tree, ta dùng thuật toán FP-Growth để khai phá tập mục phổ biến qua việc thực hiện lời gọi thủ tục FP_Growth(T, null, minsup, L).

Bảng 3.17: Thủ tục FP_Growth.

Input: Cây FP-tree gốc T, mẫu đang xét X, ngưỡng độ hỗ trợ cực tiểu minsup, tập mục phổ biến hiện tại L.

Output: Tập mục phổ biến L.

Thực hiện: FP_Growth(T, X, minsup, L).

(1) If (T = null or T has only single path) { // T rỗng hoặc chỉ chứa 1 đường đơn.

(2) Foreach (Y in AllCombination(T)) { // Duyệt mọi tổ hợp xây dựng bởi đường đơn. (3) // Bổ sung tập mục phổ biến với độ hỗ trợ bằng độ hỗ trợ nhỏ nhất trên đường: (4) L = L  {(YX) with support=MinSupport(YX)};

(5) } (6) } (7) Else {

(8) Foreach (x in T.HeaderTable) { // Duyệt mọi mục trong bảng Header. (9) XNew = {x}  X; // Xác định mẫu mới.

(10) DNew = CreateDB(T, x); // Xác định CSDL phụ thuộc mẫu. (11) TNew = CreateFPTree(DNew, minsup); // Dựng cây FP-tree.

(13) } (14) } (15) Return;

3.2.3. Tổng kết

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 45 - 49)

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

(83 trang)