Cây các đồ thị con dạng chính tắc

Một phần của tài liệu (LUẬN văn THẠC sĩ) bài toán đồ thị con đẳng cấu trong khai phá dữ liệu đồ thị và ứng dụng phát hiện đồ thị con phổ biến (Trang 48)

Trong khai phá đồ thị, thay vì phải liệt kê các đồ thị con phổ biến, người ta sử dụng cấu trúc cây để liệt kê các ma trận liền kề tương ứng. Nếu chúng ta xem ma trận rỗng là con của mọi ma trận có một phần tử thì có thể các dạng chính tắc CAM của tất cả các đồ thị con liên thông thành cấu trúc cây [9] như sau:

i. Đỉnh (nút) gốc của cây là ma trận rỗng

ii. Mỗi đỉnh trên cây là một đồ thị con liên thông của G, được biểu diễn bằng dạng chính tắc CAM

iii. Với mỗi đỉnh không phải là gốc đại diện cho dạng chính tắc M thì đỉnh cha của nó sẽ là đồ thị con cực đại của M.

Một cây thu được theo cách này được gọi là cây các ma trận liền kề chính tắc của G, được ký hiệu là CAMTree(G).

Các phương pháp liệt kê tất cả các đồ thị con có thể chia thành hai loại.

Loại thứ nhất sử dụng phép kết nối (join operation) để kết nối hai đồ thị con phổ biến k-cạnh G1 và G2 để tạo ra đồ thị ứng viên G (k+1)-cạnh sao cho cả hai G1 và G2 đều là đồ thị con của G. Hai đồ thị k-cạnh được gọi là khả hợp nếu chúng cùng chia sẻ (k-1)-đồ thị con chung. Những thuật toán loại này có độ phức tạp khá lớn, bởi phép kết nối thường tạ ra nhiều đồ thị con ứng viên, trong số đó có nhiều ứng viên không phải là đồ thị con phổ biến.

Những thuật toán thứ hai sử dụng phép toán mở rộng (extension operation) để phát triển, mở rộng đồ thị. Từ một đồ thị phổ biến k-cạnh có thể bổ sung thêm một cạnh (có thể bổ sung thêm/hoặc không cần thêm đỉnh) để tạo ra đồ thị ứng viên (k+1)-

cạnh. Phép toán này cũng khá tốn kém vì có nhiều đỉnh trong đồ thị cha có nhiều cạnh liền kề cần bổ sung vào đồ thị con.

Các thuật toán khai phá đồ thị con nêu trên đều gặp phải những khó khăn, trở ngại khi liệt kê các đồ thị con:

(i) Liệu chúng ta có thể thiết kế phép toán kết nối sao cho mỗi CAM khác biệt được tạo ra chỉ một lần?

(ii) Chúng ta có thể cải thiện phép toán kết nối sao cho chỉ một vài CAM được sinh ra từ một phép toán kết nối (nhiều nhất là hai)?

(iii) Chúng ta có thể thiết kế phép toán mở rộng sao cho tất cả các cạnh được bổ sung có thể chỉ liền kề với một đỉnh trong đồ thị được biểu diễn bởi CAM?

Để vượt qua được những thách thức trên, chúng ta có thể phát triển cây CAM với một tập các ma trận liền kề tối ưu cục bộ và bổ sung thêm hai phép toán mới N- kết nối (N-Join) và N-mở rộng (N-Extension) [12].

2.4.2. Phép kết nối N-Join hai đồ thị

Như đã thảo luận ở trên, phép kết nối là ghép hai đồ thị con để tạo ra một đồ thị ứng viên. Phụ thuộc vào các tính chất đặc trưng của đồ thị mà phép kết nối có thể sinh ra một hay nhiều ứng viên. Phần lớn các phép toán trên đồ thị chúng ta phải dựa vào các dạng biểu diễn của chúng, ở đây là các ma trận liền kề.

Định nghĩa 2.11. Cho trước ma trận liền kề A của đồ thị G, ta gọi A là ma trận nội (Inner) nếu nó có ít nhất hai cạnh (hai giá trị khác 0) ở hàng cuối, ngược lại A được gọi là ma trận ngoại (Outer).

