Tải bản đầy đủ (.doc) (42 trang)

Tiểu luận khai phá dữ liệu Cài đặt thuật toán FP-growth tìm tập phổ biến và luật kết hợp

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (640.47 KB, 42 trang )

MỤC LỤC
Trang
LỜI NÓI ĐẦU 2
Chương I>Tổng quan về khai phá dữ liệu 3
1/ Mở đầu: 3
2/ Khai phá dữ liệu và quá trình phát hiện tri thức 3
3/ Một số phương pháp khai phá dữ liệu: 5
Chương II>Luật kết hợp 8
1/Một số khái niệm cơ bản: 8
2/Thuật toán tìm luật kết hợp Apriori: 9
3/Ưu điểm và khuyết điểm của thuật toán Apriori: 11
4/Một số thuật toán cải tiến thuật toán Apriori 12
4.1Thuật toán AprioriTid 12
4.2 Thuật toán FP-growth 14
Chương III>Cài đặt thuật toán FP-growth tìm tập phổ biến và luật kết hợp 16
1/Phát biểu bài toán 16
2/Thiết kế cơ sở dữ liệu 17
3/Giới thiệu một số đoạn mã chính viết bằng Java của chương trình 19
4/Hướng dẫn sử dụng chương trình 35
4.1 Một số yêu cầu cài đặt cho việc chạy chương trình 35
4.2 Hướng dẫn chạy chương trình 36
Chương IV>Kết luận & Hướng phát triển đề tài 40
1/Kết luận : 40
2/Hướng phát triển đề tài: 40
TƯ LIỆU THAM KHẢO 41
TÀI LIỆU THAM KHẢO 42
LỜI NÓI ĐẦU
Sự phát triển của ngành công nghệ thông tin đã đem lại nhiều ứng dụng cho đời
sống xã hội, quản lý kinh tế, khoa học kỹ thuật… trong đó các ứng dụng lưu trữ và
quản lý cơ sở dữ liệu ngày càng mạnh giúp cho các cá nhân hay tổ chức có thể lưu trữ
một lượng rất lớn dữ liệu. Có thể thấy cơ sở dữ liệu(CSDL) của các hệ thống siêu thị


chứa đến cả triệu các giao tác bán hàng, hay CSDL của các công ty chứng khoán
cũng chứa đến vài chục triệu các giao dịch mua bán các loại cổ phiếu…
Đối với khối lượng dữ liệu lớn như thế, theo như đánh đáng của IMB, các phương
pháp khai thác thông tin truyền thống chỉ thu được khoảng 80% thông tin từ CSDL,
phần còn lại bao gồm các thông tin mang tính khái quát, thông tin có tính quy luật
vẫn đang còn tiềm ẩn trong dữ liệu. Lượng thông tin này tuy nhỏ nhưng là những
thông tin cốt lõi và cần thiết cho tiến trình ra quyết định. Để đáp ứng được với kỳ
vọng này, các nhà nghiên cứu đã đưa ra kỹ thuật “phát hiện tri thức và khai phá dữ
liệu (KDD - Knowledge Discovery and Data Mining)” hỗ trợ tiến trình khám phá,
phân tích tổng hợp thông tin.
Trong phạm vi bài tiểu luận này, em sẽ trình bày một cách tổng quát về cơ sở lý
thuyết của phương pháp khai phá dữ liệu tìm luật kết hợp, một số thuật toán ứng dụng
tìm luật kết hợp như : thuật toán Apriori, AprioriTid, FP-growth và đồng thời trên cơ
sở lý thuyết đó em đã xây dựng một mô hình chung cho bài toán quản lý bán hàng tại
các siêu thị, ứng dụng thuật toán FP-growth để tìm ra các tập phổ biến, các luật kết
hợp của các mặt hàng trong cơ sở dữ liêu, giúp cho nhà quản lý có được các quyết
định kinh doanh tốt hơn.
Nhân đây em cũng xin gửi lời cảm ơn chân thành đến thầy PGS.TS Đỗ Phúc,
người đã tận tình giảng dạy và truyền đạt những kiến thức bổ ích trong lĩnh vực công
nghệ thông tin nói chung và bộ môn khai phá dữ liệu và kho dữ liệu nói riêng để giúp
em hoàn thành tốt bài luận này.
Mặc dù đã rất nỗ lực, cố gắng nhưng do kiến thức và thời gian có phần hạn chế,
chắc chắn sẽ có những thiếu sót và bổ sung thêm. Rất mong sự cảm thông và góp ý
của thầy.
HVTH: Nguyễn Văn Sang(CH1101128) GVHD: PGS.TS Đỗ Phúc Trang 2
Thân mến,
Nguyễn Văn Sang
Chương I> Tổng quan về khai phá dữ liệu
1/ Mở đầu:
Vào cuối những năm 1980 khái niệm khai phá dữ liệu (Data Mining) ra đời. Nó

bao hàm một loạt các kỹ thuật nhằm phát hiện ra các thông tin có giá trị tiềm ẩn trong
các kho dữ liệu. Về bản chất, khai phá dữ liệu liên quan đến việc phân tích các dữ
liệu và sử dụng các kỹ thuật để tìm ra các tri thức hữu dụng.
Năm 1989, Fayyad, Piatestsky-Shapiro và Smyth đã dùng khái niệm “Phát hiện tri
thức” trong cơ sở dữ liệu (Knowledge Discovery in Database – KDD) để chỉ toàn bộ
quá trình phát hiện các tri thức hữu dụng từ các kho dữ liệu lớn. Do đó khai phá dữ
liệu chỉ là một phần trong khái niệm “Phát hiện tri thức” ấy. Tuy nhiên nó cũng chính
là một bước đặc biệt quan trọng trong toàn bộ quá trình, sử dụng các giải thuật đặc
trưng để chiết xuất ra các giá trị tiềm ẩn từ kho dữ liệu.

