Sau khi xây dựng xong FP-Tree cho cơ sở dữ liệu việc 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 cơ sở dữ liệu.
Tính chất 2.5 Khi tìm các mẫu có chứa mục ai chỉ cần tính toán cho các nút của cây con tiền tố P của ai số lần xuất hiện của các nút trong đường dẫn tiền tố bằng số lần xuất hiện của nút ai.
Thuật toán FP_growth thực hiện như sau:
Bắt đầu từ dưới lên trên của bảng header và cây, 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 có N.Item_name = A tìm tất cả các đường dẫn của các nút N đó xuất phát từ gốc của cây tới nút N. Từ các đường dẫn đó ta xây dựng cây mẫu phụ thuộc cho A. Sau đó tìm các tập mục thường xuyên có chứa A từ cây mẫu phụ thuộc này. Ví dụ lần lượt xét mục theo thứ tự từ duới lên p, m, ...., f như sau:
Xuất phát từ mục p: chiếu vào cây FP_Tree hình 2.8 ta có hai đường dẫn có chứa p là: f:4, c:3, a:3, m: 2, p:2 và c: 1, b:1, p:1.
Theo các đường dẫn trên ta có tập mục fcam xuất hiện 2 lần cùng với p, cb xuất hiện 1 lần cùng với p. Số lần xuất của mục p là 2+1=3 lần. Vì vậy ta tìm các mục thường xuyên có chứa p mà có cùng tần suất xuất hiện như p.
Từ đó ta có hai tiền đường dẫn của p là: {(f:2, c:2, a:2, m: 2)}, {(c:1, b:1)}và là cơ sở mẫu phụ thuộc. Khởi tạo cây mẫu thường xuyên trên cơ sở mẫu phụ thuộc ta được FP_Tree phụ thuộc và thực hiện khai phá đệ qui trên cây này chúng ta thu được kết quả, trong cây này chỉ có một nhánh (c:3) nên ta chỉ có tập mục thường xuyên (cp) thỏa ngưỡng minSup =3/5.
Hình 2.9 Các FP_Tree phụ thuộc.
Mục m: có tần suất xuất hiện là 3, có hai đường dẫn có chứa mục m là (f:4, c:3, a:3, m:2) và (f:4, c:3, a:3, b:1, m:1).
(Chúng ta không cần xét mục p vì tất cả các tập mục thường xuyên có chứa p đã được tìm thấy khi xử lí với mục p.)
Từ hai đường dẫn trên ta có 2 cơ sở mẫu phụ thuộc {( f:2, c:2, a:2), f:1, c:1, a:1, b:1)}. Khởi tạo cây điều kiện trên đó ta được một đường dẫn đơn <f:3, c:3, a:3> sau đó thực hiện khai phá đệ quy trên cây mẫu thường xuyên
FP-Tree tổng quát
cơ sở mẫu phụ thuộc của “cam “: (f:3) FP_Tree phụ thuộc của “cam”
cơ sở mẫu phụ thuộc của “cm “: (f:3) FP_Tree phụ thuộc của “cm”
Cơ sở mẫu phụ thuộc của “am “: (f:3, c:3) FP_Tree phụ thuộc của “am”
Root f:3 c:2 Root f:3 Root f:3 Root c:1 f:4 c:3 a:3 m:2 p:2 b:1 b:1 b:1 m:1 p:1 Cơ sở mẫu phụ thuộc của m (f:2, c:2, a:2) (f:1, c:1, a:1, b:1) Bảng tiêu đề
Mục Head of node link
f c a FP_Tree phụ thuộc của m Root f:3 c:2 a:2
này. Hình 2.9 thể hiện quá trình khai phá các mục thường xuyên. Bắt đầu thực hiện khai phá lần lượt với các nút có nhãn a, c, f thu được các tập mục thường am, cm, fm, tiếp đến thực hiện với mẫu thường xuyên (am:3) là <f:3, c:3 | am>, <f:3 | cm> thu được tập mục cam, fam, và fcm. Thực hiện với <f:3 | cam> được fcam. Như vậy với đường dẫn đơn thì kết quả khai phá có thể là tổ hợp của tất cả các mục trong đường dẫn.
Thuật toán 2.7 FP_growth
Procedure FP_growth(tree, )
{IF (cây chứa một đường đơn P)Then
For mỗi tổ hợp (kí hiệu ) của các nút trong
đường dẫn P Do
Sinh mẫu với Support= độ hỗ trợ nhỏ nhất của các nút trong
ELSE
For mỗi ai trong header của cây Do{ sinh mẫu = ai
support = ai.support
Tìm cơ sở mẫu phụ thuộc của và khởi tạo FP_Tree phụ thuộc Tree
IF Tree Then
FP_growth( Tree, )} }
Câu hỏi là thuật toán FP_growth hiệu quả như thế nào? Chỉ duyệt qua cơ sở dữ liệu 2 lần để xác định các mục thường xuyên và tạo FP_Tree. Nhờ sử dụng cấu trúc FP_Tree mà trong quá trình khai phá các mẫu thường xuyên
không cần phải duyệt lại cơ sở dữ liệu mà chỉ cần xuất phát từ các mục ai
trong bảng tiêu đề, sinh ra những cơ sở mẫu phụ thuộc, những ai đã được xử lý thì sẽ không xem xét trong khi xử lý các aj sau đó. Phân hoạch không gian tìm kiếm để thu nhỏ không gian tìm kiếm, dùng phương pháp chia để trị để phân rã ra thành những nhiệm vụ nhỏ tạo nên hiệu quả. Sắp xếp các mục giảm dần theo tần suất xuất hiện của các mục dẫn đến các mục thường xuyên hơn thì được chia sẻ nhiều hơn. Thuật toán phù hợp cho cả dữ liệu thưa, dày và mẫu dài. Đồng thời thuật toán cũng loại bỏ ngay những mục không phổ biến ngay từ đầu.
Độ phức tạp:
Độ phức tạp về thời gian:
Duyệt qua cơ sở dữ liệu 2 lần.
Thời gian xây dựng cây là O(n), trong đó n là số giao tác của cơ sở dữ liệu. Tức là tuyến tính với số giao tác.
Độ phức tạp về không gian: O(n), trong đó n là số giao tác của cơ sở dữ liệu. Độ cao của cây được giới hạn bởi giao tác có kích thước lớn nhất.