Quét D để tính supp Tập mục Độ hỗ trợ {A} 6 {B} 7 {C} 6 {D} 2 {E} 2 Quét D để tính supp Tập mục Độ hỗ trợ {A} 6 {B} 7 {C} 6 {D} 2 {E} 2 C2 Tập mục {AB} {AC} {AD} {AE} {BC} {BD} {BE} {CD} {CE} {DE} Sinh các ứng cử C2 từ L1 C2 Tập mục Độ hỗ trợ {AB} 4/9 {AC} 4/9 {AD} 1/9 {AE} 2/9 {BC} 4/9 {BD} 2/9 {BE} 2/9 {CD} 0 {CE} 1/9 {DE} 0 Quét D để tính độ hỗ trợ cho mỗi ứng cử L2 Tập mục Độ hỗ trợ {AB} 4/9 {AC} 4/9 {AE} 2/9 {BC} 4/9 {BD} 2/9 {BE} 2/9 So sánh độ hỗ trợ của các ứng cử với minsup. C3 Tập mục {ABC} {ABE} C3 Tập mục Độ hỗ trợ {ABC} 2/9 {ABE} 2/9 Sinh các ứng cử C3 từ L2 Quét D để tính độ hỗ trợ cho mỗi ứng cử L3 Tập mục Độ hỗ trợ {ABC} 2/9 {ABE} 2/9 So sánh độ hỗ trợ của các ứng cử với minsup.
Kết quả thu được các tập mục thường xuyên L1={{A}, {B}, {C}, {D},{E}}, L2 = {{AB}, {AC}, {AE}, {BC}, {BD}, {BE}}, L3 = {{ABC}, {ABE}}.
2.5.2. Phát hiện luật kết hợp [16]
Từ tất cả các tập mục thường xuyên, chúng ta có thể sinh các luật thỏa mãn độ tin cậy cực tiểu minconf và độ hỗ trợ cực tiểu minSup. Với mỗi tập mục thường xuyên l, chúng ta tìm tất cả các tập con không rỗng của l, mỗi tập con a của l, sinh ra luật có dạng a (l-a) sao cho có độ tin cậy lớn hơn hoặc bằng minconf. Để cải tiến thủ tục sinh những tập mục con của một tập thường xuyên theo kiểu đệ qui. Ví dụ cho tập mục ABCD, đầu tiên sinh xem xét các tập con ABC, sau đó đến AB, .... Nếu tập con a của tập mục thường xuyên l sinh ra luật a (l-a) không thỏa minconf thì chúng ta không cần xét đến những luật có tiền đề là tập con của tập a. Chẳng hạn: nếu luật ABC D không thỏa minconf thì không cần xét đến luật ABCD.
Thuật toán 2.4 tìm luật kết hợp từ các tập mục thường xuyên
For tất cả các tập mục thường xuyên lk k 2 Do gọi genrules(lk: tập k-mục, lk : tập k-mục) procedure genrules(lk: Frequent k-items, am :
Frequent m-items)
A = {(m-1)-itemsets am-1 | am-1 am};
For (all am-1 A ) Do
{
conf = supp(lk)/supp(am -1)
{
output the rule am-1 (lk – am-1)
//với độ tin cậy là conf và độ hỗ trợ = supp(lk)
If (m-1) > 1 Then
call genrules(lk, am-1)
// Sinh các luật với tiền đề là tập con của am-1
} }
Thuật toán nhanh hơn:
Thuật toán trên chúng ta đã xét nếu luật a (l-a) không thỏa mãn độ tin cậy thì luật a* (l- a*) cũng không thỏa độ tin cậy, với a* a. Nghĩa là một luật không thỏa đối với tập cha thì cũng không thỏa đối với tập con của nó. Điều đó cũng có thể áp dụng cho chiều ngược lại: nếu a*
(l- a*) thỏa độ tin cậy thì luật a (l-a) cũng thỏa mãn độ tin cậy với bất kỳ a* a.
Ví dụ: nếu luật AB CD thỏa độ tin cậy thì luật ABC D cũng thỏa độ tin cậy.
Như vậy, từ tập mục thường xuyên lk trước hết chúng ta sinh tất cả các luật có một mục ở phần kết luận, sau đó sử dụng kết luận của các luật này và hàm apriori-gen trong phần 2.5.1 để sinh tất cả kết luận của luật bao gồm 2- mục, 3-mục,.... Thuật toán sau sẽ mô tả ý tưởng này.
Thuật toán 2.5 tìm luật kết hợp từ các tập mục thường xuyên tối ưu hơn.
{
H1 = {các phần kết luận 1-mục nhận được từ lk} ap-genrules(lk, H1)
}
Procedure ap-genrules (lk: Frequent k-items, Hm: Frequent m-items) IF (k > m+1) Then { Hm+1 = Apriori-gen(Hm) For (all hm +1 Hm+1) Do {
conf = supp(lk)/supp(lk- hm +1)
If (conf minconf) Then
output the rule (lk – hm+1) hm+1
//với độ tin cậy là conf và độ hỗ trợ = supp(lk) else delete hm+1 from Hm+1
}
ap-genrules(lk, Hm*1) }
2.5.3. Cấu trúc dữ liệu cho thuật toán [9]
Để tăng hiệu quả cho việc tìm các tập mục thường xuyên và tính độ hỗ trợ cho các tập ứng cử thuật toán sử dụng cấu trúc cây băm để lưu trữ các tập mục ứng cử Ck. Mỗi nút của cây băm hoặc chứa một danh sách của các mục
(nút lá) hoặc là một bảng băm. Trong mỗi nút, mỗi cụm (bucket) của bảng băm trỏ tới một nút khác. Gốc của cây băm được xem có độ sâu l. Nút trong ở độ sâu d thì con trỏ trỏ tới các nút ở độ sâu d + 1. Các tập mục được lưu trữ trong các nút lá. Tất cả các nút được tạo ra ban đầu đều là nút lá. Khi số tập mục trong các nút lá vượt quá ngưỡng cho trước, thì nút lá được chuyển thành nút trong. Để thêm một tập mục c vào cây, chúng ta xuất phát từ gốc duyệt trên cây cho đến khi tìm được nút lá phù hợp như sau: ở tại mỗi nút trong ở độ sâu d, chúng ta quyết định đi theo nhánh nào bằng cách sử dụng hàm băm đối với mục c[d] của tập mục c.
Để tìm tập mục ứng cử có chứa trong giao tác T, chúng ta bắt đầu từ nút gốc: nếu là nút lá chúng ta xét xem có tập ứng cử nào trong giao tác T không, chúng ta xem xét các tập mục trong nút lá có được chứa trong T không để trả lời. Trường hợp ở nút trong và là kết quả của việc áp dụng hàm băm cho mục thứ i của giao tác T, thì ta băm tiếp mục (i +1) trong giao tác T và áp dụng đệ quy thủ tục cho đến khi tìm được cụm có chứa tập ứng cử trong giao tác.
Vậy thuật toán Apriori là thuật toán khai phá luật kết hợp trên cơ sở sinh các tập tập ứng cử để tìm các tập mục thường xuyên từ những ứng cử đó. Thuật toán được đưa ra đã thúc đẩy phương pháp khai phá luật kết hợp phát triển và sinh các luật kết hợp nhanh. Thuật toán là cơ sở cho sự phát triển của các thuật toán sau này.
2.6. THUẬT TOÁN FP_GROWTH
Ở phần trước, đã trình bày thuật toán kinh điển Apriori về khai phá luật kết hợp, thuật toán này là một bước đột phá về khai phá các tập mục thường xuyên bằng cách sử dụng kỹ thuật tỉa để rút gọn kích thước của các tập mục
ứng cử. Tuy nhiên, trong trường hợp số tập mục nhiều, tập mục dài hoặc ngưỡng độ hỗ trợ nhỏ thì thuật toán gặp phải hai chi phí lớn:
+ Sinh ra số lượng khổng lồ các tập mục ứng cử. Ví dụ nếu có 104 tập mục 1_mục thường xuyên thì sẽ sinh ra hơn 107
tập mục 2_mục ứng cử và thực hiện kiểm tra xem tập mục nào thường xuyên. Hơn nữa, để phát hiện ra các tập mục thường xuyên có kích thước l, thuật toán phải kiểm tra 2l
– 2 các tập mục thường xuyên tiềm ẩn.
+ Phải duyệt qua cơ sở dữ liệu nhiều lần. Số lần duyệt cơ sở dữ liệu của thuật toán Apriori bằng độ dài của tập mục thường xuyên dài nhất tìm được. Trong trường hợp tập mục thường xuyên dài và cơ sở dữ liệu lớn thì không thể thực hiện được. Thuật toán Apriori phù hợp cho cơ sở dữ liệu thưa (sparse), còn với cơ sở dữ liệu dày (dense) thì thuật toán thực hiện kém hiệu quả.
Để khắc phục những chi phí lớn của thuật toán Apriori năm 2000 Jiawei Han, Jian pei và Yiwen Yin [5] đã đưa ra thuật toán mới được gọi là FP- GROWTH để tìm các tập mục thường xuyên bằng cách không sinh các tập mục ứng cử từ các tập mục thường xuyên trước mà vẫn hiệu quả bằng cách sử dụng ba kỹ thuật sau:
Thứ nhất, thuật toán sử dụng cấu trúc cây mẫu thường xuyên (frequent pattern tree) FP_Tree để nén dữ liệu. Cấu trúc FP_Tree là mở rộng của cấu trúc cây prefix. Những nút trong trong cây là các mục có độ dài 1, được gán nhãn bởi tên mục và được sắp xếp theo tần suất xuất hiện của các mục để các mục có số lần xuất hiện nhiều thì sẽ chia sẻ nhiều hơn.
Thứ hai, khai phá phát triển từng đoạn mẫu dựa trên FP_Tree, bắt đầu từ mẫu thường xuyên có kích thước 1 và chỉ kiểm tra trên cơ sở mẫu phụ thuộc
(conditional pattern base), khởi tạo FP_tree của mẫu phụ thuộc, thực hiện khai phá đệ qui trên cây này. Mẫu kết quả nhận được qua việc kết nối mẫu hậu tố với mẫu mới được sinh từ FP_Tree phụ thuộc.
Thứ ba, dùng kỹ thuật tìm kiếm phân hoạch không gian tìm kiếm và chia để trị để chia nhiệm vụ khai phá thành những nhiệm vụ nhỏ hơn và giới hạn lại các mẫu làm làm giảm không gian tìm kiếm.
2.6.1. Cây mẫu thường xuyên
Cây mẫu thường xuyên là cây có cấu trúc được định nghĩa như sau:
Định nghĩa 2.6 [5] FP_Tree bao gồm nút gốc có nhãn “Null”, tập các cây con prefix như là cây con của nút gốc và một bảng tiêu đề các mục thường xuyên.
Mỗi nút của cây con prefix có 3 trường: Item_name, count, nút liên kết (node link); với item_name là nhãn của nút, count: số giao tác mà mục này xuất hiện, node_link dùng để liên kết với nút tiếp theo trong cây nếu có cùng Item_name hay là Null nếu không có.
Mỗi lối vào trong bảng tiêu đề có hai trường: Item_name và node_link, nút liên kết trỏ tới nút đầu tiên trong FP_tree có chứa nhãn Item_name.
Ví dụ: cho cơ sở dữ liệu với các giao tác và các mục thường xuyên trong mỗi giao tác được sắp xếp giảm dần theo độ hỗ trợ (minSup = 3/5) được thể hiện trong bảng sau:
TID Các mục trong giao tác Các mục thường xuyên được sắp xếp. T100 f, a, c, d, g, i, m, p f, c, a, m, p T200 a, b, c, f, l, m, o f, c, a, b, m T300 b, f, h, j, o f, b T400 b, c, k, s, p c, b, p T500 a, f, c, l, p, m, n f, c, a, m, p
Bảng 2.4 Các giao tác cơ sở dữ liệu.