Thuật toán được thực hiện qua hai giai đoạn:
Giai đoạn 1: Xây dựng cây mẫu phụ thuộc FP-tree.
Giai đoạn 2: Sử dụng cây FP-tree để khai phá các mẫu phổ biến.
Để có cái nhìn trực quan về phương pháp này, chúng ta sẽ minh họa thuật toán dựa trên CSDL giao dịch D, của Bảng 2.1 trong ví dụ 2.1.
2.3.2.1.Giai đoạn 1: Xây dựng cây mẫu phụ thuộc FP-tree
Để xây dựng cây mẫu phụ thuộc FP-tree, thuật toán phải duyệt CSDL hai lần. -Lần duyệt CSDL đầu tiên:
Trong lần duyệt này, giống như thuật toán Apriori, bắt đầu từ tập mục phổ biến có độ dài 1 (1-itemsets) và tính độ hỗ trợ của chúng (Giả sử số đếm hỗ trợ tối thiểu min-sup count = 2). Sắp xếp tập mục phổ biến này theo thứ tự giảm dần của độ hỗ trợ. Ta có một danh sách L như sau: L= {{I2:7}, {I1:6}, {I3:6}, {I4:2}, {I5:2}}.
-Duyệt CSDL lần thứ hai:
Cây mẫu phổ biến FP-tree được xây dựng như sau. Đầu tiên, tạo gốc của cây, gán nhãn là “null”.
Duyệt CSDL lần thứ hai. Sắp xếp các mục trong mỗi giao dịch theo thứ tự trong L (ví dụ, sắp xếp theo thứ tự giảm dần của độ hỗ trợ) và loại bỏ những mục có số đếm hỗ trợ nhỏ hơn min-sup count. Đồng thời tạo một nhánh cây ứng với mỗi giao dịch.
Ví dụ: Sau khi duyệt CSDL lần hai, CSDL D sẽ có dạng như sau:
TID Các mục hàng đã mua Sắp xếp các mục theo thứ tự L
T01 I1, I2, I5 I2, I1, I5
T02 I2, I4 I2, I4
T03 I2, I3 I2, I3
T04 I1, I2, I4 I2, I1, I4
T05 I1, I3 I1, I3
Bảng 2.2.
Duyệt CSDL và sắp xếp theo thứ tự L.
T06 I2, I3 I2, I3
T07 I1, I3 I1, I3
T08 I1, I2, I3, I5 I2, I1, I3, I5
T09 I1, I2, I3 I2, I1, I3
Nhận thấy không có mục nào bị loại bỏ khỏi giao dịch do chúng đều có độ hỗ trợ lớn hơn 2. Duyệt giao dịch đầu tiên trong CSDL D “ T01: I1, I2, I5”, chứa 3 mục ( I2, I1, I5 theo thứ tự L), từ đó tạo ra nhánh đầu tiên của cây với ba node <I2:1>, <I1:1>, và <I5:1>, trong đó I2 được kết nối như một con của gốc, I1 liên kết tới I2, và I5 kết nối với I1 (Hình 2.6a).
Ứng với giao dịch thứ hai, “T02: I2, I4” chứa các mục I2 và I4 theo thứ tự L. Thông thường, kết quả của nhánh này là I2 kết nối với gốc và I4 kết nối với I2. Tuy nhiên, nhánh này phải chia sẻ một tiền tố chung (a common frefix) I2, đã được thiết lập trong đường đi của nhánh ứng với giao dịch T01 trước đó. Do đó, số đếm của node I2 được tăng thêm 1, và tạo một node mới , <I4:1>, liên kết như một con của <I2:2>.
Hình 2.6 a,b . Tạo cây FP-tree
Nhìn chung, khi xét đến các nhánh ứng với mỗi giao dịch khi thêm vào cây, số đếm của mỗi node có tiền tố chung sẽ tăng thêm 1, và các node của các mục theo sau tiền tố được tạo ra và được liên kết cho phù hợp.
Để thuận tiện cho việc duyệt cây, một bảng header được xây dựng bao gồm ba trường: (1) ID-mục, (2) Độ hỗ trợ ứng với từng mục, (3)Node-link. Trong đó mỗi mục trong bảng chỉ đến sự kiện của nó trong cây theo một chuỗi Node-link. Cây thu được sau khi duyệt tất cả các giao dịch trong CSDL D được thể hiện trong Hình 2.7 có biểu diễn các liên kết với chuỗi node-links. Cây FP-tree thu được đã chứa toàn bộ thông tin về CSDL. Bằng cách này, vấn đề khai phá mẫu phổ biến trong CSDL được biến đổi hoàn toàn thành khai phá cây FP-tree.
Như vậy một cây mẫu phổ biến (FP-tree) có cấu trúc như sau:
I4:1 I5:1 I1:1 I2:1 Null{} I5:1 I1:1 I2:2 Null{}
1.Bao gồm một node gốc có nhãn là “null”, một tập các cây con tiền tố (item-prefix subtree) là con của node gốc, và một bảng frequent-item-header.
2.Mỗi node trong cây con tiền tố (item-prefix subtree) bao gồm 3 trường : item- name, count và node-link. Trong đó, item-name là tên của node tương ứng với các mục trong CSDL. Count là số giao dịch được mô tả bởi một phần đường dẫn đến node này, và node-link liên kết tới node tiếp tiếp theo trong cây FP-tree có cùng tên với node (cùng item-name), hoặc bằng null nếu không có node nào cùng tên.
3.Mỗi mục trong bảng frequent-item-header bao gồm 3 trường: (1) Id_mục, (2)độ hỗ trợ và (3)node-link ( chỉ đến node đầu tiên trong cây FP-tree có item-name
trùng với Id_mục).
Từ những phân tích trên, cây FP-tree được xây dựng bằng thuật toán giả mã như sau:
Input:
CSDL giao dịch D,
Ngưỡng hỗ trợ tối thiểu min-sup.
Output: Cây mẫu phổ biến FP-tree tương ứng với CSDL giao dịch D.
Phƣơng pháp:
Cây FP-tree được xây dựng qua hai bước:
(a)- Quét CSDL lần đầu, tìm tập mục phổ biến F cùng với độ hỗ trợ của chúng. -Sắp xếp các mục trong F theo thứ tự giảm dần của độ hỗ trợ, ta có danh sách
tập mục phổ biến L đã sắp xếp.
(b)- Tạo gốc T của cây, gán nhãn T= “null”.
-Duyệt CSDL lần thứ hai, với mỗi giao dịch, loại bỏ những mục không phổ biến (độ hỗ trợ < min-sup), sắp xếp các mục phổ biến theo thứ tự L.
-Xét chuỗi [pP] là danh sách các mục đã sắp xếp của một giao dịch, trong đó, p là mục đầu tiên của danh sách, P là phần còn lại của danh sách. Gọi thủ tục
Insert_tree (string [pP],T), với T là gốc của cây FP-tree đang cần tạo. Chi tiết về thủ tục Insert_tree (string [pP],T) mô tả dưới dạng giả mã như sau:
Procedure Insert_tree ( string [pP], T);
1.If T có node con N mà N.ItemName = p Then N.Count ++; 2.Else
4. N.ItemName := p; N.Count:=1; 5. Kết nối node gốc T với N;
6. Node-link của node N kết nối tới các node có cùng tên thông qua cấu trúc node-link.
7.If P <> Then Call Insert_tree ( P, N);
Hình 2.7.Một cây FP-tree đã đƣợc nén thông tin. 2.3.2.2. Giai đoạn 2: Khai phá cây FP-tree để tìm mẫu phổ biến
x Cơ sở mẫu phụ thuộc Cây FP-tree Sinh các mẫu phổ biến
I5 {{I2,I1:1},{I2,I1,I3:1}} <I2:2,I1:2> {I2,I5:2},{I1,I5:2},{I2,I1,I5:2} I4 {{I2,I1:1},{I2:1}} <I2:2> {I2,I4:2}
I3 {{I2,I1:2},{I2:2},{I1:2}} <I2:4,I1:2>,<I1:2> {I2,I3:4},{I1,I3:4},{I2,I1,I3:2}
I1 {{I2:4}} <I2:4> {I2,I1:4}
Bảng 2.2 : Khai phá cây FP-tree bằng cách tạo các cơ sở mẫu phụ thuộc
FP-tree được khai phá như sau. Bắt đầu từ mẫu phổ biến có độ dài 1 (được coi như là một mẫu hậu tố - suffix pattern ban đầu), cấu trúc của cây được xây dựng dựa trêncơ sở mẫu phụ thuộc - conditional pattern base (được coi như là một “CSDL con – subdatabase”, bao gồm tập đường dẫn tiền tố - prefix path trong FP-tree cùng xảy ra với mẫu hậu tố), sau đó xây dựng chính cây FP-tree của nó, và thực hiện khai phá đệ quy trên một cây. Mẫu phát triển (pattern growth) hình thành bằng cách móc nối mẫu hậu tố với các mẫu phổ biến sinh ra từ một cây điều kiện FP-tree.
Khai phá FP-tree được tổng hợp trong Bảng 2.2 và chi tiết như sau. Đầu tiên chúng ta xét I5, đây là mục cuối cùng trong L. I5 xuất hiện ở hai nhánh của FP-tree trong
Hình.2.7. (Sự hiện diện của I5 trên cây FP-tree có thể dễ dàng tìm thấy bằng chuỗi
node-links của nó). Đường dẫn hình thành bởi các nhánh là <I2, I1, I5:1> và <I2, I1, I3, I5 :1>. Do đó, coi I5 như một hậu tố, bản thân nó tương ứng với hai đường dẫn tiền tố là <I2, I1 : 1> và <I2, I1, I3 : 1>, được gán cho cơ sở mẫu phụ thuộc của I5. Cây điều kiện FP-tree của nó chỉ bao gồm một đường dẫn đơn, <I2:2, I1:2>; không bao gồm I3 bởi vì số đếm hỗ trợ của nó bằng 1, ít hơn so với số đếm hỗ trợ tối thiểu (min- sup count = 2). Đường dẫn đơn sinh tất cả các liên kết (combinations) của các mẫu phổ biến : {I2, I5:2},{I1, I5:2},{I2,I1, I5:2}.
Đối với I4, hai cơ sở mẫu phụ thuộc được tạo ra dựa trên cơ sở mẫu hậu tố là {{I2 I1:1}, {I2:1}}, từ đó tạo ra cây điều kiện FP-tree chỉ có một node đơn <I2:2>, do đó nhận một mẫu phổ biến, {I2,I1:2}.
Hình 2.8. Cây điều kiện FP-Tree ứng với node I3
Giống như phân tích ở trên, cơ sở mẫu phụ thuộc của I3 là {{I2,I1:2}, {I2:2}, {I1:2}}. Cây điều kiện FP-tree của nó bao gồm hai nhánh, < I2:4, I1:2> và <I1:2>, như được thể hiện trong Hình.2.8, từ đó sinh được tập các mẫu phổ biến là , {{I2,I3:4}, {I1,I3:4}, {I2, I1,I3:2}}. Chú ý rằng mặc dầu I5 đứng ngay sau I3 trong nhánh đầu tiên, nhưng ta thấy không có I5 trong phân tích ở đây, bởi vì một vài mẫu phổ biến đã chứa I5 được phân tích ứng với lần xét I5.
Cuối cùng thì cơ sở mẫu điều kiện của I1 là {{I2:4}}, trong đó FP-tree chỉ bao gồm một node, <I2:4>,và sinh ra một mẫu phổ biến, {I2, I1:4}. Thuật toán khai phá này được tổng hợp trong Bảng 2.2.
Như vậy, để khai phá tập mục phổ biến từ cây FP-tree, ta sẽ gọi thủ tục viết dưới dạng giả mã như sau:
// là mẫu hậu tố ứng với cây Tree.
1.IfTree chứa một đường dẫn đơn PThen
2. For mỗi tổ hợp (ký hiệu bởi ) của các node trong đường P.
3. Sinh mẫu với support-count = Min (support-count của các node trong );
4.Else Với mỗi mục ai trong bảng header của Tree {
5. Sinh mẫu : = ai với support_count = ai. support_count
6. Xây dựng cơ sở mẫu phụ thuộc của , từ đó xây dựng cây phụ thuộc FP- tree của gọi là Tree.
7.IfTree <>ThenFP-growth (Tree, ) }
2.3.2.3. Ƣu điểm của phƣơng pháp FP-growth.
Phương pháp FP-growth biến đổi vấn đề tìm kiếm trên các mẫu phổ biến dài bằng tìm kiếm những mẫu ngắn hơn một cách đệ quy và sau đó móc nối thêm hậu tố. Nó sử dụng các mục phổ biến cuối cùng như một hậu tố, để đề xuất một sự lựa chọn tốt. Cách thức này thực sự đã làm giảm chi phí tìm kiếm.
Khi CSDL lớn, đôi khi xây dựng cây FP-tree dựa trên cơ sở một bộ nhớ chính là không thực tế. Một thay thế thú vị khác là đầu tiên phân chia CSDL thành một tập CSDL dự án (project databases), sau đó xây dựng một FP-tree và khai phá nó trong mỗi CSDL dự án . Áp dụng đệ quy với CSDL dự án nếu cây FP-tree của nó chưa vừa vặn trong bộ nhớ chính.
Qua nghiên cứu cho thấy phương pháp FP-growth hiệu quả đối với cả khai phá mẫu phổ biến ngắn và khai phá mẫu phổ biến dài là tốc độ xử lý nhanh hơn thuật toán Apriori.