Hiện nay khai phá dữ liệu được ứng dụng vào rất nhiều lĩnh vực cụ thể khác nhau
như: y tế, dầu khí, khí tượng, kinh doanh, y học, web mining, tin-sinh, tài chính và thị
trường chứng khoán, bảo hiểm
2/ Khai phá dữ liệu và quá trình phát hiện tri thức
2.1 Định nghĩa: Khai phá dữ liệu là một tập hợp các kỹ thuật được sử dụng
để tự động khai thác và tìm ra các mối quan hệ lẫn nhau của dữ liệu trong một
tập hợp dữ liệu khổng lồ và phức tạp, đồng thời cũng tìm ra các mẫu tiềm ẩn
trong tập dữ liệu đó.
Khai phá dữ liệu là một bước chủ chốt trong các bước của quá trình phát hiện
tri thức (Knowledge Discovery in Database – KDD).
2.2 Quá trình phát hiện tri thức:
Tri thức được rút ra có thể được dùng để :
• Giải thích dữ liệu nhằm cung cấp sự hiểu biết sâu sắc, thấu đáo những thông
tin hữu ích giúp cho các doanh nghiệp hiểu rõ hơn những khách hàng của họ
• Dự báo khuynh hướng mua hàng của khách hàng, định hướng kinh doanh.

HVTH: Nguyễn Văn Sang(CH1101128) GVHD: PGS.TS Đỗ Phúc Trang 3
Quá trình phát hiện tri thức là quá trình khám phá các tri thức mới và các tri
thức hữa ích ở dạng tiềm năng trong nguồn dữ liệu đã có. Các bước phát hiện tri
thức như sau:

a) Làm sạch dữ liệu (data cleaning): loại bỏ nhiễu hoặc các dữ liệu
không thích hợp.
b) Làm giàu dữ liệu (data enrichment): tích hợp dữ liệu từ các nguồn
khác nhau như: CSDL, Kho dữ liệu, file text
c) Chọn lọc dữ liệu (data selection): chọn những dữ liệu liên quan trực
tiếp đến nhiệm vụ sẽ được thu thập từ các nguồn dữ liệu ban đầu.
d) Chuyển đổi dữ liệu (data transformation): dữ liệu sẽ được chuyển đổi
về dạng phù hợp cho việc khai phá bằng cách thực hiện các thao tác nhóm hoặc
tập hợp.
e) Khai phá dữ liệu (data mining): là giai đoạn quan trọng nhất, trong đó
các phương pháp thông minh sẽ được áp dụng để trích xuất ra các mẫu dữ liệu.
f) Đánh giá mẫu (pattern evaluation): đánh giá sự hữu ích của các mẫu
biểu diễn tri thức dựa vào một số phép đo.
g) Biểu diễn dữ liệu (knowlegde presentation): sử dụng các kỹ thuật trình
diễn và trực quan hoá dữ liệu để biểu diễn tri thức khai phá được cho người sử
dụng.
HVTH: Nguyễn Văn Sang(CH1101128) GVHD: PGS.TS Đỗ Phúc Trang 4
Hình 1 – Quá trình phát hiện tri thức từ cơ sở dữ liệu
3/ Một số phương pháp khai phá dữ liệu:
a) Phương pháp qui nạp: Một cơ sở dữ liệu là một kho thông tin nhưng các
thông tin quan trọng hơn cũng có thể được suy diễn từ kho thông tin đó. Có
hai kỹ thuật chính để thực hiện việc này là suy diễn và quy nạp.
 Phương pháp suy diễn: Nhằm rút ra thông tin là kết quả logic của các
thông tin trong cơ sở dữ liệu. Phương pháp suy diễn dựa trên các sự kiện
chính xác để suy ra các tri thức mới từ các thông tin cũ. Mẫu chiết xuất
được bằng cách sử dụng phương pháp này thường là các luật suy diễn.
 Phương pháp quy nạp: Phương pháp quy nạp suy ra các thông tin được sinh
ra từ cơ sở dữ liệu. Có nghĩa là nó tự tìm kiếm, tạo mẫu và sinh ra tri thức chứ
không phải bắt đầu với các tri thức đã biết trước. Các thông tin mà phương
pháp này đem lại là các thông tin hay các tri thức cấp cao diễn tả về các đối

tượng trong cơ sở dữ liệu. Phương pháp này liên quan đến việc tìm kiếm các
mẫu trong CSDL. Trong khai phá dữ liệu, quy nạp được sử dụng trong cây
quyết định và tạo luật.
b) Phương pháp cây quyết định và luật:
 Cây quyết định: Cây quyết định là một mô tả tri thức dạng đơn giản nhằm
phân các đối tượng dữ liệu thành một số lớp nhất định. Các nút của cây
được gán nhãn là tên các thuộc tính, các cạnh được gán các giá trị có thể
của các thuộc tính, các lá mô tả các lớp khác nhau. Các đối tượng được
phân lớp theo các đường đi trên cây, qua các cạnh tương ứng với các giá
trị, thuộc tính của đối tượng tới lá.
HVTH: Nguyễn Văn Sang(CH1101128) GVHD: PGS.TS Đỗ Phúc Trang 5
Làm giàu dữ liệu
Làm sạch dữ
liệu
Chọn lọc dữ liệu
Chuyển đổi dữ liệu
Khai phá dữ liệu
Đánh giá mẫu
Biểu diễn dữ liệu
 Tạo luật: Các luật được tạo ra nhằm suy diễn một số mẫu dữ liệu có ý
