3.1 .1 Thuật toán Apriori
3.1.3 Thuật toán FP-Growth (kỹ thuật DFS và đếm tần suất xuất hiện tập mục)
Đối với bài toán có số lượng mẫu nhiều, mẫu dài hoặc độ hỗ trợ cực tiểu thấp, việc thực hiện duyệt CSDL cho mỗi nút sẽ gặp phải hai khó khăn: chi phí cho số lượng lớn các tập ứng cử và đòi hỏi lặp lại nhiều lần duyệt CSDL để kiểm tập rất lớn các ứng cử. Thuật toán FP-Growth được giới thiệu bởi Jiawei Han, Jian Pei và Yiwen (2000) sử dụng kỹ thuật không cần sinh các ứng cử. Trong bước tiền xử lý thuật toán FP-Growth dẫn xuất cách biểu diễn rất dày đặc của dữ liệu các tác vụ, do đó cần một cây FP-tree. Việc phát sinh các ứng cử viên của FP-tree được thực hiện thông qua việc đếm các thể hiện và DFS. Ngược với hướng tiếp cận của DFS, FP- Growth không theo nút của cây từ nút phần trên mà đi trực tiếp xuống một số phần của tập mục trong không gian tìm kiếm. Trong bước thứ hai, FP-growth dùng FP- tree để dẫn xuất tất cả các giá trị hỗ trợ của tất cả các tập phổ biến.
Thuật toán FP-Growth bao gồm các kỹ thuật sau:
Mở rộng cấu trúc cây tiền tố hay cây mẫu phổ biến FP-tree dùng để nén dữ liệu thích hợp. Chỉ có các mục độ dài 1 (1-item) trong cây và các nút của cây được sắp đặt để các nút thường xuyên xuất hiện có thể dễ dàng chia sẻ với các nút có tần số xuất hiện hơn. Do đó giảm chi phí duyệt CSDL lặp lại nhiều lần.
Vì thuật toán FP-Growth bắt đầu từ mẫu phổ biến với độ dài là 1 nên nó xem xét cơ sở mẫu phụ thuộc như một CSDL con cùng với tập mẫu phổ biến cùng xuất hiện hậu tố, xây dựng cây phụ thuộc tương ứng của nó và thực hiện khai phá đệ quy trên cây này. Mẫu phát triển nhận được qua việc nối mẫu hậu tố với một đoạn được sinh ra từ cây phụ thuộc. Quá trình khai phá dựa vào phát triển các mẫu mới để tránh chi phí cho việc sinh ra một số lượng lớn các ứng cử.
Kỹ thuật tìm kiếm được dùng dựa vào chia và chế ngự thứ tự để phân rã tập các nhiệm vụ lớn thành nhỏ trong miền các mẫu thuộc CSDL nhằm thu gọn không gian tìm kiếm.
Thuật toán FP-Growth thực hiện các bước như sau:
Mô tả cấu trúc câu FP-tree nhƣ sau:
- Gốc của cây có nhãn NULL, các đường đi trên cây biểu diễn tác vụ của tập mục phổ biến đã sắp xếp.
- Các nút liên kết trên cây liệt kê các mục xuất hiện giống nhau
- Mỗi nút trong cây bao gồm: tên, mục, số đếm và con trỏ liên kết với nút khác (liên kết đến các nút tiếp theo trên cây có cùng tên)
- Các mục phổ biến trong bảng dành cho việc bắt đầu các liên kết
Thủ tục thêm một dãy các mục (đã sắp giảm dần theo độ hỗ trợ) của các tác vụ vào cây được thực hiện như sau:
1. Duyệt toàn bộ CSDL lần thứ nhất để tính độ hỗ trợ và số lần xuất hiện của mỗi mục. 2. Loại bỏ các mục không thoả ngưỡng hỗ trợ. Các mục còn lại sắp xếp theo thứ tự giảm dần của độ hỗ trợ (tức là tần suất xuất hiện của mục trong CSDL) cho kết quả vào danh sách L các mục đã sắp.
3. Duyệt lại CSDL lần thứ hai, với mỗi tác vụ t loại các mục không thoả ngưỡng hỗ trợ và thực hiện sắp xếp các mục còn lại (tức là thứ tự giảm dần theo độ hỗ trợ). Sau đó đưa toàn bộ vào cây FP-tree.
4. KPDL tìm kiếm các mẫu phổ biến trên cây FP-tree để xây dựng mà không cần duyệt lại CSDL.
Trong thuật toán trên, p là mục thứ nhất của dãy các mục, còn P là phần còn lại. Trong lần duyệt thứ hai, với mỗi tác vụ t gọi thủ tục insert_tree (t‟, T), trong đó
Thủ tục xây dựng FP-Tree gọi đệ quy Procedure Insert_tree(string [p|P], cây có gốc T)
//Nếu t có nút con N mà N.itemname=p thì N.count++;
Ngược lại {
new(N);//Tạo một nút mới N N.itemname=p;
N.count=1;
Thay đổi nút liên kết cho p và N; }
Nếu P khác rỗng thì
Gọi đệ quy insert_tree(P,N); thuật toán FP-growth
Procedure P-Growth(Tree T, A)
Nếu cây T có chứa một đường đơn P thì {
Lấy ra phần đường đơn của cây và gán đường đi đó cây P Lấy ra phần còn lại gán cho cây Q
Với mỗi tổ hợp B của các nút trong đường đi P sinh ra mẫu G=BA với độ hỗ
trợ supp(B)=độ hỗ trợ nhỏ nhất của các nút trong B
freq_pattern_set(P)=freq_pattern_set(P)G
}
Ngược lại {
For(mỗi mục ai thuộc Q {
//mỗi mục ai trong bảng kỹ thuật sắp của cây T
Sinh ra B=aiA với độ hỗ trợ=độ hỗ trợ ai
supp(B)=ai.count;
Xây dựng cơ sở mẫu phụ thuộc của B Sau đó xây dựng cây FP-Tree của B là TB;
Nếu TB thì gọi thủ tục đệ quy
freq_pattern_set(P)=FP-Growth(TB,B) }
}
Return (freq_pattern_set(P) freq_pattern_set(P) freq_pattern_set(P)*
freq_pattern_set(P))
t‟ là nội dung của các tác vụ t sau khi đã bỏ các mục không phổ biến và sắp theo thứ tự giảm dần của độ hỗ trợ, T là gốc của cây. Sau khi xây dựng FP-Tree xong, việc khai phá tìm các mẫu phổ biến chỉ cần tiến hành trên FP-tree mà không cần duyệt lại CSDL. Bắt đầu từ dưới lên củabảng header (lưu các tập mục phổ biến đã sắp thứ tự) và cây, với 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, xác định các tập mục phổ biến có xuất hiện A.
Đánh giá thuật toán:
Độ phức tạp về thời gian: chỉ duyệt CSDL 2 lần; thời gian xây dựng cây là O(n), trong đó n là số tác vụ của CSDL D. Nghĩa là độ phức tạp là tuyết tính với số các tác vụ trong CSDL D.
Độ phức tạp về không gian: O(n), trong đó n là số tác vụ trong D; độ cao của cây bị giới hạn bởi kích thước của các tác vụ lớn nhất.
Độ phức tạp về dữ liệu: thuật toán không bao giờ bị ngắt bởi độ lớn của các tác vụ; cây FP-tree luôn đầy đủ thông tin cho việc khai phá các mẫu phổ biến; loại bỏ và rút gọn thông tin không cần thiết vì mẫu không phổ biến đã được loại bỏ.
Độ phức tạp thuật toán: dùng kỹ thuật sắp xếp theo trật tự giảm dần của tần suất xuất hiện của các mục, điều đó dẫn đến các mục phổ biến hơn sẽ được chia sẻ nhiều hơn; cây FP-tree không bao giờ có độ lớn vượt qua CSDL ban đầu.