Thuật toán này dựa trên kỹ thuật BFS và đếm tần suất xuất hiện. Thuật toán Apriori tạo ra việc sử dụng các tính chất chặn dưới của tập mục thoả ngưỡng minsupp bằng việc tỉa bớt những ứng cử viên thuộc tập không phổ biến trước khi tính độ phổ biến chúng. Cách tối ưu có thể thực hiện được vì các thuật toán tìm kiếm ưu tiên theo chiều rộng(BFS) bảo đảm rằng các giá trị hỗ trợ của các tập của một ứng cử viên đều được biết trước. Thuật toán Apriori đếm tất cả các ứng viên có k phần tử trong một lần đọc CSDL. Phần cốt lõi của bài toán là xác định các ứng cử viên trong mỗi tác vụ. Để thực hiện được mục đích này phải dựa vào cấu trúc cây băm(hashtree). Các mục trong mỗi tác vụ được dùng để đi xuống trong cấu trúc cây băm. Bất cứ khi nào tới được nút lá của nó, nghĩa là ta đã tìm được một tập các ứng cử viên có cùng tiền tố được chứa trong tác vụ đó. Sau đó các ứng cử viên này sẽ được thực hiện tìm kiếm trong tác vụ mà nó đã được mã hoá trước thành ma trận bit. Nếu thành công, biến đếm các ứng cử viên trong cây được tăng lên.
Bài toán được phát biểu: tìm tất cả các luật kết hợp có độ hỗ trợ s thoả mãn s
s0 và độ tin cậy c c0 (s0,c0 là hai ngưỡng do người dùng xác định- còn gọi là độ hỗ trợ cực tiểu minsupp và độ tin cậy cực tiểu minconf) và ký hiêu Lk là tập k mục phổ biến, Ck là tập k mục ứng cử (cả hai tập có: độ tin cậy và độ hỗ trợ). Bài toán đặt ra được phân thành hai bước:
-Sử dụng các tập phổ biến để sinh ra các luật kết hợp với độ tin cậy minconf nào đó.
Ý tưởng chính ở đây là nếu S và X là tập mục phổ biến và X S, khi đó có thể xem XY(ở đây Y=S\X) có phải là luật mong muốn hay không bằng cách tính độ hỗ trợ c=conf(XY)=supp(S)/supp(X). Chỉ khi c minconf thì XY mới trở thành luật mong muốn.
Thuật toán sẽ thực hiện quá trình duyệt dữ liệu lặp lại
Trong lần duyệt thứ nhất tìm tất cả các độ hỗ trợ của các mục riêng biệt và xác định các mục phổ biến (thoả độ hỗ trợ cực tiểu)
Trong các lần duyệt còn lại: bắt đầu với các tập mục phổ biến là kết quả tìm được trong lần duyệt trước, sử dụng các tập mục mẫu này sinh các tập mục phổ biến tiềm năng (gọi là tập ứng cử) và tìm độ hỗ trợ thực sự của các tập mục ứng cử này khi duyệt qua dữ liệu. Mỗi lần duyệt, phải xác định được tập mục trong các tập ứng cử là tập mục mẫu cho lần duyệt tiếp theo.
Quá trình này thực hiện lặp cho đến khi không còn tập mục phổ biến nào nữa được tìm thấy.
Thuật toán Apriori sinh ra các tập ứng cử để tính trong một lần duyệt bằng việc chỉ sử dụng các tập mục đã được tìm thấy là phổ biến trong lần duyệt trước đó mà không cần quan tâm tới các tác vụ trong CSDL. Cơ sở của điều đó là bất kỳ tập con nào của tập mục phổ biến phải là phổ biến. Vì vậy các ứng cử có k mục có thể được sinh ra bằng cách kết nối các tập mục phổ biến có (k-1) mục và xoá đi các tập ứng viên nếu có chứa bất kỳ một tập con nào mà không phổ biến. Thủ tục này dẫn đến một số nhỏ hơn nhiều các tập ứng viên, hay nói cách khác là khá hiệu quả trong việc thu hẹp không gian tìm kiếm.
Thuật toán thực hiện theo cách lặp lại, trong đó tập (k-1) mục được sử dụng cho việc tìm tập k-mục. Giả sử trong lần duyệt thứ nhất tìm được L1 - tập mục phổ biến (L1=C1, tập ứng cử trùng với tập phổ biến), tiếp theo sử dụng L1 để tìm các tập hai mục phổ biến L2, thực hiện lặp để tìm L3,...,Lk và cứ như vậy cho đến khi không tìm được tập mục phổ biến nào nữa lớn hơn k mục phổ biến đã được tìm thấy.
Tập ứng cử Ck được sinh ra từ tập mục phổ biến Lk-1 kết hợp với chính nó, từ tập mục ứng cử Ck tìm ra những tập mục phổ biến đưa vào Lk. Thuật toán Apriori
mục phổ biến phải là phổ biến. Do đó, mục ứng cử Ck được tạo thành từ việc kết hợp các tập con của tập (k-1) mục phổ biến. Điều đó giúp cho giảm một số lượng lớn đáng kể các ứng cử viên, rút gọn không gian tìm kiếm.
Quá trình tìm tập mục phổ biến gồm hai bước:
Bước kết nối: Để tìm Lk là tập k - mục ứng cử được sinh ra bởi việc kết nối Lk-1 với chính nó cho kết quả là Ck. Giả sử L1 và L2 thuộc Lk-1, ký hiệu Li [j] là mục thứ j trong Li. Điều kiện là các tập mục hay mục trong tác vụ hoặc tập mục có thứ tự từ điển. Kết nối Lk-1 và Lk-1 được thực hiện như sau: các thành phần của Lk-1 kết nối nếu có chung (k-2) - mục đầu tiên, tức là hai mục L1 và L2 của Lk-1 được kết nối với nhau nếu:
(L1[1]=L2[1] L2[1]=L2[2]...L1[k-2]=L2[k-2]L1[k-1]=L2[k-1] với điều kiện (L1[k-1]<L2[k-1]) để đảm bảo không sinh thừa hoặc lặp lại.
Kết quả thu được là dãy kết nối có dạng: L1[1]L2[1]...L1[k-2]L2[k-1]
Bước tỉa: Quét CSDL và tập Ck để lấy ra tập mục phổ biến để đưa vào Lk. Các ứng cử được tính độ hỗ trợ không nhỏ hơn ngưỡng hỗ trợ cực tiểu minsupp là tập phổ biến được xác định. Tuy nhiên, có thể Ck là rất lớn, do đó phải rút gọn kích thước, để khắc phục Apriori sử dụng các tính chất để loại bỏ các tập mục không phổ biến khỏi Ck:
- Tất cả các tập con khác rỗng của tập mục phổ biến đều phổ biến. - Nếu L là tập mục không phổ biến thì mọi tập chứa nó không phổ biến. Kiểm tra tập con (k-1)này có thể làm nhanh bởi duy trì một cây băm của tất cả các tập mục phổ biến đã tìm thấy.
Thuật toán Apriori: tìm tất cả các tập mục phổ biến dựa trên cơ sở sinh các ứng cử:
Giả sử n là độ dài lớn nhất có thể đạt được của các tập được sinh ra. Vậy thì thuật toán sẽ phải duyệt toàn bộ các tác vụ (n+1) lần. Như vậy nếu bỏ qua thời gian so sánh tìm sự xuất hiện của môt mẫu trong một tác vụ thì độ phức tạp của thuật
Main Program
+ Input: CSDL D,ngưỡng độ hỗ trợ cực tiểu của các tác vụ t là minsupp +Output: L- tập mục phổ biến trong D
1. Tìm ra tập mục phổ biến, nhận được L1
For(k=2;Lk-1;k++){
Ck=apriori_gen(Lk-1,minsupp);//sinh tập ứng cử từ Lk-1
For(mỗi tác vụ t trong D){//quét D để đếm
Ct=subset(Ck,t);//lấy tập con của t mà là các ứng cử trong Ck For(mỗi ứng cử c Ct)
c.count++;//tăng bộ đếm tần suất cho c một đơn vị }
Lk={c Ck|c.count minsupp} }
Return L= Lk
Thủ tục sinh ứng cử Ck
Procedure Apriori_gen(Lk-1:tập (k-1) mục phổ biến;minsupp: độ hỗ trợ cực tiểu)
For(mỗi mục I1 Lk-1) For(mỗi mục I2 Lk-1)
If(I1[1]=I21]I1[2]=I2[2]...I1[k-2]=I2[k-2]I1[k-1]I2[k-1] ) then c=I1I2 //kết nối I1 với I2 sinh ra ứng cử c
If has_infrequent_subset(c,Lk-1) then Remove(c);//bước tỉa (xoá ứng cử c)
Else // thêm c vào Ck
Ck=Ck {c} }
Return Ck;
Kiểm tra tập con (k-1) mục của ứng cử k mục không phải là tập phổ biến
Procedure has_infrequent_subset(c:Ứng cử k mục;Lk-1: tập phổ biến (k-1) mục)
1. For(mỗi tập con (k-1) mục s của c)
2. If sLk-1 then Return TRUE;
toán Apriori là O(A) > O(n*L) trong đó L là kích thước của CSDL còn n là độ dài cần đạt được của các mẫu.
Ngoài ra, nếu như ngưỡng yêu cầu về tần số xuất hiện bị thay đổi thì thuật toán Apriori sẽ phải thực hiện lại từ đầu, điều này sẽ tổn thất rất nhiều thời gian. Apriori được xây dựng nhằm phát hiện các luật kết hợp giữa các đối tượng với độ tin cậy tối thiểu và độ trợ giúp tối thiểu.
Thuật toán AprioriTID là phần mở rộng theo hướng tiếp cận cơ bản của thuật toán Apriori. Thay vì dựa vào cơ sở dữ liệu thô, thuật toán AprioriTID biểu diễn bên trong mỗi tác vụ bởi các ứng cử viên hiện hành.
Thuật toán AprioriHybrid kết hợp cả hai hướng tiếp cận trên. Ngoài ra còn có một số các thuật toán tựa Apriori(TID), chúng được định hướng để cài trực tiếp trong SQL.
Thuật toán Apriori-DIC là một biến thể khác nữa của thuật toán Apriori. Thuật toán Apriori-DIC làm giảm đi khoảng phân biệt nghiêm ngặt giữa việc đếm và phát sinh các ứng cử viên. Bất kỳ ứng cử viên nào tới được ngưỡng minsupp, thì thuật toán Apriori-DIC bắt đầu phát sinh thêm các ứng cử viện dựa vào nó. Để thực hiện điều này, thuật toán Apriori-DIC dùng một cây tiền tố. Ngược với cây băm, mỗi nút (nút lá hoặc nút trong) của cây tiền tố được gán một ứng cử viên xác định trong tập phổ biến. Cách sử dụng cũng ngược với cây băm, bất cứ khi nào tới được một nút đều có thể khẳng định rằng tập mục đã kết hợp với nút này trong tác vụ đó. Hơn nữa, việc xác định độ hỗ trợ và phát sinh ứng cử viên khớp nhau sẽ làm giảm đi số lần duyệt CSDL.