nghĩa về mặt thống kê. Các luật có dạng Nếu P thì Q, với P là mệnh đề
đúng với một phần trong CSDL, Q là mệnh đề dự đoán.
Cây quyết định và luật có ưu điểm là hình thức mô tả đơn giản, mô hình
suy diễn khá dễ hiểu đối với người sử dụng. Tuy nhiên, giới hạn của nó là
mô tả cây và luật chỉ có thể biểu diễn được một số dạng chức năng và vì
vậy giới hạn về cả độ chính xác của mô hình.
c) Phương pháp mạng Neural:
Mạng Neuron là tiếp cận tính toán mới liên quan tới việc phát triển cấu trúc
toán học và khả năng học. Các phương pháp là kết quả của việc nghiên cứu mô
hình học của hệ thống thần kinh con người.

Mạng Neuron có thể đưa ra ý nghĩa từ các dữ liệu phức tạp hoặc không chính
xác và có thể được sử dụng để chiết xuất các mẫu và phát hiện ra các xu hướng
quá phức tạp mà con người cũng như các kỹ thuật máy tính khác không thể phát
hiện được. Khi đề cập đến khai thác dữ liệu, người ta thường đề cập nhiều đến
mạng Neuron. Tuy mạng Neuron có một số hạn chế gây khó khăn trong việc áp
dụng và phát triển nhưng nó cũng có những ưu điểm đáng kể.
d) Phương pháp dùng giải thuật di truyền
Giải thuật di truyền, nói theo nghĩa rộng là mô phỏng lại hệ thống tiến hóa
trong tự nhiên, chính xác hơn đó là giải thuật chỉ ra tập các cá thể được hình
thành, được ước lựợng và biến đổi như thế nào? Ví dụ như xác định xem làm thế
nào để lựa chọn các cá thể tạo giống và lựa chọn các cá thể nào sẽ bị loại bỏ. Giải
thuật cũng mô phỏng lại yếu tố gen trong nhiễm sắc thể sinh học trên máy tính để
có thể giải quyết nhiều bài toán thực tế khác nhau.
Giải thuật di truyền là một giải thuật tối ưu hóa. Nó được sử dụng rất rộng rãi
trong việc tối ưu hóa các kỹ thuật khai phá dữ liệu trong đó có kỹ thuật mạng
Neuron. Sự liên hệ của nó với các quá trình khai phá dữ liệu. Ví dụ như trong kỹ
thuật cây quyết định, tạo luật. Như đã đề cập ở phần trước, các luật mô hình hóa
dữ liệu chứa các tham số được xác định bởi các giải thuật phát hiện tri thức.
Giai đoạn tối ưu hóa là cần thiết để xác định xem các giá trị tham số nào tạo
ra các luật tốt nhất. Và vì vậy mà giải thuật di truyền đã được sử dụng trong các
công cụ khai phá dữ liệu.
e) Phương pháp tìm luật kết hợp:
HVTH: Nguyễn Văn Sang(CH1101128) GVHD: PGS.TS Đỗ Phúc Trang 6
Phương pháp này nhằm phát hiện ra các luật kết hợp giữa các thành phần dữ
liệu trong cơ sở dữ liệu. Mẫu đầu ra của giải thuật khai phá dữ liệu là tập luật kết
hợp tìm được. Ta có thể lấy một ví dụ đơn giản về luật kết hợp như sau: sự kết
hợp giữa hai thành phần A và B có nghĩa là sự xuất hiện của A trong bản ghi kéo
theo sự xuất hiện của B trong cùng bản ghi đó: A = > B.
Việc phát triển một thuật toán phải phát hiện luật này trong cơ sở dữ liệu lớn là
không khó. Tuy nhiên, vấn đề là ở chỗ có thể có rất nhiều luật kiểu này hoặc là ta

chỉ biết một tập nhỏ dữ liệu trong cơ sở dữ liệu lớn thoả mãn tiền đề của luật. Ví
dụ chỉ có số ít người mua sách tiếng anh mà mua thêm đĩa CD. Số lượng các luật
kết hợp trong một số cơ sở dữ liệu lớn gần như vô hạn. Do vậy thuật toán sẽ
không thể phát hiện hết các luật và không phân biệt được luật nào là thông tin
thực sự có giá trị và thú vị.
Nhiệm vụ của việc phát hiện các luật kết hợp là phải tìm tất cả các luật dạng X
=> B sao cho tần số của luật không nhỏ hơn ngưỡng Minsup cho trước và độ tin
cậy của luật không nhỏ hơn ngưỡng Minconf cho trước. Từ một cơ sở dữ liệu ta
có thể tìm được hàng nghìn và thậm chí hàng trăm nghìn các luật kết hợp.
HVTH: Nguyễn Văn Sang(CH1101128) GVHD: PGS.TS Đỗ Phúc Trang 7
Chương II> Luật kết hợp
1/ Một số khái niệm cơ bản:
Kí hiệu I = {i1, i2, …, im} là tập các thuộc tính được gọi là các mục dữ liệu. D là
cơ sở dữ liệu của tập các giao tác, mỗi giao tác T là một tập mục con của tập mục I, T
i

I. Mỗi giao tác T
i
có một định danh duy nhất gọi là TID (Transaction
Identification). X={i1, i2,…,ik}