Định nghĩa 2.12. Cho trước hai ma trận liền kề A = {ai,j | 1  i, j  m}, B = {bi,j | 1

 i, j  n} cùng có một ma trận con cực đại và cạnh cuối của A là am,f , cạnh cuối của B là bn,k.

Phép N-Join(A, B) được định nghĩa như sau:

+ Trường hợp 1. Cả hai A và B đều là ma trận nội (Case 1) if (f == k) then

ai, j Nếu (0 < i, j ≤ n)  (i  n  j  k) bi, j Ngược lại

else

N-Join(A, B) = 

+ Trường hợp 2. A là ma trận nội còn B là ma trận ngoại (Case 2) N-Join(A, B) = {C}, với C = {ci, j | 1  i, j  n} và

ai, j Nếu 0 < i, j ≤ m bi, j Ngược lại

+ Trường hợp 3. cả hai ma trận A và B đều là ma trận ngoại (Case 3) 3.1 Giả sử D = {di, j | 1  i, j  m + 1} với // Case 3.1

ai, j 0 < i, j ≤ m bi, j i = m + 1, 0 < j < m 0 i = m + 1, j = m bm,m i = m + 1, j = m + 1 3.2 if (f  k  am, m == bm,m) then Ma trận C = {ci, j | 1  i, j  n} với // Case 3.2 ai, j Nếu (0 < i, j ≤ m)  (i  n  j  k)

bi, j Ngược lại N-Join (A, B) = {C, D} else

N-Join(A, B) = {D}

Trong trường hợp 3, khi kết nối hai ma trận ngoài có cùng một cỡ, chúng ta nhận được ma trận mới cùng cỡ đó. Trường hợp 3.2 cũng có thể cho ta kết quả ma trận cỡ (m + 1) giống như trường hợp 3.1. Nói cách khác, N-Join(A, B) = N-Join (B, A) trong các trường hợp 1, 2 và 3.1 và chúng sẽ khác nhau trong trường hợp 3.2.

Ví dụ 2.6.

Để loại bỏ được những kết quả bị lặp do tính đối xứng của phép kết nối, chúng ta yêu cầu code(A) ≥ code(B) trong tất cả các trường hợp của phép N-Join, ngoại trừ trường hợp 3.2. Trường hợp không thỏa mãn bất đẳng thức thì N-Join(A, B) = .

ci,j =

ci,j =

di,j =

Hình 2.6. mô tả kết quả thực hiện phép N-Join trong 4 trường hợp (case 1, case 2, case 3.1 và case 3.2). Như chỉ ra trên đồ thị, phép N-Join hoàn toàn loại bỏ được sự dư thừa sau khi sắp xếp lại các đồ thị theo dạng chính tắc của chúng.

Hình 2.6. Hai phép toán N-Join va N-Extension

2.4.3. Phép N-Extension

Một kỹ thuật liệt kê cơ sở khác mà chúng ta có thể sử dụng là phép mở rộng (N-Extension) một k-đồ thị thành (k+1)-đồ thị ứng viên bằng cách bổ sung thêm một cạnh. Cạnh được bổ sung có thể nối giữa hai đỉnh của đồ thị con hoặc nối một đỉnh mới với một đỉnh của đồ thị con cho trước. Phép toán này có độ phức tạp O(|LV| . |LE| . |G|), trong đó LV, LE là tập các nhãn của các đỉnh, cạnh tương ứng trong đồ thị G. Như vậy, có thể thấy số các ứng viên được tạo ra theo phép mở rộng là khá lớn, nó tỉ lệ với số các nhãn trên các cạnh, đỉnh của đồ thị.

Thuật toán gSpan [12] được xây dựng dựa vào cách loại bỏ đi những đỉnh dư thừa khi liệt kê các đồ thị con. Trong thuật toán gSpan, phép mở rộng chỉ thực hiện đối với những đỉnh “bên phải nhất” của đồ thị. Cho trước một đồ thị G và cây tìm

