7. Bố cục luận văn
2.4.1. Các ký hiệu
D : CSDL gốc
T : tập các giao dịch cần thêm vào
U : CSDL sau khi thêm giao dịch mới vào (D ∪ T)
d : số lượng các giao dịch trong D
t : số lượng các giao dịch trong T
I : một item
SD(I) : số lần xuất hiện của I trong D
ST(I) : số lần xuất hiện của I trong T
SU(I) : số lần xuất hiện của I trong U
Sl : ngưỡng lower support đối với một pre-large itemset
Su : ngưỡng upper support đối với một large itemset, Su > Sl
Pre_ItemsD : tập pre-large item trong D Pre_ItemsT : tập pre-large item trong T Lar_ItemsT : tập large item trong T
Insert_Items : tập hợp các item trong T phải xử lý lại để cập nhật cây FUFP-tree. Branch_Items : tập hợp các item trong D phải xử lý lại để cập nhật cây FUFP-
tree.
Rescan_Items : tập hợp các item trong D cần phải xử lý lại để xác định item nào
là large.
2.4.2. Thuật toán
Giống như thuật toán FUP [9] biến c dùng để lưu lại số lượng giao dịch thêm vào kể từ lần gần nhất quét lại CSDL D. Khởi tạo ban đầu c = 0.
INPUT: d, c, Su, Sl, t, bảng Header_Table chứa đựng số lượng các tập phổ biến cùng tần số xuất hiện của chúng sắp xếp theo thứ tự giảm dần, tương ứng với cây FUFP-tree của D.
OUTPUT: Một cây FUFP-tree của CSDL U.
Bước 1: Tính f dựa vào công thức (Hong et al., 2001 [10])
( ) 1 u l u S S d f S
Bước 2: Quét T để tìm ra tập tất cả các 1-item và tần số xuất hiện của chúng. Bước 3: Chia tập 1-item vừa tìm được ở bước 2 ra 3 phần tuỳ thuộc vào những
item đó là large, pre-large hay small trong D.
Bước 4: For each I từ Bước 3 mà là large trong D do (Trường hợp 1, 2, 3) Bước 4-1: Tính SU(I) = SD(I) + ST(I)
Bước 4-2: If SU(I) / (d + c + t) ≥ Su then
Cập nhật tần số xuất hiện của I trong Header_Table. Thêm I vào tập Insert_Items (được xử lý trong bước 10) Else if Su ≥ SU(I) / (d + c + t) ≥ Sl then
Loại bỏ I khỏi bảng Header_Table, các nút con và nút cha của
I sẽ liên kết lại với nhau, SD(I) = SU(I) thêm I vào bảng pre-large table.
Else I là small trong U, loại I khỏi bảng Header_Table, các nút con và nút cha của I sẽ liên kết lại với nhau.
Bước 5: For each I từ Bước 3 là pre-large trong D do (Trường hợp 4, 5, 6) Bước 5-1: Tính SU(I) = SD(I) + ST(I)
Bước 5-2: If SU(I)/(d + c + t) ≥ Su then I là large trong U.
Thêm I vào tập Insert_Items và Branch_Items (được xử lý trong bước 8)
Else if Su ≥ SU(I)/(d + c + t) ≥ Sl then
SD(I) = SU(I), thêm I vào bảng pre-large table. Else Loại I khỏi bảng pre-large table.
Bước 6: For each I trong bước 3 là small trong D, nhưng là large hoặc pre- large trong T do (Trường hợp 7, 8)
Thêm I vào tập Rescan_Items (được xử lý trong bước 7)
Bước 7: If (t + c ≤ f) or Rescan_Items = null then nothing
Else {
For each item I Rescan_Items do {
Bước 7-1: Quét lại D để tính SD(I)
Bước 7-2: Tính SU(I) = SD(I) + ST(I)
Bước 7-3: If SU(I) / (d + c + t) ≥ Su then
I là large trong U
Thêm I vào tập Insert_Items và Branch_Items Else if Su ≥ SU(I) / (d + c + t) ≥ Sl then
SD(I) = SU(I), thêm I vào bảng pre-large table. Else Loại I khỏi bảng pre-large table.
} }
Bước 8: Thêm các item trong Branch_Items vào cuối bảng Header_Table
tuỳ thuộc vào thứ tự sắp xếp giảm dần của tần số xuất hiện.
Bước 9: For each t D tương ứng với item I trong Branch_Items do
If I không tồn tại trong nhánh nào của cây FUFP-tree ứng với t then thêm
I vào cuối của nhánh tương ứng với giao dịch t và thiết lập count = 1
Else tăng 1 vào count của I
Bước 10: For each tT tương ứng với item I trong Insert_Items do
If I không tồn tại trong nhánh nào của cây FUFP-tree ứng với t then thêm
I vào cuối của nhánh tương ứng với giao dịch t và thiết lập count = 1
Else tăng 1 vào count của I
Bước 11: If (t + c > f) then
d = d + t + c và c = 0 Else c = t + c
2.4.3. Ví dụ minh hoạ
Bảng 2.15. CSDL ban đầu [18]
Transaction No. Items
1 a, b, c, d, e, g, h 2 a, b, f, g 3 b, d, e, f, g 4 a, b, f, h 5 a, b, f, i 6 a, c, d, e, g, h 7 a, b, h, i 8 b, c, d, f, g 9 a, b, f 10 a, b, g, h
Giả sử ngưỡng Sl = 30%, Su = 50%, ta có tập large 1-itemset là {a, b, f, g, h}.
Bảng Header_Table gồm các phần tử trong tập large 1-itemset. Cây FUFP-tree được xây dựng như Hình 2.8 và tập pre-large 1-itemset như Bảng 2.16. Tập giao dịch mới cần được thêm vào thể hiện trên Bảng 2.17
Bảng 2.16. Tập pre-large 1-itemset của D [18]
Items Count
c 3
d 4
e 3
Bảng 2.17. 3 giao dịch mới cần thêm vào [18]
Transaction No. Items
1 a, b, d, f, i
2 a, b, d, i
Hình 2.8. Cây FUFP-Tree và Header_Table được xây dựng [18] Bước 1: Tính ( ) (0.5 0.3) 10 4 1 1 0.5 u l u S S d f S
Bước 2: Quét T để tìm ra tập 1-item và độ đếm hỗ trợ của từng item. Kết quả
thể hiện trên Bảng 2.18 Bảng 2.18. Tập hợp các item trong T [18] Items Frequency a 3 b 2 c 1 d 3 e 0 f 1 g 0 h 1 i 3
Bước 3: Phân chia tập các item trong T ra làm 3 phần, phụ thuộc vào các item
Bảng 2.19. Kết quả phân chia tập item trong T thành 3 phần [18] Originally large 1-itemsets Originally pre-large 1-itemsets Originally small 1- itemsets Items Count Items Count Items Count
a 3 c 1 i 3
b 2 d 3
f 1 e 0
g 0
h 1
Bước 4: Xét từng phần tử trong tập large item trong D. Ta thấy SU(a) = SD(a) + ST(a) = 8 + 3 = 11. Vì support(a) = 11 / (10 + 0 + 3) 0.5 nên a vẫn là large trong
U. Cập nhật giá trị frequency của a trong bảng Header_Table và thêm a vào tập Insert_Items. Item b cũng được xử lý như a. Tương tự như vậy support của g và h
trên U đều nhỏ hơn 0.5 nhưng lớn hơn 0.3, nên g và h là pre-large trong U, ta sẽ loại
g và h ra khỏi bảng Header_Table và cây FUFP-tree. Tính toán tương tự cho f. Sau
bước 4 ta có kết quả như sau Insert_Items = {a, b, f} và cây FUFP-tree như Hình 2.9
Hình 2.10. Cây FUFP-tree sau khi loại bỏ h [18]
Hình 2.11. Cây FUFP-tree sau bước 4 [18]
Bước 5: Xét từng phần tử trong tập pre-large item trong D. Ta thấy SU(d) = SD(d) + ST(d) = 4 + 3 = 7. Vì support(d) = 7 / (10 + 0 + 3) 0.5 nên d vẫn là large trong U. Thêm d vào tập Insert_Items và Branch_Items. Tương tự như vậy support của c trong
U là 0.4 nhỏ hơn 0.5, nhưng lớn hơn 0.3, nên c là pre-large trong U và count(c) = 4,
tương tự cho e, ta có support(e) < 0.3 nên e là small trong U, ta loại e ra khỏi bảng
pre-large table. Sau bước 5 ta có Insert_Items = {a, b, f, d}, Branch_Items = {d} Bước 6: Bởi vì item i là small trong D nhưng là large trong T, ta sẽ thêm i vào
tập Rescan_Items (sẽ được xử lý trong bước 7). Sau bước 6 thì Rescan_Items = {i}.
Bước 7: Vì t + c = 3 + 0 < f (= 4) nên ta khôn cần quét lại D
Bước 8: Những item trong Branch_Items sẽ được sắp xếp theo thứ tự giảm dần
của tần số xuất hiện, và được thêm vào cuối bảng Header_Table. Sau bước 8 bảng
Hình 2.12. Header_Table sau khi thêm d vào [18]
Bước 9: Cây FUFP-tree sẽ được cập nhật dựa vào những giao dịch trong D
tương ứng mà có chứa các item trong tập Branch_Items. Trong ví dụ này thì Branch_Items = {d}. Các giao dịch tương ứng trong D có chứa d được thể hiện trong
Bảng 2.23 và sau bước 9 ta sẽ có cây FUFP-tree như Hình 2.23
Bảng 2.20. Các giao dịch trong D có chứa d [18]
Transaction No. Items Branches
1 a, b, c, d, e, g, h b, a, d
3 b, d, e, f, g b, f, d
6 a, c, d, e, g, h a, d
8 b, c, d, f, g b, f, d
Hình 2.14. Cây FUFP-tree sau bước 9 [18]
Bước 10: Cây FUFP-tree được cập nhật dựa vào những giao dịch trong T tương
ứng mà có chứa các item trong tập Insert_Items. Trong ví dụ này thì Insert_Items = {a, b, f, d}. Các giao dịch tương ứng trong T có bất kỳ phần tử nào trong tập Insert_Items được thể hiện trong Bảng 2.21 và sau bước 10 ta sẽ có cây FUFP-tree
như Hình 2.16
Bảng 2.21. Giao dịch trong T có chứa phần tử trong Insert_Items [18]
Transaction No. Items Branches
1 a, b, d, f, i b, a, f, d
2 a, b, d, i b, a, d
3 a, c, d, h, i a, d
Hình 2.16. Cây FUFP-tree sau bước 10 [18]
Bước 11: Vì t + c = 3 + 0 < f (= 4) nên c = t + c = 3 + 0 = 3
Sau bước 11 thì cây FUFP-tree đã được cập nhật lại hoàn toàn, ở đây f – c = 1
nghĩa là ta có thể thêm một giao dịch nữa vào D mà khi cập nhật cây FUFP-tree ta không cần quét lại D. Từ cây FUFP-tree này ta sẽ áp dụng thuật toán FP-Growth [9] để tìm tập phổ biến.