I được gọi là một tập mục hay một tập k-mục nếu
nó chứa k mục. Một giao tác T được gọi là chứa tập mục X chỉ khi X

T. Mỗi giao
tác là một bộ <TID, I>, I là tập mục.
Luật kết hợp là một mối liên hệ điều kiện giữa hai tập các hạng mục dữ liệu X và
Y theo dạng sau: Nếu X thì Y, và ký hiệu là X ⇒ Y. Ta có luật kết hợp X ⇒ Y, nếu
X ⊂ I, Y ⊂ I và X ∩ Y = ∅. Chúng phụ thuộc vào 2 đại lượng cơ bản là độ hỗ trợ (S)
và độ tin cậy (C).

a) Độ hỗ trợ (Support): Độ hỗ trợ của một luật X

Y là tỉ số phần trăm của
số giao tác trong D có chứa X

Y. Kí hiệu Supp(X=>Y).
Supp(X=>Y) thể hiện phạm vi ảnh hưởng của luật trên toàn bộ cơ sở dữ liệu.
Ngưỡng nhỏ nhất của độ hỗ trợ gọi là minsupp
Supp(X=>Y)=
)(
)(
DCard
YXCard

(%) 0

Supp(X

Y)

1
Với:
Card(X

Y): tập các giao tác trên CSDL có chứa cả vế trái lẫn vế
phải.
Card(D): tập tất cả các dòng trên CSDL.
HVTH: Nguyễn Văn Sang(CH1101128) GVHD: PGS.TS Đỗ Phúc Trang 8
b)Độ tin cậy (Confidence): Độ tin cậy của một luật X


Y là tỉ số phần trăm
của số giao tác trong D chứa X

Y với số giao tác trong D có chứa tập mục X. Kí
hiệu Conf(X

Y).
Conf(X

Y) thể hiện tính chính xác, tính đúng đắn hay khả năng tin cậy của
luật trong phạm vi ảnh hưởng của luật (được xác định bởi Supp(X

Y)). Ngưỡng
nhỏ nhất của độ tin cậy gọi là minconf
Conf(X=>Y) =
(%)
)(
)(
XCard
YXCard ∪
0

Conf(X

Y)

1.
Với:
Card(X


Y): tập các giao tác trên CSDL có chứa cả vế trái lẫn vế
phải.
Card(X): tổng số dòng chứa vế trái của luật trên CSDL.
c)Large ItemSet: Tập các hạng mục dữ liệu (ItemSet) có độ hỗ trợ (Supp) lớn
hơn hay bằng giá trị của ngưỡng nhỏ nhất (minsupp).
d)Small ItemSet : Tập các hạng mục dữ liệu (ItemSet) có độ hỗ trợ (Supp)
nhỏ hơn giá trị của ngưỡng nhỏ nhất (minsupp).
 Tóm lại: Với L là một Large ItemSet, A là một tập con khác rỗng của L, nếu tỉ
lệ phần trăm giữa Support của L so với Support của A lớn hơn hay bằng độ tin cậy
nhỏ nhất (minconf) thì ta có luật kết hợp A ⇒ (L\A).
2/ Thuật toán tìm luật kết hợp Apriori:
a) Mô tả thuật toán:
Bước 1 : k:=1, tạo C1 = tập tất cả các itemsets có 1 phần tử từ tất cả các giao
tác.
Đọc cơ sở dữ liệu để tính độ hỗ trợ thỏa mãn (support >= minsup) trên C1 từ
đó rút ra được tập L1.
Bước 2 :
For (k = 2 ; Lk-1 khác rỗng ; k++)
{
• Tạo ra tập Ck, là tập các itemsets ứng viên có (k-1) phần tử, tạo
ra từ tập Lk-1.
• Duyệt qua tất cả các giao tác để tính số lần xuất hiện của các
itemsets trong Ck
HVTH: Nguyễn Văn Sang(CH1101128) GVHD: PGS.TS Đỗ Phúc Trang 9
• Tìm Lk, Lk là một tập con của Ck có chứa k phần tử với số đếm
>= minsup.
}
Bước 3 : Tạo tập LargeItemSet = L1 v L2 v v Lk
Bước 4 : Tạo các luật hợp từ tập LargeItemSet :
for each itemset l của LargeItemSet

for each s (tập con khác rỗng) của l
if confidence=count(l)/count(s) >= minconf then
xuất kết quả : s -> (l-s)
Minh họa thuật toán Apriori với minsup = 2, minconf = 50%
 Giải thích ký hiệu :
+TID : chỉ số định danh các giao tác của một itemset.
+ items : tập các mặt hàng
+ itemset : tập các mặt hàng ứng viên
+ sup : độ hỗ trợ tối thiểu
+ Ck tập các ứng viên với kích cỡ k được tạo ra bằng cách kết hợp Lk-1 với
chính nó.
+Lk : tập phổ biến với kích cỡ k.
HVTH: Nguyễn Văn Sang(CH1101128) GVHD: PGS.TS Đỗ Phúc Trang 10
Hình 2 – Minh họa các bước chạy thuật toán Apriori.
Qua minh họa khi chạy thuật toán Apriori như trên ta thấy, khi không còn tập
mục phổ biến nào được tìm thấy nữa thì thuật toán dừng lại và tập L3 là tập kết quả
nhận được.
b) Ứng dụng thực tế thuật toán Apiori vào hệ thống siêu thị:
Đầu tiên thực hiện duyệt tất cả các chi tiết hóa đơn, ta có được các giao dịch, 1
giao dịch là một quan hệ một nhiều giữa mã hóa đơn và mã mặt hàng. Do đó, chúng
ta sẽ thực hiện việc gom lại mối quan hệ một – nhiều này thành một giao dịch để sử
dụng cho thuật toán. Ở bước một của thuật toán ta đi tìm tập L1, tập mỗi mã hàng
phải có độ hỗ trợ lớn hơn hoặc bằng độ hỗ trợ tối thiểu (Minsup) của người dùng
nhập vào. các tập mục còn lại của C
1
là các tập 1-Itemset (L
1
) phổ biến. Sau đó kết nối
L
1