kiếm theo chiều sâu T của G, đường đi bên phải nhất của G được thể hiện qua T là đường đi bên phải nhất của T. Thuật toán gSpan chỉ chọn một cây T tìm kiếm theo chiều sâu để sinh ra dạng chính tắc của G theo phép mở rộng.

Phép N-Extension được thực hiện trên cơ sở cải tiến phép mở rộng ở trên bằng cách chỉ chọn một đỉnh ở dạng chính tắc CAM và bổ sung một cạnh mới liền kề cùng với đỉnh cần bổ sung.

Phép N-Extension được định nghĩa theo giả mã như sau.

N-Extension

Input: Ma trận liền kề A = {ai, j | 1  i, j  n} của đồ thị G

Output: S là tập các ma trận liền kề B = {bi, j | 1  i, j  n+1} sao cho A là ma trận con cực đại của B.

Thuật toán N-Extension:

if (A là ma trận liền kề ngoại) then for (nl, el) ∈ LV × LE do

Tạo lập ma trận B={bi, j |1  i, j  n} sao cho ai, j 0 < i, j ≤ n 0 i = n + 1, 0 < j < n el i = n + 1, j = n nl i = n + 1, j = n + 1 S ← S ∪ {B} end for else S ←  end if

2.5. Thuật toán FFSM cho khai phá đồ thị con phổ biến trong CSDL đồ thị

Trong thuật toán sau chúng ta sử dụng CAM(G) để ký hiệu cho tất cả các CAM của đồ thị G. X.isCAM là biến Boolean chỉ ra ma trận X có phải là CAM mà nó biểu diễn hay không.

bi,j = ==

Thuật toán FFSM

Input: CSDL các đồ thị GD và độ hỗ trợ  (0 <  ≤ 1)

Output: Tập S tất cả các đồ thị con liên thông của G. 1: S ← { CAM phổ biến cả đỉnh và cạnh}

2: P ← { CAM phổ biến của cạnh } 3: FFSM-Explore(P, S);

Thuật toán FFSM-Explore

Input: U, danh sách CAM tối ưu cục bộ và W , tập các CAM của đồ thị con phổ biến

Output: Tập W chứa tất cả các CAM của đồ thị con phổ biến được tìm thấy

for X ∈ P do if (X.isCAM) then W ← W ∪ {X}, C ← Φ for Y ∈ P do C ← C∪ FFSM-Join(X, Y ) C ← C∪ FFSM-Extension(X)

Loại khỏi C những CAM mà nó không phổ biến hoặc không tối ưu

FFSM-Explore(C, W ) end if

end for

Định nghĩa 2.13. Cho trước ma trận liền kề A = {ai, j | i, j = 1..n} và đồ thị G = (V, E, L, l), danh sách các đỉnh L = u1, u2, . . . , un, ui  V được gọi là danh sách nhúng của A vào G nếu:

(i) ∀ i, (ai, i = l(ui));

(ii) ∀ i, j (ai, j 0 ⇒ ai,j = l(ui, uj )) với 0 < j < i ≤ n.

Tập tất cả các danh sách nhúng của một ma trận liền kề trong CSDL được gọi là tập các đỉnh nhúng.

được việc biểu diễn những đồ thị con ứng viên mà còn có thể xác định được các tập nhúng.

Trước tiên ta xét trường hợp kết nối 1 (join case 1) các đồ thị. Cho trước P và Q là hai ma trận liên kết nội tối ưu cục bộ và một CAM tối ưu cục bộ {A} = join(P, Q). Danh sách L các đỉnh nhúng của A trong G. Hiển nhiên L cũng sẽ là danh sách nhúng của P và Q trong G. Mặt khác, nếu danh sách L là các đỉnh nhúng của P và Q thì L cũng là danh sách các đỉnh nhúng của A trong G bởi vì A không chứa nhiều hơn những cạnh khác 0 so với P hoặc Q).

Từ đó suy ra, tập các đỉnh nhúng OA của A, được kết nối từ P và Q thông qua trường hợp kết nối 1, và ta có OA = OP ∩ OQ, trong đó OP và OQ là các tập đỉnh nhúng của P và Q tương ứng.

