Lấy I = {a1,a2, ... ,am} là một tập các phần tử, và một cơ sở dữ liệu giao dịch DB = {T1,T2, ... ,Tn} với Ti (i∈[1..n]) là một giao dịch chứa một tập phần tử trong I. Độ hỗ trợ (hay tần suất xuất hiện) của mẫu A, là một tập các phần tử, là số giao dịch có chứa A trong DB. A là một mẫu thường xuyên nếu độ hỗ trợ của A không nhỏ hơn một ngưỡng nhỏ nhất chọn trước
ξ.[6]
Cho trước một cơ sở dữ liệu DB và một ngưỡng hỗ trợ nhỏ nhất ξ, việc tìm toàn bộ tập các mẫu thường xuyên được gọi là khai phá các mẫu thường xuyên.
4.4.1.1 Cây mẫu thường xuyên
Để thiết kế một cấu trúc dữ liệu tối ưu cho việc khai phá các mẫu thường xuyên có hiệu quả, trước tiên ta xét một ví dụ.
Ví dụ 1
Lấy một cơ sở dữ liệu giao dịch DB làm 2 cột đầu của Bảng 4.4 và ξ=3. Một cấu trúc dữ liệu tối ưu có thể được thiết kể dựa vào các nhận xét sau:
1. Vì chỉ có những phần tử thường xuyên được xem xét trong quá trình khai phá các mẫu thường xuyên nên không cần thiết phải thực hiện quét DB để phát hiện ra tập các phần tử thường xuyên (với việc đếm tần suất là kết quả phụ)
2. Nếu ta lưu trữ tập các phần tử thường xuyên của mỗi giao dịch trong một cấu trúc tối ưu thì có thể bỏ qua bước quét DB lặp đi lặp lại.
Nguyễn Tiến Thành – Công nghệ phần mềm K44 54
Kỹ thuật khai phá dữ liệu và ứng dụng xây dựng cơ sở tri thức
3. Nếu có nhiều giao dịch cùng chia sẻ một tập phần tử thường xuyên, chúng có thể được ghép lại thành một giao dịch với số lần xuất hiện được ghi nhận bằng cách đếm. Có thể dễ dàng kiểm tra xem 2 tập có giống nhau hay không nếu các phần tử thường xuyên trong tất cả các giao dịch đều được sắp xếp theo một trật tự nhất định.
4. Nếu 2 giao dịch cùng chia sẻ một tiền tố chung, theo các thứ tự sắp xếp của các phần tử thường xuyên, phần chung này có thể được gộp lại bằng cách sử dụng một cấu trúc tiền tố với điều kiện là số đếm được ghi nhận chính xác. Nếu các phần tử thường xuyên được sắp xếp theo thứ tự giảm dần của tần suất xuất hiện thì sẽ có nhiều khả năng các xâu tiền tố được chia sẻ.
TID Các phần tử trong giao dịch
Các phần tử thường xuyên (theo thứ tự) 100 f,a,c,d,g,i,m,p f,c,a,m,p 200 a,b,c,f,l,m,o f,c,a,b,m 300 b,f,h,j,o f,b 400 b,c,k,s,p c,b,p 500 a,f,c,e,l,p,m,n f,c,a,m,p Bảng 4.4 CSDL cho thuật toán FP-growth
Nguyễn Tiến Thành – Công nghệ phần mềm K44 55 gốc f : 4 c : 3 a : 3 m : b : 1 b : 1 c : 1 b : 1 p : 1
Hình 4.1 Ví dụ một cây FP
Với những nhận xét trên, ta có thể xây dựng một cây mẫu thường xuyên như sau:
Thứ nhất, quét DB để được danh sách các phần tử thường xuyên {(f:4); (c:4); (a:3); (b:3); (m:3); (p:3)} (con số sau dấu “:” biểu thị độ hỗ trợ), với các phần tử được sắp xếp theo thứ tự giảm dần của tần suất xuất hiện. Thứ tự này là quan trọng vì mỗi con đường trong cây sẽ đi theo thứ tự này. Để thuận tiện, các phần tử thường xuyên trong mỗi giao dịch được liệt kê theo thứ tự này trong cột thứ 3 của Bảng 4.4.
Thứ hai, ta có thể tạo ra gốc của cây, được gán nhãn “null”. Quét DB lần thứ hai. Quát trình quét giao dịch thứ nhất sẽ tạo ra nhánh thứ nhất của cây : {(f:1); (c:1); (a:1); (m:1); (p:1)}. Chú ý rằng các phần tử thường xuyên trong giao dịch được sắp xếp theo thứ tự danh sách các phần tử thường xuyên. Với giao dịch thứ hai, vì danh sách các phần tử thường xuyên của nó {f,c,a,b,m} có cùng tiền tố {f,c} với con đường đã có {f,c,a,m,p} số đếm của mỗi nút theo tiền tố được tăng lên 1 và một nút mới (b:1) được tạo ra là nút con của nút (a:2) và một nút khác (m:1) được tạo ra và là nút con của (b:1). Với giao dịch thứ ba, vì danh sách các phần tử thường xuyên của nó {f,b} chỉ có chung nút {f} với cây con f-tiền tố, số đếm cảu f được tăng lên 1 và một nút mới (b:1) được tạo ra và là con của nút (f:3). Quá trình quét giao dịch thứ tư sẽ dẫn đến việc tạo ra nhánh thứ hai của cây {(c:1); (b:1); (p:1)}. Với giao dịch cuối cùng, vì danh sách các phần tử thường xuyên của nó {f,c,a,m,p} giống với giao dịch đầu nên có đường đi chung với số đếm của mỗi nút trên đường tăng lên 1.
Nguyễn Tiến Thành – Công nghệ phần mềm K44 56
Kỹ thuật khai phá dữ liệu và ứng dụng xây dựng cơ sở tri thức
Để việc đi theo cây được thuận tiện, một bảng header được tạo với mỗi phần tử thể hiện sự có mặt trong cây qua phần đầu của một liên kết nút. Các nút có tên phần tử giống nhau được nối với nhau theo thứ tự giống như liên kết nút. Sau khi quét tất cả các giao dịch, cây với liên kết nút tương ứng được biểu thị trên hình 4.1.
Ví dụ này sẽ dẫn đến việc thiết kế và xây dựng một cấu trúc cây mẫu thường xuyên:
Định nghĩa 1
Một cây mẫu thường xuyên (cây FP) là một cấu trúc cây được định nghĩa như sau:
1. Bao gồm một gốc có nhãn “null”, một tập các cây con tiền tố và một bảng header các phần tử thường xuyên.
2. Mỗi nút trong cây con tiền tố bao gồm 3 trường : tên phần tử, số đếm và liên kết nút để ghi nhận những phần tử được biểu diễn trong nút, số lượng các giao dịch được biểu diễn bởi thành phần của đường đi tới nút đó, và liên kết nút để liên kết với nút tiếp theo trong cây FP, bao gồm tên phần tử hoặc null nếu không có nút nào.
3. Mỗi phần tử trong bảng header các phần tử thường xuyên bao gồm 2 trường, tên phần tử và head của liên kết nút, trỏ vào nút đầu tiên trong cây FP có tên phần tử đó
Theo định nghĩa trên, ta có thuật toán xây dựng cây FP :
Thuật toán 1 (xây dựng cây FP)
Đầu vào : Một cơ sở dữ liệu giao dịch DB và một ngưỡng hỗ trợ nhỏ nhất Đầu ra : Cây mẫu thường xuyên tương ứng FP
1. Quét toàn bộ cơ sở dữ liệu giao dịch DB. Thu thập tập các phần tử thường xuyên F và độ hỗ trợ của nó. Sắp xếp F theo thứ tự độ hỗ trợ giảm dần vào danh sách các phần tử thường xuyên L.
2. Tạo gốc của cây FP, T, và gán nhãn cho nó là “null”. Với mỗi giao dịch Trans trong DB :
- Chọn và sắp xếp các phần tử thường xuyên trong Trans theo thứ tự trong L. Gọi danh sách các phần tử thường xuyên trong Trans là [p| P] với p là phần tử đầu tiên và P là danh sách còn lại. Gọi hàm insert_tree([p|P];T)
- Hàm insert_tree([p|P];T) được thực hiện như sau. Nếu T có con là N với N.item-name = p.item-name thì tăng số đếm của N lên 1; nếu không thì tạo ra nút mới N và đặt số đếm của nó là 1, liên kết cha của nó là với T và liên kết nút với nút có cùng item-name qua cấu trúc liên kết nút. Nếu P khác rỗng thì gọi đệ quy hàm insert_tree(P;N)
Phân tích : từ quá trình xây dựng cây FP, có thể thấy rằng chỉ cần đúng 2 lần quét cơ sở dữ liệu DB : lần đầu để thu thập tập các phần tử thường xuyên, lần thứ hai xây dựng cây FP. Chi phí của việc chèn một giao dịch Trans vào cây FP là O(|Trans|) với |Trans| là số lượng các phần tử thường xuyên trong Trans. Có thể thấy rằng cây FP bao gồm toàn bộ thông tin về khai phá mẫu thường xuyên
4.4.1.2 Sự hoàn chỉnh và tối ưu của cây FP
Một số đặc tính quan trọng của cây FP có thể thu được qua quá trình xây dựng cây FP.
Bổ đề 1
Nguyễn Tiến Thành – Công nghệ phần mềm K44 58
Kỹ thuật khai phá dữ liệu và ứng dụng xây dựng cơ sở tri thức
Cho một cơ sở dữ liệu giao dịch DB và một ngưỡng độ hỗ trợ, cây FP tương ứng bao gồm toàn bộ thông tin về DB có liên quan đến khai phá mẫu thường xuyên.
Phân tích. Theo quá trình xây dựng cây FP, mỗi giao dịch trong DB được ánh xạ thành một con đường trong cây FP, và thông tin về tập phần tử thường xuyên trong mỗi giao dịch được lưu trữ đầy đủ trong cây FP. Hơn nữa, một đường đi trong cây FP có thể biểu diễn các tập phần tử thường xuyên trong nhiều giao dịch khác nhau mà không bị nhập nhằng vì mọi đường đi biểu diễn giao dịch đều phải bắt đầu từ gốc của mỗi cây con tiền tố.
Bổ đề 2
Nếu không tính gốc, kích thước của một cây FP sẽ bị giới hạn bởi tổng số lần xuất hiện của các mẫu thường xuyên trong cơ sở dữ liệu và chiều cao của cây bị giới hạn bởi số lớn nhất các phần tử thường xuyên trong mỗi giao dịch.
Phân tích. Theo quá trình xây dựng cây FP, với mỗi giao dịch T trong DB sẽ tồn tại một đường đi bắt đầu từ cây con tiền tố tương ứng vì vậy tập các nút trong đường đi cũng là tập các phần tử thường xuyên trong T. Vì không phần tử thường xuyên trong bất kỳ giao dịch nào có thể tạo ra nhiều hơn một nút, gốc là nút ngoại lệ duy nhất không được tạo ra bằng cách chèn phần tử thường xuyên, mỗi nút chứa một liên kết nút và một số đếm, ta có giới hạn của kích thước cây như trong bổ đề. Chiều cao của bất kỳ cây con tiền tố nào là số lớn nhất các phần tử thường xuyên trong bất kỳ giao dịch nào của cơ sở dữ liệu, nếu như ta không xét đến nút gốc.
Bổ đề 2 cho ta thấy một lợi ích quan trọng của cây FP : kích thước của cây FP được giới hạn bởi kích thước của cơ sở dữ liệu tương ứng vì mỗi giao dịch chỉ đóng góp nhiều nhất 1 đường đi vào cây FP, với độ dài bằng số lượng các phần tử thường xuyên trong giao dịch đó. Do thường có nhiều
sự trùng lặp các phần tử thường xuyên trong các giao dịch, kích thước của cây thường nhỏ hơn rất nhiều so với cơ sở dữ liệu gốc. Không như các phương pháp tương tự Apriori phải tạo ra một số lượng ứng cử theo cấp số mũ trong trường hợp xấu nhất, phương pháp này tạo ra cây FP với một số lượng nút theo cấp số mũ.
Cây FP là một cấu trúc khá tối giản, lưu trữ thông tin cho khai phá các mẫu thường xuyên. Vì một đường đi “a1→ a2 → ... → an” trong một cây con a1-tiền tố lưu trữ tất cả các giao dịch có số lớn nhất các tập thường xuyên dưới dạng “a1→ a2 → ... → ak” với mọi 1≤ k ≤ n, kích thước của cây FP thực chất nhỏ hơn kích thước của cơ sở dữ liệu và nhỏ hơn tập các ứng cử được tạo ra trong quá trình khai phá luật liên kết.
Các phần tử trong tập phần tử thường xuyên được sắp xếp theo thứ tự độ hỗ trợ giảm dần. Các phần tử có tần suất xuất hiện cao được sắp vào gần đỉnh của cây FP và vì vậy sẽ dễ được dùng chung. Điều này cho thấy cấu trúc cây FP thường là rất tối giản.
Tuy nhiên chưa thể chắc chắn rằng cây FP luôn luôn phù hợp với bộ nhớ cho bất kỳ một cơ sở dữ liệu lớn nào.