với L
1
để được tập các tập 2-Itemset C
2
. Duyệt CSDL xác định độ hỗ trợ của các tập
mục trong C
2
. Duyệt C
2
Loại bỏ các tập mục có độ hỗ trợ < Minsup, các tập mục còn lại
của C
2
là tập các tập 2-Itemset (L
2
) phổ biến. L
2
lại được sử dụng để sinh ra L
3
và cứ tiếp
tục như vậy cho đến khi tìm được tập mục k-Itemset

mà L
k
= ∅ (tức là không có tập
mục phổ biến nào được tìm thấy) thì dừng lại. Tập các tập mục phổ biến của CSDL là:

k
i-1
= L
1

Để tăng hiệu quả của thuật toán trong quá trình sinh các tập mục ứng cử, ta sử
dụng tính chất của tập mục phổ biến để làm giảm số lượng tập các tập ứng cử, không
phải là tập phổ biến được sinh ra. Tính chất đó là: Tập các tập con khác rỗng của tập
mục phổ biến đều là tập mục phổ biến.
3/ Ưu điểm và khuyết điểm của thuật toán Apriori:
Thuật toán kinh điển Apriori tìm tập mục phổ biến thực hiện tốt bởi rút gọn kích
thước các tập ứng cử nhờ kỹ thuật tỉa. Tuy nhiên, trong tình huống mà số các giao tác
nhiều, hoặc với độ hỗ trợ cực tiểu thấp (min supp), các thuật toán Apriori gặp phải 2
vấn đề làm ảnh hưởng tới tốc độ :
a) Vấn đề khi số lượng các tập ứng cử cực lớn có thể xảy ra tình trạng “nghẽn
cổ chai”, thuật toán sẽ phải thực hiện rất lâu khi có nhiều mặt hàng vì nó phải tạo ra
tập ứng cử ngày càng nhiều. Ví dụ: nếu có 10
4
tập phổ biến có 1 phần tử thì thuật
toán Apriori sẽ phải tạo ra 10
7
các tập ứng cử 2 phần tử. Đặt biệt cùng với min supp
càng nhỏ thì thuật toán lại càng chạy lâu hơn nữa và trở nên không khả thi.
HVTH: Nguyễn Văn Sang(CH1101128) GVHD: PGS.TS Đỗ Phúc Trang 11
b) Vấn đề thứ hai liên quan đến việc phải truy suất xuống cơ sở dữ liệu nhiều
lần để kiểm tra tập rất lớn các ứng cử thỏa độ hỗ trợ tối thiểu. Số lần duyệt CSDL của
thuật toán Apriori bằng độ dài của mẫu phổ biến dài nhất tìm được. Việc này làm ảnh
hưởng tới hiệu suất máy tính vì phải tốn chi phí cho vấn đề truy xuất phần cứng máy
(I/O). Như vậy, thuật toán Apriori chỉ thích hợp cho các CSDL nhỏ, với các CSDL
lớn thì thuật toán thực hiện kém hiệu quả.
4/ Một số thuật toán cải tiến thuật toán Apriori.
Có thể sử dụng một số thuật toán để cái tiến thuật toán Apriori như thuật toán
AprioriTid, AprioriHybrid, FP-growth, , Sau đây em xin trình bày hai thuật toán đó
là AprioriTid và thuật toán FP-growth.
4.1Thuật toán AprioriTid

Khác với thuật toán Apriori, thuật toán AprioriTid chỉ quét cơ sở dữ liệu
một lần, do đó tập ứng viên Ck kích cỡ k có thể nhỏ hơn cơ sở dữ liệu. Nếu
một giao tác không chứa k – itemset ứng viên, khi đó nó sẽ được loại ra khỏi
tập Ck. Với k có kích cỡ lớn, mỗi tập mục có thể nhỏ hơn một giao tác. Giao
tác có thể chỉ chứa một vài ứng viên. Một tập mục bao gồm tất cả các k –
itemset chứa trong giao tác. Tuy nhiên thuật toán này có một điểm bất lợi là
khi kích cỡ k nhỏ, mỗi tập mục có thể lớn hơn số giao tác tương ứng.
Trình bày thuật toán AprioriTid:
Giải thích ký hiệu :
C^
k
: tập mục lưu trữ, mỗi thành viên của C^
k
có dạng <TID, { X
k

}, với
X
k là
tập k-itemset, thể hiện một giao tác t có mã là TID.
HVTH: Nguyễn Văn Sang(CH1101128) GVHD: PGS.TS Đỗ Phúc Trang 12

k
k
kk
t
^
kt
t
kt

