Tải bản đầy đủ (.pdf) (14 trang)

Một thuật toán khai phá đồ thị con phổ biến trong dữ liệu đồ thị

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 (322.83 KB, 14 trang )

JOURNAL OF SCIENCE OF HNUE

Natural Sci., 2012, Vol. 57, No. 3, pp. 17-30

MỘT THUẬT TOÁN KHAI PHÁ ĐỒ THỊ CON PHỔ BIẾN
TRONG DỮ LIỆU ĐỒ THỊ
Giang Thành Trung
Trường Đại học Tây Bắc
Trần Đăng Hưng(∗)
Trường Đại học Sư phạm Hà Nội
(∗)
E-mail:
Tóm tắt. Bài toán tìm các cấu trúc con lặp lại nhiều lần trong dữ liệu có
cấu trúc được ứng dụng trong rất nhiều lĩnh vực. Nhiều thuật toán khác
nhau đã được đề xuất. Tuy nhiên, do sự phức tạp của dữ liệu có cấu trúc
nên các thuật toán thường gặp phải các thách thức về tính toán. Trong bài
báo này, chúng tôi giới thiệu một thuật toán hiệu quả cho việc tìm kiếm các
đồ thị con trong một cơ sở dữ liệu đồ thị, thuật toán FSG. Thuật toán này
dựa trên tư tưởng của thuật toán Apriori nhưng pha sinh ứng viên đã được
cải tiến để phù hợp với dữ liệu đồ thị. Chúng tôi đã cài đặt thuật toán này
theo kỹ thuật lập trình hướng đối tượng bằng ngôn ngữ Java.
Từ khóa: Khai phá dữ liệu, đồ thị con phổ biến, Apriori, FSG.

1.

Mở đầu

Khai phá các mẫu hình (pattern) lặp lại nhiều lần trong dữ liệu có cấu trúc
(như đồ thị, cây) thu hút được nhiều sự chú ý của các nhà nghiên cứu vì được ứng
dụng trong nhiều lĩnh vực khác nhau [1-3]. Các mẫu hình lặp lại nhiều lần có thể
giúp chúng ta hiểu sâu sắc hơn về mối quan hệ giữa các phần tử được mô hình hóa


và đồng thời đây cũng là điểm khởi đầu cho các thuật toán khai phá dữ liệu cơ bản
như phân cụm và phân lớp. Trong số các loại dữ liệu có cấu trúc, đồ thị được sử
dụng trong nhiều lĩnh vực nhất. Chẳng hạn, trong sinh học đồ thị được dùng để mô
tả mối quan hệ giữa các phần tử cơ bản (protein, gene, RNA). Trong hóa học phân
tích, đồ thị được dùng để mô tả cấu trúc ba chiều của các phân tử. Ngoài ra, đồ thị
còn được dùng để biểu diễn dữ liệu web, dữ liệu text, vv.
Cho đến nay, có khá nhiều các thuật toán được đề xuất cho việc khai phá các
đồ thị con phổ biến từ một cơ sở dữ liệu đồ thị (CSDLĐT). Đồ thị con là một đồ
thị thu được từ đồ thị ban đầu bằng cách loại bỏ một số đỉnh và một số cạnh. Đồ
thị con phổ biến là đồ thị con có số lần xuất hiện trong một CSDLĐT lớn hơn một
ngưỡng cho trước. Hầu hết các thuật toán tìm đồ thị con phổ biến đều phải đối mặt
với hai thách thức về tính toán: (1) đồ thị con đẳng cấu: xác định một đồ thị con
17


Giang Thành Trung và Trần Đăng Hưng

của một đồ thị xuất hiện trong các đồ thị khác; (2) liệt kê một cách hiệu quả tất cả
các đồ thị con phổ biến: vì số lượng các đồ thị con sẽ tăng lên theo kích thước của
chính nó và kích thước của CSDLĐT, do vậy để làm việc được với các CSDLĐT
lớn và có cấu trúc phức tạp cần phải có các thuật toán khai phá mẫu phổ biến hiệu
quả.
Nhìn chung, có thể chia các thuật toán khai phá đồ thị con phổ biến thành
hai nhóm. Nhóm 1, gồm các thuật toán sử dụng chiến lược tìm kiếm theo chiều rộng
theo kiểu thuật toán Apriori [4] để liệt kê các đồ thị con. Hai trong số các thuật
toán này là AGM [5] và FSG [6]. AGM được đưa ra bởi Inokuchi và đồng nghiệp,
FSG được đưa ra bởi Kuramochi và đồng nghiệp. Các thuật toán này đều dựa trên
các đồ thị con phổ biến hiện có, rồi “sinh” ra các ứng viên tiếp theo bằng cách thêm
cạnh hoặc đỉnh mới. Tại thời điểm xuất phát, thuật toán coi đồ thị con chỉ có 1 đỉnh
hoặc 1 cạnh. Điểm khác nhau giữa các thuật toán này là phương thức “sinh” ra các

