Giải thích
Bước 1: Tìm tập mục phổ biến có độ dài 1: Ta có F1= {A},{B},{C},{E} Loại bỏ {D} vì sup(D)=1 < minsup
Bước 2: Sinh tập ứng viên có độ dài 2: Ta có tập ứng viên là {A,B}, {A,C}, {A,E}, {B,C}, {B,E}, {C,E}
Bước 3: Duyệt CSDL tìm độ hỗ trợ của tập ứng viên có độ dài 2
Bước 4: Tìm tập mục phổ biến có độ dài 2: tập ứng viên độ dài 2 có độ hỗ trợ thỏa mãn minsup
Ta có F2 = {A,C},{B,C},{B,E},{C,E}
Loại bỏ {A,B} và {A,E} do độ hỗ trợ không thỏa mãn minsup
Bước 5: Sinh ứng viên có độ dài 3: ta có tập ứng viên là {B,C,E}
Loại bỏ {A,B,C} do có tập con {A,B} không phổ biến và loại bỏ {A,C,E} do có tập con {A,E} không phổ biến đều tuân theo nguyên lý Apriori
Bước 6 : Duyệt CSDL tìm độ hỗ trợ của tập ứng viên có độ dài 3
Bước 7: Tìm tập mục phổ biến có độ dài 3: tập ứng viên độ dài 3 có độ hỗ trợ thỏa mãn minsup. Ta có F3 = {B,C,E} Không sinh được tập
Các tập mục phổ biến tìm thấy là : {A}, {B}, {C}, {E}, {A,C}, {B,C}, {B,E}, {C,E},{B,C,E}
b. Sinh luật mạnh
Sinh luật và tính độ hỗ trợ của luật từ các tập mục phổ biến có 2 phần tử trở lên và so sanh với ngưỡng độ tin cậy minconf = 80%, ta có bảng sau:
Tập mục phổ biến Luật sinh ra Độ tin cậy Luật mạnh
{A,C} A =>C 100 % Yes C => A 67 % No {B,C} B => C 67 % No C => B 67 % No {B,E} B => E 100 % Yes E => B 100 % Yes {C,E} C => E 67 % No E => C 67 % No {B,C,E} B => CE 67 % No C => BE 67 % No E => BC 67 % No BC => E 100 % Yes BE => C 67 % No CE => B 100 % Yes
2.3.2. Thuật toán FP-Growth
Thuật toán kinh điển Apriori tuy đã làm giảm đáng kể số lượng tập ứng viên nhờ kỹ thuật tỉa. Tuy nhiên, trong tình huống mà số lượng tập mục lớn, cơ sở dữ liệu nhiều giao tác hoặc độ hỗ trợ tổi thiểu nhỏ, thuật toán Apriori gặp phải hai vấn đề chi phí lớn:
Chi phí cho số lượng khổng lồ các tập ứng cử. Ví dụ: nếu cứ 104 tập 1- mục phổ biến thì thuật toán Apriori sẽ cần sinh ra hơn 107 các ứng cử 2- mục và thực hiện kiểm tra sự xuất hiện của chúng.
Đòi hỏi lặp lại nhiều lần duyệt CSDL để kiểm tra tập rất lớn các ứng cử. Số lần duyệt CSDL của thuậtt Apriori bằng độ dài của mẫu phổ biến dài nhất tìm được. Trong trường hợp mẫu phổ biến dài hơn và CSDL lớn, có nhiều bản ghi, điều này là không thể thực hiện được. Thuật toán Apriori chỉ thích hợp cho các CSDL thưa (sparse), với các CSDL dày (dense) thì thuật toán thực hiện kém hiệu quả hơn.
Thuật toán tìm các tập phổ biến hiệu quả hơn thuật toán Apriori là thuật toán FP-Growth được đề xuất năm 2000 bởi J.Han, J Pei, Y.Yin và R.Mao cho phép tìm tất cả các tập phổ biến mà không cần sinh tập ứng viên nhờ vào việc sử dụng cấu trúc cây FP-Tree. Thuật toán FP-Growth gồm hai bước: bước 1 xây dựng cây FP-Tree qua hai lần duyệt CSDL, bước 2 duyệt cây FP-Tree để sinh các tập phổ biến.
2.3.2.1. Cấu trúc cây FP – Tree
Cấu trúc FP-Tree (Frequent Pattern tree ) được giới thiệu lần đầu tiên bởi các tác giả J.Han, J.Pei và Y.Yin trong bài báo "Mining FrequentPatterns without Candidate Generation" đã khắc phục được nhược điểm của thuật toán Apriori là phải phát sinh và kiểm tra một lượng lớn các ứng viên.
Cấu trúc FP-tree được dùng để tổ chức lại CSDL cho thuận lợi hơn trong quá trình tìm tập phổ biến, đồng thời các thông tin được nén trong cây FP-tree với tỉ lệ tương đối cao. Những thuận lợi đó là:
Những danh mục không đủ độ phổ biến được loại ngay từ đầu, vì vậy việc tìm tập phổ biến chỉ thao tác trên một số lượng danh mục nhỏ hơn nhiều so với toàn bộ các danh mục.
Nhiều giao dịch sẽ được nén chung trong cây FP-tree và việc này giúp giảm bớt khá nhiều thao tác trong quá trình xác định độ phổ biến của tập danh mục.
Cấu trúc FP-tree cho phép thực hiện tìm kiếm theo chiều sâu và áp dụng mô hình chia để trị khá hiệu quả.
Cây FP-tree là cấu trúc cây với một số đặc điểm sau:
Có một nút cha được đánh nhãn NULL, những nút con nối với nút cha là những thành phần chung của nhiều giao dịch được nén lại với nhau (item prefix subtree), bên cạnh cũng có một mảng các danh mục đơn phổ biến (frequent-item header table).
Mỗi nút trong item prefix subtree có ba trường dữ liệu: mã danh mục, số tích lũy và con trỏ liên kết. Mã danh mục tương ứng danh mục mà nút này đại diện, số tích lũy là số giao dịch có chứa chung phần danh mục này, con trỏ liên kết dùng để liên kết 2 nút đại diện chung một mã danh mục ở hai item prefix subtree khác nhau. Giá trị con trỏ liên kết mang giá trị rỗng khi là nút cuối cùng trong chuỗi liên kết.
2.3.2.2. Xây dựng cây FP-Tree Thuật toán tạo cây FP-tree:
Duyệt toàn bộ CSDL và xác định thứ tự của các danh mục giảm dần theo độ phổ biến và được đưa vào trong f-list. Dựa vào ngưỡng phổ biến người dùng đưa vào sẽ xác định những danh mục nào được tạo trong FP-tree và sắp xếp các danh mục trong từng giao dịch theo thứ tự trong f-list. Sau đó tạo cây FP-tree bằng cách lần lượt xét từng giao dịch trong CSDL đã được sắp xếp và loại bỏ những danh mục không đạt ngưỡng phổ biến.
Input: CSDL giao tác D, min-sup Output: Cây FP-Tree
Method
1. Duyệt D lần đầu để thu được tập F gồm các frequent item và support count của chúng. Sắp xếp các item trong F theo trật tự giảm dần của support count ta được danh sách L.
2. Tạo nút gốc R và gán nhãn “null”
Tạo bảng Header có |F| dòng và đặt tất cả các node –link chỉ đến null 3. For each giao tác T D {// Duyệt D lần 2
Chọn các item phổ biến của T đưa vào P; Sắp các item trong P theo trật tự L;
Call Insert_Tree(P, R); }
Procedure Insert_Tree(P, Node) {
1. Đặt P=[p|P-p] , với p là phần tử đầu tiên và P-p là phần còn lại của danh sách
2. Nếu Node có một nút con (child) chứa nhãn p thì tăng chỉ số đếm của nút con đó thêm 1. Nếu không có thì tạo nút con mới nhãn p với chỉ số đếm là 1, tạo liên kết với nút trong cây có cùng nhãn (hoặc được trỏ tới bởi bảng header)
Nếu P-p ≠ thì gọi Insert_Tree(P-p, child) }
Ví dụ minh họa xây dựng cây FP-Tree
Cho CSDL giao tác như dưới đây với độ hỗ trợ tối thiểu là 2. Duyệt CSDL lần đầu tiên để tìm ra các tập phổ biến 1 phẩn tử (tập L) và sắp xếp chúng theo thứ tự độ hỗ trợ giảm dần.
- Duyệt CSDL lần thứ hai để xây dựng cây FP-Tree: + Cây FP-Tree khi mới khởi tạo:
2.3.2.3. Duyệt cây FP-Tree để tìm các tập mục phổ biến (thuật toán FP- Growth)
1. Bắt đầu từ mỗi mẫu phổ biến có chiều dài 1 trong bảng header (từ item có sup nhỏ nhất), xây dựng cơ sở mẫu có điều kiện (conditional pattern base) tương ứng với mỗi mẫu
2. Xây dựng Conditional tree của mỗi cơ sở mẫu
3. Quay lại bước 1 và thực hiện cho đến khi Conditional tree là một đường dẫn đơn thì tạo các mẫu phổ biến từ Conditional Tree và tập điều kiện.
Input: cây FP-Tree của CSDL D, ngưỡng minSup Output: Một tập đầy đủ các mẫu phổ biến F
Method: Call FP-Growth(FP-Tree, null, minSup) Procedure FP-Growth(FP-Tree,prefix,minSup)
{
- If Tree chỉ chứa một đường dẫn đơn P then tạo ra các tập phổ biến kết hợp
giữa prefix và các tổ hợp của những danh mục trong P, độ phổ biến bằng giá trị tích lũy nhỏ nhất của các nút tham gia vào tổ hợp. (Sau đó kết thúc hàm)
else { lần lượt xét từng phần tử a trong header của FP-Tree và phát sinh mẫu
=prefix a có sup()= sup(a)
- Duyệt FP-Tree để có CSDL điều kiện (ký hiệu CSDL) - Dựng cây FP-Tree cho CSDL (FP-Tree )
- FP-Tree ≠ call FP-Growth(FP-Tree , , minSup) } }
Ví dụ minh họa bước khai phá cây FP-Tree:
Xét cây FP-Tree đã xây dựng trên ví dụ ở trên. Gọi hàm FP-Growth(FP-Tree0,null,2)
Xét a=I3: β = null I3 = I3:6 (sup(β)=6) (để cây điều kiện không phải là cây chỉ chứa đường dẫn đơn - không tổng quát)
- Xây dựng Conditional FP-Tree (FP- Tree ) với tập mẫu: {I1, I2: 2},{I2: 2},{I1:2}}
- MinSup=2 - L={I1: 4, I2: 4}
- Tập mẫu: {{I1, I2:2} {I2:2},{I1:2}} - Call FP-Growth(FP-Tree , β,2)
Tiếp theo xét ai = I2 ta có β =I2 U β = {I3:6, I2:4} sup (β) = sup (I2)= 4
Cơ sở mẫu có điều kiện: {{I1:2}} Cây thu được có đường dẫn đơn các mẫu phổ biến {I3, I2, I1:2}, {I2, I3: 4} Xét a = I1 ta có β =I1 U β = {I3:6, I1:4}
sup (β) = sup(I1)= 4
Cơ sở mẫu có điều kiện {Ø} Cây thu được: Null
Nhận xét về thuật toán FP-Growth:
- Ưu điểm: Thuật toán FP-growth khá hiệu quả vì sử dụng cấu trúc cây FP- tree và duyệt theo chiều sâu với mô hình chia để trị.
- Nhược điểm: Sử dụng thuật toán đệ quy nên có khả năng gây tràn bộ nhớ. Việc xây dựng cây FP-Tree tốn nhiều công sức. Năm 2003, nhóm tác giả Mohammad El-Hajj và Osmar R.Zaiane ở ĐH Alberta Edmonton, Canada đề xuất thuật toán không đệ quy khai phá cây FP-Tree đựa trên cấu trúc cây COFI-Tree.
CHƯƠNG 3. TÌM LUẬT KẾT HỢP TRONG CƠ SỞ DỮ LIỆU GIAO DỊCH CỦA SIÊU THỊ BÁN LẺ
3.1. Bài toán tìm luật kết hợp trong cơ sở dữ liệu giao dịch của siêu thị bán lẻ bán lẻ
3.1.1. Giới thiệu bài toán
Bài toán khai phá dữ liệu để tìm luật kết hợp thể hiện mối liên quan trong việc mua sắm của người tiêu dùng từ bảng dữ liệu nhị phân đã được nghiên cứu từ lâu. Trong đó, các mặt hàng có vai trò như nhau, vì chúng chỉ được đại diện bởi các hai giá trị duy nhất là 1 và 0, thể hiện cho việc chúng có được mua hay không được mua trong một giao dịch của khách hàng. Vậy khi nhà quản lý siêu thị cho rằng: trong các giao dịch, việc mặt hàng bán với số lượng cao phải có ý nghĩa hơn mặt hàng bán với số lượng ít ỏi (như việc bán 10 chiếc máy giặt phải được quan tâm hơn việc bán 1 chiếc máy giặt). Nhưng bài toán 0 và 1 lại không hề thể hiện sự khác nhau đó. Câu hỏi đặt ra là: Bài toán khai phá cơ sở dữ liệu giao dịch với giá trị không chỉ còn là 0 và 1 mà là các con số thể hiện số lượng các item giao dịch trong giao tác được thực hiện như thế nào và có sự khác biệt so với bài toán khai phá bảng giao dịch nhị phân ra sao?
Trong [14], Hilderman và các cộng sự đã đề xuất bài toán khai phá “tập mục cổ phần cao” vào năm 1997 (thuật ngữ “Tập mục cổ phần cao” được tác giả Nguyễn Huy Đức sử dụng trong [2, 5, 6] dịch từ thuật ngữ tiếng Anh “share measures”). Trong mô hình này, giá trị của các mục dữ liệu là một con số, số đó có thể là một số nguyên dương như số lượng đã bán của một mặt hàng. “Cổ phần (hay đóng góp) của một tập mục là số đo tỷ lệ đóng góp của tập mục trong cơ sở dữ liệu” [2]. Tỷ lệ đóng góp này được đo bằng tổng giá trị của tập mục trên tổng giá trị của toàn bộ bảng giao tác. Khai phá tập mục cổ phần cao là việc tìm ra tất cả các tập mục có cổ phần không nhỏ hơn một ngưỡng quy định bởi người sử dụng.
Khai phá tập mục phổ biến và khai phá tập mục cổ phần cao cho ra các kết quả khác nhau từ cùng một bảng dữ liệu. Kể cả đối với bảng dữ liệu khai phá là bảng nhị phân, kết quả này cũng không phải là giống nhau.
Ví dụ với bảng dữ liệu nhị phân sau:
TID Bánh mì Bơ Trứng Bia
2 1 1 1 0
3 1 0 1 0
4 1 0 0 0
Với ngưỡng hỗ trợ là 55%, các tập mục phổ biến tìm thấy là: {Bánh mì} (100%), {Trứng} (75%), {Bánh mì, Trứng} (75%).
Nhưng với ngưỡng cổ phần là 55%, các tập mục cổ phần cao tìm thấy lại là: {Bánh mì, Bơ, Trứng} (60%).
Trong khai phá tập mục phổ biến truyền thống, các thuật toán chủ yếu dựa vào tính chất đặc biệt của tập mục phổ biến là tính chất Apriori (mọi tập con của tập phổ biến đều là tập phổ biến – mọi tập cha của tập không phổ biến đều là tập không phổ biến). Tuy nhiên, trong mô hình khai phá tập mục cổ phần cao, tính chất này không còn đúng nữa. Như ví dụ bên trên, tập mục {Bánh mì, Bơ, Trứng} là tập mục cổ phần cao, trong khi các tập con của nó lại không phải là tập mục cổ phần cao. Vì lý do đó, việc rút gọn không gian tìm kiếm trong khai phá tập mục cổ phần cao không thể thực hiện như đối với khai phá tập mục phổ biến.
Từ năm 1997 trở lại đây, các nhà khoa học đã đề nghị một số thuật toán khai phá tập mục cổ phần cao như các thuật toán ZP, ZSP, SIP, FSM, AFSM… Trong đó thuật toán AFSM được TS Nguyễn Huy Đức cải tiến từ thuật toán FSM làm cho việc khai phá tất cả các tập mục cổ phần cao từ cơ sở dữ liệu giao tác cho trước hiệu quả và nhanh hơn [6].
3.1.2. Thuật toán khai phá tập mục cổ phần cao AFSM – Advanced Fast Share Measure) Share Measure)
3.1.2.1. Một số thuật ngữ liên quan [2]
Cho tập các mục (item) I = {i1, i2, …, in}. Một giao tác (transaction) T là một tập con I, T I. Cơ sở dữ liệu là một tập các giao tác DB = {T1, T2, …, Tm}. Một tập mục con X I, gồm k mục phân biệt được gọi là một k-tập mục. Giao tác T gọi là chứa tập mục X nếu X T.
Ký hiệu giá trị của ip (measure value) trong giao tác Tq là mv(ip, Tq), mv(ip, Tq) có giá trị là số tự nhiên (như số lượng đã bán của một mặt hàng trong giao tác). mv(ip, Tq) = 0 nếu ip Tq và mv(ip, Tq) ≥ 1 nếu ip Tq.
(total measure value) các mục dữ liệu trong cơ sở dữ liệu DB, ký hiệu là Tmv,
Tmv = ∑𝑇𝑞𝐷𝐵∑𝑖𝑝𝑇𝑞𝑚𝑣(𝑖𝑝, 𝑇𝑞).
Ký hiệu dbx là tập các giao tác chứa tập mục X, dbx={Tq|TqDB X Tq}. Cho giao tác Tq chứa tập mục X. Giá trị của tập mục X (itemset measure value) trong Tq, ký hiệu imv(X, Tq), là tổng giá trị của các mục ip trong Tq thuộc X, imv(X, Tq) = ∑𝑖𝑝𝑋𝑚𝑣(𝑖𝑝, 𝑇𝑞)với X Tq.
Cho tập mục X, dbx là tập các giao tác chứa X. Giá trị của tập mục X (local measure value), ký hiệu lmv(X), là tổng giá trị của tập mục X tại các giao tác trong dbx, tức là , lmv(X) = ∑𝑇𝑞𝑑𝑏𝑥𝑖𝑚𝑣(𝑋, 𝑇𝑞) = ∑𝑇𝑞𝑑𝑏𝑥∑𝑖𝑝𝑋𝑚𝑣(𝑖𝑝, 𝑇𝑞).
Cổ phần (share value) hay đóng góp của tập mục X, ký hiệu Sh(X), là tỉ số giữa giá trị của tập mục X và tổng giá trị của tất cả các mục trong cơ sở dữ liệu, tức là Sh(X) =𝑙𝑣𝑚(𝑋)
𝑇𝑚𝑣 .
Cho ngưỡng cổ phần tối thiểu (minimum share) minShare s% và tập mục X. X được gọi là tập mục cổ phần cao nếu Sh(X) ≥ minShare. Nếu Sh(X) ≤ minShare, X được gọi là tập mục cổ phần thấp.
Kýhiệu giá trị cổ phần tối thiểu (minimum local measure value) là min_lmv, min_lmv = minShare x Tmv, có thể thay điều kiện Sh(X) ≥ minShare bằng điều kiện lmv(X) ≥ min_lmv.
Cho CSDL giao tác DB và ngưỡng cổ phần tối thiểu minShare, khai phá tập mục cổ phần cao là tìm tập HS chứa tất cả các tập mục cổ phần cao của DB. Tức là: HS={X | X I, Sh(X)≥ minShare}.
Cho tập mục X, dbx là tập các giao tác chứa X. Giá trị theo giao tác