^
k-1
^
k
k-k
k-1
^
1
;L Answer
minsup}|c.countC { c L
;t.TID,CCthenφ)(C
c.count
Cc
items};oft.set1])c[k(c
itemsoft.setc[k]|(cC {c C
Centries t
;C
)(L C
); k 2; L( k
;database DC
itemsets} {large 1- L
=
≥∈=
>=<+≠
++

−−∈−−∧
−−∈−∈=

=

=
++≠=
=
=
end
end
end
if
;
do candidates forall

begin do forall
;genapriori-
begin do For
1
1
φ
φ
Đánh giá tốc độ của thuật toán Apriori và AprioriTid
Để đánh giá về tốc độ của thuật toán Apriori và AprioriTid, chúng em lấy
kết quả từ một dự án Quest của trung tâm nghiên cứu IBM Almaden. Kết quả
được thực hiện trên tập dữ liệu đầu vào :
Kích thước trung bình của các giao tác là 10
Kích thước trung bình của tập phổ biến tối đại là 4
Số giao tác là 100.000
Độ hỗ trợ tối thiểu là 0.75%
Hình 3 – Sơ đồ so sánh Apriori và AprioriTid
HVTH: Nguyễn Văn Sang(CH1101128) GVHD: PGS.TS Đỗ Phúc Trang 13
Kết quả cho thấy ở giai đoạn đầu Apriori hiệu quả hơn AprioriTid về mặt
thời gian, tuy nhiên AprioriTid nhanh hơn Apriori ở những giai đoạn sau. Lý

do ở những giai đoạn sau, thuật toán AprioriTid chỉ cần quét các tập ứng viên
kC
đã cố định trong bộ nhớ do nó tạo ra; trong khi thuật toán Apriori phải thực
hiện lại việc quét xuống cơ sở dữ liệu.
4.2 Thuật toán FP-growth
FP-growth là thuật toán khai thác các tập phổ biến từ cây FP-Tree mà
không tạo ra các tập ứng viên phổ biến. FP-Tree là một mở rộng của cấu trúc
cây tiền tố. Chỉ những phần tử phổ biến được lưu trên cây. Mỗi nút chứa nhãn
của phần tử cùng với tần số của nó. Đường dẫn từ nút gốc tới các nút lá được
sắp xếp theo giá trị độ hỗ trợ của các phần tử với tần số của mỗi nút cha lớn
hơn hay bằng tổng của các tần số của nút con của nó. Cấu trúc của FP-Tree
yêu cầu 2 lần quét cơ sở dữ liệu. Trong quét đầu tiên, giá trị hỗ trợ của mỗi
phần tử được tìm thấy. Các giá trị hỗ trợ tìm thấy này được dùng cho lần quét
thứ 2 để sắp xếp các phần tử trong các giao tác theo thứ tự giảm dần. Nếu 2
giao tác chia sẻ một tiền tố chung, phần chia sẽ được gộp và các tần số của nút
được tăng lên.Các nút có cùng nhãn được kết nối với một phần tử liên kết.
Phần tử liên kết được dùng để giảm nhẹ việc khai thác mẫu phổ biến. Thêm
vào đó, mỗi FP-Tree có một header chứa tất cả các phần tử phổ biến và các
con trỏ tới phần đầu của các liên kết phần tử ngữ cảnh của chúng. FP-growth
phân vùng cây FP-Tree dựa trên các tiền tố. FP-growth duyệt các đường dẫn
của FP-Tree một cách đệ quy để tạo các tập ứng viên phổ biến. Các mẫu phổ
biến được kết nối để đảm bảo tất cả các tập phổ biến được tạo ra một cách hợp
lý. Vì thế FP-growth tránh được các phép toán tốn kém cho việc tạo và kiểm
tra các tập ứng viên. Có thể tóm tắt thuật toán FP-growth làm như sau:
- Khai thác tập phổ biến không sử dụng hàm tạo ứng viên.
- Nén CSDL thành cấu trúc cây FP (Frequent Patern)
- Duyệt đệ qui cây FP để tạo tập phổ biến
Trình bày thuật toán FP-growth:
• Xây dựng cây FP-Tree từ CSDL giao tác
• Input:

• CSDL giao tác D
Ngưỡng min-sup
• Output:
Cây FP-Tree
HVTH: Nguyễn Văn Sang(CH1101128) GVHD: PGS.TS Đỗ Phúc Trang 14
• 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 supprort
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, R) {
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. if R có một con N sao cho N.item-name = p then
3. N.count ++
4. else {
5. Tạo nút mới N;
6. N.count = 1;
7. N.item-name = p
8. N. parent = R
// Tạo node-link chỉ đến item, H là bảng Header
9. N.node-link = H[p].head
10. H[p].head = N
11. }
// Tăng biến count của p trong bảng header thêm 1

12. H[p].count ++;
13. If (P-p) != null then
14. Call Insert_Tree(P-p, N) ;
}
HVTH: Nguyễn Văn Sang(CH1101128) GVHD: PGS.TS Đỗ Phúc Trang 15
Chương III> Cài đặt thuật toán FP-growth tìm tập phổ biến và luật kết hợp
1/ Phát biểu bài toán
Ngày nay trong các hệ thống siêu thị đều thấy kinh doanh ngày càng nhiều mặt
hàng, người ta có phần mềm ghi lại thông tin hóa đơn của khác hàng, thậm chí lưu
cả thông tin khách hàng khi hệ thống hỗ trợ khách hàng đặt hàng mua qua mạng,
…, những việc này giúp cho doanh nghiệp có thể quản lý mặt hàng, quản lý các
hóa đơn, thống kê lợi nhuận,…Bài viết này xây dựng một mô hình chung quản lý
được các giao dịch và cũng đồng thời xây dựng một chương trình phần mềm tìm
ra các tập mặt hàng phổ biến, các luật kết hợp có được từ cơ sở dữ liệu nhằm hỗ
trợ đắc lực cho nhà đầu tư có thêm một công cụ để ra quyết định trong kinh
doanh một cách hiệu quả.
Trên cơ cở tìm hiểu một số thuật toán tìm tập phổ biến và luật kết hợp,với sự
hiểu biết của mình, bài viết này quyết định chọn và hiện thực thuật toán FP-
growth để tìm tập phổ biến và luật kết hợp trong cơ sở dữ liệu.
HVTH: Nguyễn Văn Sang(CH1101128) GVHD: PGS.TS Đỗ Phúc Trang 16
2/ Thiết kế cơ sở dữ liệu
2.1 Lược đồ quan hệ giữa các bảng
HVTH: Nguyễn Văn Sang(CH1101128) GVHD: PGS.TS Đỗ Phúc Trang 17
CustomercusId : bigint
firstName : nvarchar
lastName : nvarchar
phone : varchar
mobile : varchar
email: varchar
street: nvarchar

code: varchar
city: nvarchar
state: nvarchar
country: nvarchar
description: nvarchar
InvoiceinvId :
bigint
cusId : bigint
date : datetime
InvoiceDetailid :
bigint
invId : bigint
proId: bigint
quantity: int
ProductproId :
bigint
name : nvarchar
providerId: varchar
description : nvarchar
1…n1
1…n
1
1 1…n
Hình 4 – Sơ đồ mối quan hệ giữa các bảng.
Tổng quan về sơ đồ mối quan hệ giữa các bảng :
Mối quan hệ giữa bảng khách hàng và hóa đơn là một nhiều, ngược lại bảng hóa
đơn với khách hàng là nhiều một. Vì mối quan hệ giữa bảng hóa đơn và mặt hàng là
nhiều – nhiều, nên ta thiết kế thêm một bảng cho dễ quản lý là bảng chi tiết hóa đơn,
đưa về mối quan hệ một nhiều giữa bảng hóa đơn và chi tiết hóa đơn, và một nhiều
giữa bảng mặt hàng và chi tiết hóa đơn. Thông tin các cột của bác bảng :

Customer (Khách hàng) :
• cusId : mã khách hàng
• firstName: tên riêng
• middleName: tên đệm
• lastName: tên họ
• phone: số điện thoại bàn
• mobile: số điện thoại di động
• email: địa chỉ email
• street: đường phố
• code: mã quốc gia
• city: thành phố
• state: tỉnh
• country: quốc gia
• description: mô tả thêm
Invoice (Hóa đơn) :
• invId: mã hóa đơn
HVTH: Nguyễn Văn Sang(CH1101128) GVHD: PGS.TS Đỗ Phúc Trang 18
• cusId: mã khách hàng
• date: ngày hóa đơn
InvoiceDetail (Chi tiết hóa đơn)
• id : mã chi tiết hóa đơn
• invId: mã hóa đơn
• proId: mã mặt hàng
• quantity: số lượng mặt hàng
Product (Mặt hàng)
• proId : mã mặt hàng
• price : đơn giá của mặt hàng
• name : tên mặt hàng
• providerId: mã nhà cung cấp
• description : mô tả mặt hàng

3/ Giới thiệu một số đoạn mã chính viết bằng Java của chương trình
Lớp : FPGrowthAlgo_AssRules, thực hiện xây dựng thuật toán tạo luật kết
hợp.
package associationrules.fpgrowth;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class FPGrowthAlgo_AssRules {
private Itemsets patterns;
BufferedWriter writer = null;
long startTimestamp = 0;
long endTimeStamp = 0;
private double minconf;
private int ruleCount = 0;
private int databaseSize = 0;
private double minlift;
private boolean usingLift = true;
HVTH: Nguyễn Văn Sang(CH1101128) GVHD: PGS.TS Đỗ Phúc Trang 19
public FPGrowthAlgo_AssRules(double minconf) {
this.minconf = minconf;
this.minlift = 0;
usingLift = false;
}
public FPGrowthAlgo_AssRules(double minconf,
double minlift) {
this.minconf = minconf;

this.minlift = minlift;
usingLift = true;
}
/**
* This is the main method of FP-grownth algorithm for generating
association rules.
*/
public List<String> runAlgorithm(Itemsets patterns, int databaseSize)
throws IOException {
List<String> result = new ArrayList<String>();
startTimestamp = System.currentTimeMillis();
ruleCount = 0;
this.patterns = patterns;
this.databaseSize = databaseSize;
//writer = new BufferedWriter(new FileWriter(output));
// For each frequent itemset of size >=2
for (int k = 2; k < patterns.getLevels().size(); k++) {
for (Itemset lk : patterns.getLevels().get(k)) {
// create H1
Set<Itemset> H1 = new HashSet<Itemset>();
for (Itemset itemsetSize1 : patterns.getLevels().get(1)) {
if (lk.contains(itemsetSize1.getItems().get(0))) {
H1.add(itemsetSize1);
}
}
HVTH: Nguyễn Văn Sang(CH1101128) GVHD: PGS.TS Đỗ Phúc Trang 20
Set<Itemset> H1_for_recursion = new HashSet<Itemset>();
for (Itemset hm_P_1 : H1) {
Itemset itemset_Lk_minus_hm_P_1 =
lk.cloneItemSetMinusAnItemset(hm_P_1);

calculateSupport(itemset_Lk_minus_hm_P_1);
double conf = ((double) lk.getAbsoluteSupport())
/ ((double)
itemset_Lk_minus_hm_P_1.getAbsoluteSupport());
if (conf < minconf) {
continue;
}
if (minlift > 0) {
calculateSupport(hm_P_1);
double lift = conf / hm_P_1.getAbsoluteSupport();
if (lift < minlift) {
continue;
}
}
Rule rule = new Rule(itemset_Lk_minus_hm_P_1, hm_P_1,
lk.getAbsoluteSupport(), conf);
result.addAll(getAssRules(rule));
H1_for_recursion.add(hm_P_1);
}
apGenrules(result, k, 1, lk, H1_for_recursion);
}
}
// close the file
//writer.close();
endTimeStamp = System.currentTimeMillis();
HVTH: Nguyễn Văn Sang(CH1101128) GVHD: PGS.TS Đỗ Phúc Trang 21
return result;
}
private void apGenrules(int k, int m, Itemset lk, Set<Itemset> Hm)
throws IOException {

if (k > m + 1) {
Set<Itemset> Hm_plus_1 = generateCandidateSizeK(Hm);
Set<Itemset> Hm_plus_1_for_recursion = new HashSet<Itemset>();
for (Itemset hm_P_1 : Hm_plus_1) {
Itemset itemset_Lk_minus_hm_P_1 =
lk.cloneItemSetMinusAnItemset(hm_P_1);
calculateSupport(itemset_Lk_minus_hm_P_1);
double conf = ((double) lk.getAbsoluteSupport())
/ ((double) itemset_Lk_minus_hm_P_1.getAbsoluteSupport());
if (conf < minconf) {
continue;
}
if (minlift > 0) {
calculateSupport(hm_P_1);
double lift = conf / hm_P_1.getAbsoluteSupport();
if (lift < minlift) {
continue;
}
}
Rule rule = new Rule(itemset_Lk_minus_hm_P_1, hm_P_1,
lk.getAbsoluteSupport(), conf);
saveToFile(rule);
Hm_plus_1_for_recursion.add(hm_P_1);
}
apGenrules(k, m + 1, lk, Hm_plus_1_for_recursion);
}
}
private void saveToFile(Rule rule) throws IOException {
ruleCount++;
HVTH: Nguyễn Văn Sang(CH1101128) GVHD: PGS.TS Đỗ Phúc Trang 22

StringBuffer buffer = new StringBuffer();
// write itemset 1
for (int i = 0; i < rule.getItemset1().size(); i++) {
buffer.append(rule.getItemset1().get(i));
if (i != rule.getItemset1().size() - 1) {
buffer.append(",");
}
}
// write separator
buffer.append(" ==> ");
// write itemset 2
for (int i = 0; i < rule.getItemset2().size(); i++) {
buffer.append(rule.getItemset2().get(i));
if (i != rule.getItemset2().size() - 1) {
buffer.append(",");
}
}
// write separator
buffer.append(" sup= ");
// write support
buffer.append(rule.getRelativeSupport(databaseSize) + " %");
// write separator
buffer.append(" conf= ");
// write confidence
buffer.append(rule.getConfidence());
if (usingLift) {
buffer.append(" lift= ");
buffer.append(rule.getLift());
}
writer.write(buffer.toString());

writer.newLine();
writer.flush();
}
/**
* Round and get folowing decimalPlace.
* @param value
* @param decimalPlace
HVTH: Nguyễn Văn Sang(CH1101128) GVHD: PGS.TS Đỗ Phúc Trang 23
* @return
*/
public static double round(double value, int decimalPlace) {
double power_of_ten = 1;
while (decimalPlace > 0) {
power_of_ten *= 10.0;
}
return Math.round(value * power_of_ten) / power_of_ten;
}
private List<String> getAssRules(Rule rule) {
List<String> result = new ArrayList<String>();
ruleCount++;
StringBuilder builder = new StringBuilder();
// write itemset 1
for (int i = 0; i < rule.getItemset1().size(); i++) {
builder.append(rule.getItemset1().get(i));
if (i != rule.getItemset1().size() - 1) {
builder.append(", ");
}
}
// write separator
builder.append(" > ");

// write itemset 2
for (int i = 0; i < rule.getItemset2().size(); i++) {
builder.append(rule.getItemset2().get(i));
if (i != rule.getItemset2().size() - 1) {
builder.append(", ");
}
}
// write separator
builder.append("@@");
// write support
builder.append(round(rule.getRelativeSupport(databaseSize), 2));
// write separator
builder.append("@@");
// write confidence
builder.append(round(rule.getConfidence(), 2));
if (usingLift) {
HVTH: Nguyễn Văn Sang(CH1101128) GVHD: PGS.TS Đỗ Phúc Trang 24
builder.append(" lift= ");
builder.append(rule.getLift());
}
result.add(builder.toString());
return result;
}
private void apGenrules(List<String> result, int k, int m, Itemset lk,
Set<Itemset> Hm)
throws IOException {
// System.out.println(" " + lk.toString() + " " + Hm.toString());
if (k > m + 1) {
Set<Itemset> Hm_plus_1 = generateCandidateSizeK(Hm);
Set<Itemset> Hm_plus_1_for_recursion = new HashSet<Itemset>();

for (Itemset hm_P_1 : Hm_plus_1) {
Itemset itemset_Lk_minus_hm_P_1 =
lk.cloneItemSetMinusAnItemset(hm_P_1);
calculateSupport(itemset_Lk_minus_hm_P_1);
double conf = ((double) lk.getAbsoluteSupport())
/ ((double) itemset_Lk_minus_hm_P_1.getAbsoluteSupport());
if (conf < minconf) {
continue;
}
if (minlift > 0) {
calculateSupport(hm_P_1);
double lift = conf / hm_P_1.getAbsoluteSupport();
if (lift < minlift) {
continue;
}
}
HVTH: Nguyễn Văn Sang(CH1101128) GVHD: PGS.TS Đỗ Phúc Trang 25

×