ứng viên (candidate) mới từ các đồ thị con phổ biến hiện thời. Trong khi AGM sử
dụng phương thức tạo ứng viên dựa trên các đỉnh và gia tăng kích thước của đồ thị
con bằng cách thêm 1 đỉnh mới. FSG lựa chọn chiến lược tạo ứng viên dựa trên các
cạnh để gia tăng kích thước của đồ thị con bằng cách thêm mới một cạnh. Chi tiết
của các thuật toán này sẽ được chúng tôi trình bày trong các phần tiếp theo.
Nhóm 2, gồm các thuật toán sử dụng chiến lược tìm kiếm theo chiều sâu để
tìm các ứng viên đồ thị con phổ biến. Hai thuật toán tiêu biểu cho nhóm này là
gSpan [7] và thuật toán của Borgelt [8]. Các thuật toán này đều tìm các đồ thị con
liên thông phổ biến trong CSDLĐT nhưng khác nhau ở cách sinh ra các đồ thị con
ứng viên. Trong gSpan [7], một đồ thị con phổ biến G được sử dụng để sinh ra các
đồ thị con ứng viên G′ bằng cách chọn một đỉnh v thuộc G và thêm vào cạnh (v, w),
trong đó w thuộc G hoặc không thuộc G. Ngược lại, thuật toán trình bày trong [8]
không sinh ra các ứng viên mà thay vào đó là lưu giữ tất cả các đẳng cấu có thể có
của đồ thị con phổ biến hiện thời.
Trong bài báo này, chúng tôi đã tìm hiểu và trình bày một thuật toán hiệu
quả của nhóm 1, thuật toán FSG [6]. Sau đó cài đặt và tiến hành thử nghiệm trên
cơ sở dữ liệu đồ thị tự tạo, mỗi file dữ liệu mô tả một tập các đồ thị. Chương trình
được chúng tôi cài đặt theo kỹ thuật lập trình hướng đối tượng với ngôn ngữ Java
và có thể chạy được trên cả nền Windows và Linux.

2.
2.1.

Nội dung nghiên cứu
Một số khái niệm

Để thuận lợi cho việc theo dõi các khái niệm về sau, trong phần này chúng tôi
cung cấp một số khái niệm cơ bản, được dùng nhiều lần trong bài báo.
Định nghĩa 2.1. Một đồ thị có nhãn G là một bộ gồm 5 phần tử G = (V, E, LV , LE , l)
trong đó V là tập các đỉnh, E là tập các cạnh vô hướng, LV và LE là tập nhãn của các

đỉnh và các cạnh, các ánh xạ l : V → LV và l : E → LE .

18


Một thuật toán khai phá đồ thị con phổ biến trong dữ liệu đồ thị
Định nghĩa 2.2. Đồ thị có nhãn G = (V, E, LV , LE , l) là đồ thị con của đồ thị G′ =
(V ′ , E ′ , L′V , L′E , l′ ) nếu và chỉ nếu:
◦V ⊆ V ′
◦∀u ∈ V, (l(u) = l′ (u)),
◦E ⊆ E ′ ,
◦∀(u, v) ∈ E, (l(u, v) = l′ (u, v))
Định nghĩa 2.3. Đồ thị có nhãn G = (V, E, LV , LE , l) là đẳng cấu với đồ thị G′ =
(V ′ , E ′ , L′V , L′E , l′ ) khi và chỉ khi tồn tại một song ánh f : V → V ′ thỏa mãn:
◦∀u ∈ V, (l(u) = l′ (f (u))),
◦∀u, v ∈ V, ((u, v) ∈ E ⇔ (f (u), f (v)) ∈ E ′ ),
◦∀(u, v) ∈ E, (l(u, v) = l′ (f (u), f (v)))
Chúng ta nói rằng G đẳng cấu với G′ và ngược lại.
Định nghĩa 2.4. Đồ thị có nhãn G là một đồ thị con đẳng cấu của đồ thị G′ , kí hiệu
G ⊆ G′ nếu và chỉ nếu tồn tại một đồ thị con G′′ của G′ mà G đẳng cấu với G′′ .
Định nghĩa 2.5. Cho tập các đồ thị D và một ngưỡng σ (0 < σ ≤ 1), độ hỗ trợ (support)
của đồ thị G kí hiệu supG là tỉ số của số lượng đồ thị G′ (G′ ∈ D) mà G đồ thị con đẳng