Tương tự đối với trường hợp 2 (join case 2), ({A} = join(P, Q), P là ma trận nội và Q là ma trận ngoại, ta có OA = {L | L = u1, u2, . . . , un−2, un−1, un, L ∈ OQ, L’ = u1, u2, . . . , un−2, un−1∈ OP}. Đối với trường hợp 3a (join case 3a) ({A} = join(P, Q), cả P và Q đều là ma trận ngoại (P và Q có cùng kích cỡ sau kết nối), ta có OA = OP ∩ OQ. Trường hợp 3b (join case 3b) ({A} = join(P, Q), cả P và Q đều là ma trận ngoại, A có cỡ lớn hơn 1 so với P và Q sau khi kết nối, ta có OA = {L | L = u1, u2, . . . , un, L’ = u1, u2, . . . , un−3, un−2, un−1 ∈ OP, L’’ = u1, u2, . . . , un−3, un−2, un∈ OQ}.

Đối với phép mở rộng, chúng ta tính tập các đỉnh nhúng theo thuật toán sau:

Tính tập các đỉnh nhúng của phép toán N-Extension [15]

Input: A là ma trận CAM cỡ n × n

Output: Tập S tất cả các CAM tối ưu cục bộ được mở rộng từ A và các tập nhúng của chúng.

for L = u1, u2, . . . , un ∈ OA do // Với mỗi danh sách nhúng L Đặt G là đồ thị có các đỉnh trong L

for node v ∈ V [G] ∧ v  L ∧ (v, un) ∈ E[G] do

ai, j 0 < i, j ≤ n 0 i = n + 1, 0 < j < n lG(v, un) i = n + 1, j = n lG(v) i = n + 1, j = n + 1 OB ← OB∪ {(gi, Lv)} S ← S ∪ {B} end for end for

Trong đó, lG là ánh xạ trong G để xác định các nhãn của các đỉnh, cạnh trong đồ thị. Lv là danh sách được ghép của L với một đỉnh v.

2.6. Kết luận chương 2

Chương này được chia thành 2 phần chính:

Phần thứ nhất trình bày về khái niệm đẳng cấu, thuật toán kiểm tra đồ thị đẳng cấu và thuật toán đẳng cấu đồ thị con

Phần thứ hai trình bày về khai phá đồ thị con phổ biến với các thuật toán như: biểu diễn cây các đồ thị con dạng chính tắc, phép kết nối N-Join và N-Extension, thuật toán FFSM.

CHƯƠNG 3

THỬ NGHIỆM VÀ ĐÁNH GIÁ 3.1. Dữ liệu và môi trường thử nghiệm

3.1.1. Bộ dữ liệu thử nghiệm

Bộ dữ liệu được sử dụng trong luận văn này bao gồm 1 kho (cơ sở dữ liệu) đồ thị được lưu trong file dạng txt. Kho đồ thị có cấu trúc như hình 3.1.

Hình 3.1. Mô tả cấu trúc bộ dữ liệu thử nghiệm với kho gồm 2 đồ thị

Trong hình 3.1, “t # N” nghĩa là đồ thị thứ N trong kho đồ thị, “v M L” tức là đỉnh M trong đồ thị có nhãn là L, "e P Q L" nghĩa là cạnh nối 2 đỉnh P và Q có nhãn là L. Mỗi đồ thị được ngăn cách với nhau bởi dấu xuống dòng. Kết thúc file sẽ có cấu trúc là "t # -1".

Bộ dữ liệu thứ nhất là “dataset.txt” gồm 10.000 đồ thị với đồ thị bé nhất bao gồm 2 đỉnh và 1 cạnh, đồ thị lớn nhất bao gồm 214 đỉnh và 217 cạnh. Để thuận tiện hơn cho việc đánh giá, chúng ta chia bộ dữ liệu ra thành các bộ dữ liệu nhỏ hơn được ký hiệu bằng Q4.txt, Q8.txt, Q12.txt, Q16.txt, Q.20.xt và Q24.txt. Mỗi bộ dữ liệu này

đều chứa 1.000 đồ thị. Trong đó, “Qx.txt” chứa các đồ thị có số cạnh nhỏ hơn hoặc bằng “x” cạnh.

Bộ dữ liệu thứ hai là tập dữ liệu các hợp chất hóa học (Chemical Compound Datasets). Tập dữ liệu này có 340 các hợp chất hóa học, trong đó mỗi hợp chất được mô hình hóa bởi một đồ thị vô hướng. Trong tập dữ liệu có 66 kiểu nguyên tử (atom) và 4 kiểu liên kết (single, double, triple, aromatic bond). Các thông tin về nguyên tử và liên kết được lưu trữ trong 2 file riêng biệt và sử dụng thủ tục được giới thiệu trong tài liệu [15] xây dựng các đồ thị cho tập dữ liệu. Bộ dữ liệu được lưu trong tệp tin “Chemical_340.txt” bao gồm 340 đồ thị, với đồ thị bé nhất gồm 2 đỉnh và 1 cạnh, đồ thị lớn nhất bao gồm 214 đỉnh và 214 cạnh.

Toàn bộ 2 bộ dữ liệu trên được tải về tại địa chỉ:

https://drive.google.com/file/d/1_vyR1_C9kLTG1__3qJH3DoVnteNtL8Kx/view?u sp=sharing.

3.1.2. Môi trường thử nghiệm

- Phần cứng: Các thông tin về phần cứng được sử dụng trong luận văn thể hiện ở bảng 3.1.

Bảng 3.1. Thông tin phần cứng được sử dụng thử nghiệm Thông tin phần cứng Chỉ số

CPU i7-4790 4 core 3.6GHz

RAM 20GB tốc độ bus:1666Mhz

GPU Không

HDD 1TB tốc độ 7200rpm

OS Ubuntu 18.04 phiên bản 64bit

- Phần mềm và ngôn ngữ lập trình

Các thuật toán được sử dụng để phát hiện cộng đồng mạng đều được lập trình bằng ngôn ngữ Python phiên bản 3.6. Trình biên dịch python và các thư viện mặc định đều được cài đặt thông qua phần mềm Anaconda được tải về tại địa chỉ:

Trình hỗ trợ soạn thảo lập trình (IDE) là Pycharm bản Community (Free) được tải về tại địa chỉ:

https://www.jetbrains.com/pycharm/download

- Thư viện hỗ trợ

Để hỗ trợ cho việc đọc, ghi và biểu diễn đồ thị chúng ta sử dụng thư viện networkx của Python được cài thông qua lệnh: “pip install networkx”. Phiên bản networkx được sử dụng trong luận văn này là bản 2.4.

Để hiển thị đồ thị cũng như lưu lại dưới dạng tệp tin ảnh thì chúng ta sử dụng thư viên matplotlib có sẵn trong Anaconda. Nếu chưa có, chúng ta có thể cài đặt thư viện matplotlib theo dòng lệnh “conda install matplotlib”. Phiên bản được sử dụng trong luận văn này là bản 3.2.0

3.2. Cài đặt và thử nghiệm thuật toán tìm kiếm tra đồ thị đẳng cấu

3.2.1. Mô tả yêu cầu bài toán kiếm tra đồ thị đẳng cấu

Cho 2 độ thị là Graph A và Graph B, kiểm tra xem đồ thị A có đẳng cấu với đồ thị B hay không.

Input: Graph A và graph B.

Output:

 Yes: Nếu graph A đẳng cấu với graph B và đưa ra phép ánh xạ đẳng cấu.

 No: Nếu graph A không đẳng cấu với graph B

3.2.2. Kết quả thử nghiệm

Đầu tiên, chúng ta tiến hành thử nghiệm với một kho gồm 2 đồ thị như hình 3.2. Trong đó, đồ thị Source và Target đều có 5 đỉnh và 6 cạnh.

Một phần của tài liệu (LUẬN văn THẠC sĩ) bài toán đồ thị con đẳng cấu trong khai phá dữ liệu đồ thị và ứng dụng phát hiện đồ thị con phổ biến (Trang 48)

Tải bản đầy đủ (PDF)

(66 trang)