′ ⊆G}|
cấu của G′ trên số lượng đồ thị có trong D: supG = |{G ∈D|G
D
Đồ thị G được gọi là đồ thị con phổ biến nếu và chỉ nếu supG ≥ σ
Định nghĩa 2.6. Bài toán khai phá đồ thị con phổ biến là bài toán cho trước CSDLĐT
D và ngưỡng hỗ trợ σ(0 < σ ≤ 1), tìm tất cả các đồ thị con phổ biến trong D.


2.2.

Thuật toán FSG
Thuật toán 2.1: fsg(D, σ) (Phát hiện các đồ thị con phổ biến)
(1) F 1 ← xác định tất cả các đồ thị con phổ biến 1 cạnh trong D
(2)
F 2 ← xác định tất cả các đồ thị con phổ biến 2 cạnh trong D
(3)
k←3
(4)
while F (k−1) = ∅ do
(5)
C k ← f sg − gen(F (k−1) )
(6)
for each ứng viên Gk ∈ C k do
(7)
Gk .count ← 0
(8)
for each giao dịch T ∈ D do
(9)
if ứng viên Gk nằm trong giao dịch T then
(10)
Gk .count ← Gk .count + 1
(11)
F k ← Gk ∈ C k |Gk .count ≥ σ|D|
(12)
k ←k+1
(13) return F 1 , F 2 , . . . , F (k−2)

Thuật toán FSG được trình bày trong Thuật toán 2.1. Hoạt động của thuật

toán như sau: Đầu tiên thuật toán sẽ khởi tạo bằng cách liệt kê tất cả các đồ thị
1 và 2 cạnh phổ biến. Sau đó, dựa vào 2 bộ này, nó sẽ bắt đầu lặp việc tính toán
19


Giang Thành Trung và Trần Đăng Hưng

chính. Trong mỗi lần lặp, đầu tiên nó tạo ra các đồ thị con ứng viên có kích thước
lớn hơn các đồ thị ở bước trước 1 cạnh (dòng 5), điều này có nghĩa là thuật toán
sẽ tăng kích thước của các đồ thị con phổ biến bằng cách thêm vào một cạnh tại
một thời điểm. Tiếp theo, nó đếm tần suất của mỗi ứng viên đó (từ dòng 8-10) và
chỉ giữ lại các ứng viên đáp ứng được độ hỗ trợ σ (dòng 11). Thuật toán chỉ dừng
lại khi số lượng ứng viên được phát hiện bằng 0, nghĩa là không có đồ thị con phổ
biến kích thước lớn hơn tại thời điểm đó.
Để thực hiện Thuật toán 2.1 chúng ta cần xây dựng một số mô-đun hỗ trợ.
Chúng tôi trình bày các mô-đun này trong các phần dưới đây.
Thuật toán sinh ứng viên (fsg-gen)
Sinh ứng viên là một mô-đun quan trọng trong thuật toán FSG, giúp xác định
được các đồ thị con có kích thước lớn hơn từ các đồ thị con phổ biến được xác định
từ bước trước trước đó. Từ tập ứng viên vừa tạo thuật toán tiếp tục loại bớt các
ứng viên không phổ biến (có tần suất xuất hiện < σ|D|) và chỉ giữ lại những ứng
viên phổ biến. Trong pha sinh ứng viên thuật toán sẽ tạo một tập các đồ thị con
ứng viên kích thước k+1 từ các đồ thị con phổ biến kích thước k, các đồ thị con
ứng viên kích thước k + 1 được tạo ra bằng cách ghép 2 đồ thị con phổ biến kích
thước k. Hai đồ thị con đủ điều kiện để ghép chỉ khi chúng có cùng đồ thị con kích
thước k–1 và 2 đồ thị con này được gọi là “nhân”.
Các bước chính trong việc tạo ứng viên đó là:
- Xác định nhân: Nhân giữa cặp đồ thị Gki và Gkj có thể xác định bằng cách
tạo ra tất cả các đồ thị con kích thước k–1 của Gki bằng cách bỏ đi các cạnh và
kiểm tra xem nó có phải đồ thị con của Gkj không. Nếu là đồ thị con của Gkj thì sẽ

là nhân chung giữa 2 đồ thị. Lưu ý là giữa 2 đồ thị có thể có nhiều hơn 1 nhân.
- Ghép nối : Tiến hành tạo tất cả các tự đẳng cấu có thể của nhân được lựa
chọn rồi thực hiện nối 2 đồ thị Gki , Gkj để tạo ra đồ thị ứng viên kích thước k + 1
bằng cách từ nhân và các tự đẳng cấu của nhân ta ghép vào đó 2 cạnh, một của Gki
và một của Gkj mà không nằm trong nhân.
- Lược bớt: Sử dụng thuộc tính chặn dưới đóng của điều kiện hỗ trợ để loại bỏ
một vài các ứng viên đã được tạo ra. Để làm được điều này, với mỗi ứng viên kích
thước k + 1, thuật toán sẽ đưa ra các đồ thị con kích thước k bằng cách bỏ bớt một
cạnh của đồ thị ứng viên, sau đó kiểm tra xem các đồ thị con đó đã tồn tại trong
F k hay chưa.
Thuật toán tạo các ứng viên được thể hiện trong Thuật toán 2.2 gồm các bước
dưới đây:
- Bước 1: Với mỗi cặp đồ thị con phổ biến, thuật toán fsg-gen đi xác định tất
cả các nhân chung giữa chúng.
- Bước 2: Sau đó với mỗi nhân chung và cặp đồ thị con sẽ gọi đến thuật toán
fsg-join để tạo ra tất cả các ứng viên kích thước k + 1 có thể.
- Bước 3: Với mỗi ứng viên được tạo ra, đầu tiên thuật toán sẽ kiểm tra ứng
20


Một thuật toán khai phá đồ thị con phổ biến trong dữ liệu đồ thị

viên đó đã có trong C (k+1) hay chưa.
+ Nếu chưa thì fsg-gen xác minh tất cả các đồ thị con k cạnh của nó xem có
là đồ thị phổ biến hay không.
+ Nếu phổ biến, fsg-join sẽ chèn ứng viên được tạo ra vào C (k+1)
+ Nếu không nó sẽ loại bỏ ứng viên đó
+ Nếu đã có thì nó bỏ qua ứng viên đó.
Thuật toán 2.2: fsg-gen(F k ) (Thuật toán tạo ứng viên)
(1) C (k+1) ← ∅

(2)
for each cặp Gki , Gkj ∈ F k , i ≤ j mà cl(Gki ≤ Gkj ) do
(3)
H(k−1) ←H (k−1) | một nhân H (k−1) chung giữa Gki và Gkj
(4)
for each H (k−1) ∈ H(k−1) do
(5)
{B (k+1) là một tập các ứng viên dự kiến}
(6)
B (k+1) ← f sg − join(Gki , Gkj , H (k−1) )
(k+1)
(7)
for each Gj
∈ B (k+1) do
(8)
{kiểm tra thuộc tính chặn dưới đóng}
(9)
f lag ← true
(k+1)
(10)
for each cạnh el ∈ Gj
do
(11)
(12)
(13)
(14)
(15)
(16)
(17)


(k+1)

Hlk ← Gj
− el
if Hlk liên thông và H k ∈ F k then
f lag ← f alse
break
if f lag = true then
(k+1)
C (k+1) ← C (k+1) ∪Gj
return C (k+1)

Trong thuật toán khởi tạo các đồ thị ứng viên có một bước quan trọng đó là
ghép nối 2 đồ thị có chung nhân. Không giống như việc ghép nối các tập mục phổ
biến, 2 tập mục phổ biến kích thước k khi được ghép nối sẽ chỉ dẫn đến duy nhất
một tập mục kích thước k + 1 thì việc ghép nối 2 đồ thị con kích thước k sẽ dẫn tới
nhiều đồ thị con kích thước k + 1 bởi các nguyên nhân sau:
- Đầu tiên đó là trường hợp sự khác nhau giữa các lõi chung và 2 đồ thị con
có thể là một đỉnh có nhãn giống nhau trong cả 2 đồ thị con kích thước k. Khi đó
nếu ghép nối nó sẽ tạo ra 2 đồ thị con kích thước k + 1 khác nhau. Ví dụ trong Hình
2.1 là khi đồ thị G4a và G4b kết nối sẽ tạo ra 2 đồ thị G5a và G5b tương ứng.

Hình 2.1. Khi kết nối bởi các nhãn đỉnh
- Thứ hai đó là có thể nhân của mỗi đồ thị con kích thước k có nhiều tự đẳng cấu,
21


Giang Thành Trung và Trần Đăng Hưng

và mỗi tự đẳng cấu sẽ tạo ra một ứng viên k + 1 khác nhau. Trong trường hợp xấu

nhất nếu nhân là một đồ thị clique không được gán nhãn thì số lượng tự đẳng cấu
là k!. Ví dụ trong Hình 2.2, nhân là hình vuông có 4 đỉnh được gán nhãn sẽ có 4 tự
đẳng cấu thể hiện trong 3 ứng viên kích thước 6.

Hình 2.2. Kết nối khi có đa đẳng cấu của nhân
- Thứ ba là khi 2 đồ thị con phổ biến có chung nhiều nhân. Ví dụ như trong Hình
2.3.

Hình 2.3. Kết nối khi có đa nhân
Thuật toán ghép nối các đồ thị con kích thước k được thể hiện trong Thuật
toán 2.3. Cho 1 cặp đồ thị con kích thước k, Gk1 và Gk2 và một nhân kích thước k-1.
Kết quả trả ra của thuật toán là một tập các đồ thị ứng viên kích thước k + 1. Hoạt
động cụ thể của thuật toán như sau:
- Bước 1: fsg-join tiến hành xác định 2 cạnh, 1 trong Gk1 và 1 trong Gk2 sao
cho chúng không nằm trong nhân.
- Bước 2: fsg-join tạo ra tất cả các tự đẳng cấu của nhân.
- Bước 3: với mỗi tập 2 cạnh, nhân và tự đẳng cấu, fsg-join tích hợp 2 đồ thị
con Gk1 và Gk2 vào một ứng viên kích thước k + 1.
22


Một thuật toán khai phá đồ thị con phổ biến trong dữ liệu đồ thị

Thuật toán 2.3: fsg-join(Gk1 , Gk2 , H (k−1) ) (Thuật toán ghép nối 2 đồ thị)
(1) e1 ← cạnh chỉ xuất hiện trong Gk1 ,nhưng không có trong H (k−1)
(2) e2 ← cạnh chỉ xuất hiện trong Gk2 ,nhưng không có trong H (k−1)
(3) M ← tạo tất cả các tự đẳng cấu của H (k−1)
(4) B (k+1) = ∅
(5) for each tự đẳng cấu ϕ ∈ M do
(6) B (k+1) ← B (k+1) ∪ tất cả các đồ thị ứng viên k+1 được tạo ra

từ một tập của e1 , e2 , H (k−1) và ϕ
(7) return B (k+1)
Để giảm thiểu thời gian xác định nhân giữa 2 đồ thị con phổ biến chúng ta
lưu giữ lại một số thông tin từ tập các đồ thị con phổ biến. Cụ thể, đối với mỗi
đồ thị con phổ biến kích thước k chúng ta lưu trữ các nhãn định danh của đồ thị
con phổ biến kích thước k-1 của nó, khi đó việc xác định nhân bằng cách xác định
giao của các nhãn định danh. Độ phức tạp của phương pháp này là bình phương số
lượng các đồ thị con phổ biến kích thước k.

2.3.

Cài đặt và thử nghiệm thuật toán FSG

Thuật toán được cài đặt hướng đối tượng bằng ngôn ngữ Java dựa trên việc
xây dựng các lớp. Vì giới hạn của bài báo, nên phần này chúng tôi chỉ cung cấp một
số thông tin về nội dung các lớp.
Tổ chức dữ liệu vào/ra
- Dữ liệu vào được lưu trong tệp tin văn bản và có cách tổ chức như sau:
Loại dòng
Chú thích

Định dạng
#

Số đỉnh
Đỉnh

vn <number>
v <ID> <Label>


Giao dịch

t <number>

Cạnh

u <ID1> <ID2>
<Label>

Giải thích ý nghĩa
Ký hiệu báo hiệu chú thích, chương
trình sẽ bỏ qua những dòng có ký hiệu
này ở đầu
Chứa số đỉnh có trong đồ thị
Mã của đỉnh và nhãn của đỉnh đó (mã
là số nguyên không âm, nhãn là chuỗi
ký tự không dấu)
Bắt đầu 1 giao dịch, <number> là số
cạnh trong giao dịch đó
Mã của đỉnh đầu và đỉnh cuối của cạnh
và nhãn của cạnh đó

Ví dụ: Cho đồ thị được biểu diễn như hình bên trái, thì dữ liệu vào sẽ được
biểu diễn như hình bên phải dưới đây
23


Giang Thành Trung và Trần Đăng Hưng

Đồ thị mẫu


Ví dụ về cách biểu diễn dữ liệu đồ thị

- Tệp dữ liệu chứa kết quả thu được sau khi chạy thuật toán được lưu trong
tệp tin văn bản và có cách tổ chức như sau:
Loại dòng
Chú thích
Kích thước
Giao dịch

Định dạng
#

Giải thích ý nghĩa
Ký hiệu báo hiệu chú thích, chương
trình sẽ bỏ qua những dòng có ký hiệu
này ở đầu
size <number>
Kích thước của đồ thị con phổ biến tìm
được
sg
<ID1>- Bắt đầu 1 đồ thị con phổ biến bao gồm
<ID2>các mã đỉnh đầu, cuối và nhãn cạnh.
<Label1>*<ID3>- Các cạnh được phân biệt nhau bởi dấu
<ID4>*
<Label2>*. . .

Ví dụ về tệp biểu diễn danh sách các đồ thị con phổ biến tìm được
24



Một thuật toán khai phá đồ thị con phổ biến trong dữ liệu đồ thị

Thiết kế các lớp chính
- Gói Graph bao gồm các lớp để biểu diễn các đối tượng đồi thị. Gói này gồm
các lớp VertexLabel, EgdeLabel, Graph và CandidateGraph.
+ Lớp VertexLabel : sử dụng để biểu diễn đối tượng đỉnh
Các thuộc tính/phương thức
- int ID
- String Label
+ void setID(String pID)
+ void setLabel(String pLabel)
+ int getID()
+ string getLabel()

Ý nghĩa
Biểu diễn mã của đỉnh
Biểu diễn nhãn của đỉnh
Phương thức thiết lập mã đỉnh
Phương thức thiết lập nhãn đỉnh
Phương thức đọc mã đỉnh
Phương thức đọc nhãn đỉnh

+ Lớp EdgeLabel : sử dụng để biểu diễn đối tượng cạnh

Các thuộc tính/phương thức
- int firstVertex
- int lastVertex
- String Label
+ void setFirstVertex(int pFV)

+ void setLastVertex(int pLV)
+ void setLabel(String pLabel)
+ int getFirstVertex()
+ int getLastVertex()
+ String getLabel()

Ý nghĩa
Biểu diễn mã đỉnh thứ nhất
Biểu diễn mã đỉnh thứ hai
Biểu diễn nhãn của cạnh
Phương thức thiết lập mã đỉnh
thứ nhất
Phương thức thiết lập mã đỉnh
thứ hai
Phương thức thiết lập nhãn cạnh
Phương thức đọc mã đỉnh thứ
nhất
Phương thức đọc mã đỉnh thứ hai
Phương thức đọc nhãn cạnh

+ Lớp Graph: sử dụng để biểu diễn các đối tượng đồ thị

Các thuộc tính/phương thức
- Int numOfVer
- Int numOfEdge
- VertexLabel[] lV = new VertexLabel[1000]

Ý nghĩa
Biểu diễn số đỉnh của đồ thị
Số cạnh của đồ thị

Danh sách các nhãn đỉnh
25


Giang Thành Trung và Trần Đăng Hưng

- EdgeLabel[] lE = new EdgeLabel[1000]
boolean[]
fV
=
new
boolean[1000]
- String[][] Matrix = new
String[100][100]
- String code
- String cL
+ Graph()
+ Graph(int pNumOfVertex, int
pNumOfEdge)
+ void GenerateAdjacencyMatrix()
+ void SetCode()
+ void SetCanonicalLabel()

Danh sách các nhãn cạnh
Biến đánh dấu khi hoán vị các
đỉnh
Ma trận kề tương ứng của đồ thị
Mã của đồ thị (hỗ trợ việc tạo
Canonical Label)
Nhãn tiêu chuẩn của đồ thị

Phương thức khởi tạo đối tượng
Phương thức khởi tạo đối tượng
với 2 tham số
Phương thức tạo ma trận kề
Phương thức sinh mã của đồ thị
Phương thức sinh Canonical Label của đồ thị

+ Lớp CandidateGraph: kế thừa từ lớp Graph và được sử dụng để biểu diễn
các đối tượng đồ thị ứng viên được sinh ra đồng thời biểu diễn các đồ thị phổ biến
được xác định

Các thuộc tính/phương thức
- String cL1
- String cL2
+
+
+
+

void setCL1(String pCL1)
void setCL2(String pCL2)
String getCL1()
String getCL2()

Ý nghĩa
Biểu diễn nhãn tiêu chuẩn của đồ
thị con thứ nhất sinh ra đồ thị
hiện tại
Biểu diễn nhãn tiêu chuẩn của đồ
thị con thứ hai sinh ra đồ thị hiện

tại
Phương thức thiết lập cL1
Phương thức thiết lập cL2
Phương thức đọc giá trị của cL1
Phương thức đọc giá trị của cL2

- Gói Process bao gồm các lớp xử lý đồ thị:
+ Lớp GetInput: đọc dữ liệu trong tệp tin ở bộ nhớ ngoài

26


Một thuật toán khai phá đồ thị con phổ biến trong dữ liệu đồ thị

Các thuộc tính/phương thức
- String fileName
+ void setfileName(String pFN)
+ void ReadFile(String FileName, Graph graph[], int[] tnum)

Ý nghĩa
Biểu diễn đường dẫn của tệp tin
chứa dữ liệu vào
Phương thức thiết lập đường dẫn
cho tệp tin vào
Phương thức đọc dữ liệu trong
tệp tin và biểu diễn vào mảng các
đồ thị

+ Lớp ProcessGraph: đọc dữ liệu trong tệp tin ở bộ nhớ ngoài


Các thuộc tính/phương thức
+ boolean isomorphism(Graph
g1, Graph g2)
+ string compareCode(String
paraCode1, String paraCode2)
+ void PermuteIdentifier()

Ý nghĩa
Xác định tính đẳng cấu của 2 đồ
thị
So sánh 2 đoạn mã để xác định
mã có thứ tự từ điển lớn hơn
Xác định các hoán vị đỉnh có thể
của của 1 đồ thị để sinh ra mã
tương ứng

- Gói Main bao gồm các lớp sau:
+ Lớp FSG: bao gồm các phương thức cài đặt thuật toán FSG

Các thuộc tính/phương thức
- Graph[] graph
- int[] tn
- CandidateGraph[][] canGraph
CandidateGraph[][]
quentSubgraph
+ void Input()
+ void FSG()

fre-


Ý nghĩa
Biểu diễn các đồ thị đọc được từ
tệp tin vào
Biểu diễn tổng số giao dịch
Biểu diễn các tập đồ thị ứng viên
được sinh ra
Biểu diễn các tập đồ thị phổ biến
được xác định
Phương thức đọc dữ liệu từ tệp
tin đầu vào
Phương thức chạy thuật toán
FSG

27


Giang Thành Trung và Trần Đăng Hưng

+ void GenerateFirstCandidate()
+ void FSG_Gen(int k)
+ graph[] coreIdentifier(Graph
g1, Graph g2)
+ void FSG_Join(Graph g1,
Graph g2, Graph gcore)

Phương thức khởi tạo tập ứng
viên 1, 2 cạnh
Phương thức khởi tạo tập ứng
viên kích thước k ≥ 3
Phương thức xác định nhân của 2

đồ thị
Phương thức kết nối 2 đồ thị để
tạo ra 1 ứng viên

Kết quả thực nghiệm
Chúng tôi đã cài đặt hoàn chỉnh chương trình và thử nghiệm trên hai tập dữ
liệu nhỏ với mục đích minh họa.
Tập dữ liệu 1 : Gồm 3 đồ thị có cấu trúc như hình vẽ dưới đây:
- Mô hình cơ sở dữ liệu đồ thị đầu - File dữ liệu vào tương ứng với
vào:
tập dữ liệu đồ thị 1

- File kết quả sau khi chạy chương trình với ngưỡng support σ=50

- Biểu diễn kết quả bằng mô hình:
28


Một thuật toán khai phá đồ thị con phổ biến trong dữ liệu đồ thị

+ Kích thước 3:

+ Kích thước 4:

Tập dữ liệu 2 : Gồm 4 đồ thị có cấu trúc như hình vẽ dưới đây
- Mô hình các đồ thị giao dịch đầu vào:
- File dữ liệu vào tương ứng
với tập dữ liệu đồ thị 2:

- File kết quả sau khi chạy chương trình với ngưỡng support σ=70


- Biểu diễn bằng mô hình:
+ Kích thước 3: + Kích thước 4:

3.

Kết luận

Trong bài báo này chúng tôi đã tìm hiểu và cài đặt một thuật toán hiệu quả
trong việc khai phá các đồ thị con phổ biến. Thuật toán này dựa trên tư tưởng của
thuật toán Apriori tìm tập mục phổ biến. Tuy nhiên, khi thực hiện với dữ liệu đồ
thị thì việc lưu trữ và xử lý dữ liệu khó khăn và phức tạp hơn. Chúng tôi đã đưa ra
cách biểu diễn các đối tượng bằng lớp và sử dụng lập trình hướng đối tượng để cài
29


Giang Thành Trung và Trần Đăng Hưng

đặt thuật toán. Chúng tôi cũng đã thử nghiệm chương trình trên hai bộ dữ liệu tự
tạo với số lượng đồ thị tương đối nhỏ. Trong thời gian tới, chúng tôi sẽ tiến hành
chạy thử nghiệm trên dữ liệu biểu hiện gien với số lượng lớn các đồ thị.
TÀI LIỆU THAM KHẢO
[1] Zaki M. J., 2002. Efficiently mining frequent trees in a forest. In Proc. of The
8th ACM SIGKDD Conference on Knowledge Discovery and Data Mining, 71-80.
[2] Dehaspe L., Toivonen H., and King R. D., 1998. Finding frequent substructures
in chemical componuds. Proc. of the 4th International Conference on Knowledge
Discovery and Data Mining, 30–6.
[3] Yan X., Philip S., Jiawei H., 2004. Graph indexing: a frequent structure-based
approach. In Proc. of The 2004 ACM SIGMOD International conference on Management of Data, 335-346.
[4] Agrawal R. and Srikant R., 1994. Fast algorithms for mining association rules.

In Proc. of the 20th International Conference on Very Large Databases (VLDB),
487–499.
[5] Inokuchi A., Washio T., and Motoda H., 2000. An apriori-based algorithm for
mining frequent substructures from graph data. In Proc. of the 4th European
Conference on Principles and Practices of Knowledge Discovery in Databases
(PKDD), 13–23.
[6] Kuramochi M. and Karypis G., 2004. Frequent subgraph discovery. IEEE Transactions on Knowledge and Data Engineering, 16(9), 1038 – 1051.
[7] Yan X. and Han J., 2002. gSpan: Graph-based substructure pattern mining. In
Proc. of The 2002 IEEE International Conference on Data Mining, 120-125.
[8] Borgelt C. and Berhold M. R., 2002. Mining molecular frag-ments: Finding relevant substructures of molecules. In Proc. of The 2002 IEEE International Conference on Data Mining, 51-58.
ABSTRACT
A frequent subgraph mining algorithm in graph databases
The problem of finding frequent substructures in a structural dataset has
been applied in many fields. Previously, several difference algorithms were proposed.
However, due to the complexity of the structural data, these algorithms faced the
challenge of computational cost. In this paper, we introduce an efficient algorithm
for mining subgraphs from a graph database, namely FSG. This algorithm is an
extension of the Apriori algorithm with some new modules added in the candidate
generation step. We implemented FSG using Java programming language.

30



×