Thuật toán GSP (Generalized Sequential Patterns)

Một phần của tài liệu Một số thuật toán khai phá luật dãy và ứng dụng thử nghiệm vào hệ thống quản lý khách hàng và tính hóa đơn nước (Trang 30)

Thuật toán GSP khai phá mẫu dãy tổng quát. Theo đánh giá dựa trên thực nghiệm sử dụng dữ liệu mô phỏng và dữ liệu thực tế cho thấy GSP là nhanh hơn nhiều lần so với thuật toán AprioriAll đã đƣợc giới thiệu ở trên. Có hai lý do chính [2]:

- Thuật toán GSP tính số lƣợng ứng viên ít hơn so với AprioriAll

- Thuật toán AprioriAll phải tìm kiếm lần đầu tập các phần tử phổ biến xuất hiện trong mỗi thành phần của một dãy trong thời gian chuyển đổi dữ liệu, và sau đó tìm trong dữ liệu chuyển đổi các dãy ứng viên tồn tại trong đó. Điều này thƣờng dẫn đến chậm hơn so với tìm kiếm trực tiếp các dãy ứng viên. Cấu trúc cơ bản của thuật toán GSP tìm kiếm mẫu dãy là thuật toán duyệt dữ liệu nhiều lần, lần duyệt đầu tiên xác định độ hỗ trợ của từng phần tử, tức là số lƣợng dữ liệu dãy có chứa các phần tử. Kết thúc lần duyệt đầu tiên, thuật toán đƣa ra đƣợc các phần tử thƣờng xuyên, nghĩa là thỏa mãn độ hỗ trợ tối thiểu. Mỗi phần tử nhƣ vậy tiết lộ một dãy phổ biến 1-element chứa phần tử đó. Mỗi dãy con bắt đầu duyệt với tập khởi đầu là các dãy phổ biến đƣợc tìm thấy trong lần duyệt trƣớc đó. Tập khởi đầu đƣợc sử dụng để sinh ra các dãy phổ biến tiềm năng mới, gọi là các dãy ứng viên. Mỗi dãy ứng viên có ít nhất một phần tử thuộc dãy khởi đầu, vì thế tất cả các dãy ứng viên

Khai phá luật dãy Nguyễn Đình Văn trong một lần duyệt sẽ có cùng số phần tử. Độ hỗ trợ cho các dãy ứng viên này đƣợc tìm thấy trong qúa trình duyệt dữ liệu. Kết thúc lần duyệt, thuật toán xác định các dãy ứng viên thƣờng xuyên thực sự. Những ứng viên thƣờng xuyên này trở thành tập khởi đầu cho lần duyệt tiếp theo. Thuật toán kết thúc khi không tìm đƣợc dãy phổ biến nào ở cuối lần duyệt, hoặc khi không có dãy ứng viên nào đƣợc sinh ra.

Ta cần chỉ rõ hai điểm mấu chốt của thuật toán là cách sinh các dãy ứng viên (Candidate generation) và cách tính độ hỗ trợ để xác định dãy ứng viên (Counting candidates).

 Sinh dãy ứng viên (Candidate Generation)

Xét một dãy có k phần tử, gọi là k-sequence (nếu một phần tử xuất hiện nhiều lần trong các thành phần khác nhau của một dãy, mỗi lần xuất hiện đƣợc tính vào giá trị của k.). Gọi Lk biểu thị tập tất cả các dãy phổ biến k-sequence và Ck biểu thị tập các dãy ứng viên k-sequence.

Cho Lk-1 là tập tất cả các dãy phổ biến (k-1)-sequence, ta cần tạo ra tập cha (superset) của tập tất cả các dãy phổ biến k-sequence. Đầu tiên, ta định nghĩa khái niệm về một dãy con liên tục.

Định nghĩa: Cho dãy s = <s1 s2 … sn> và một dãy con c, c là dãy con liên tục của s nếu thỏa mãn bất kỳ điều kiện nào sau đây [2]:

1. c nhận đƣợc từ s bằng cách lƣợc bỏ phần tử s1 hoặc sn.

2. c nhận đƣợc từ s bằng cách lƣợc bỏ một phần tử từ thành phần si mà si có ít nhất hai phần tử.

3. c là dãy con liên tục của c‟, và c‟ là dãy con liên tục của s.

Ví dụ: Giả sử có dãy s = <(1,2) (3,4) (5) (6)>. Khi đó, các dãy con liên tục của s là <(2) (3,4) (5)>; <(1,2) (3) (5) (6)>; <(3) (5)>. Các dãy không phải là dãy con liên tục của s nhƣ: <(1,2) (3,4) (6)>; <(1,2) (5) (6)>

Trong [1] cho thấy rằng, dữ liệu dãy có chứa dãy s cũng sẽ chứa bất kỳ dãy con liên tục nào của s. Nếu không có ràng buộc về khoảng thời gian tối đa max-gap, dữ liệu dãy sẽ chứa tất cả các dãy con của s (bao gồm cả các dãy con không liên tục). Đặc tính này cung cấp cơ sở cho thủ tục sinh dãy ứng viên.

Thực hiện sinh các dãy ứng viên qua hai bƣớc:

1. Giai đoạn nối (Join Phase): Thực hiện sinh các dãy ứng viên bằng phép nối Lk-

1 với Lk-1. Một dãy s1 nối với s2 nếu dãy con thu đƣợc bằng cách loại bỏ phần tử đầu tiên của s1 và dãy thu đƣợc bằng cách loại bỏ phần tử cuối cùng của s2 là giống nhau. Dãy ứng viên đƣợc sinh bằng phép nối s1 với s2 là dãy s1 đƣợc mở rộng với phần tử cuối cùng trong s2. Phần tử đƣợc thêm trở nên thành phần riêng biệt nếu đó là một thành phần riêng biệt trong s2, và một phần của

Khai phá luật dãy Nguyễn Đình Văn thành phần cuối cùng của s1 khác. Khi thực hiện nối L1 với L1, ta cần thêm vào phần tử trong s2 một phần của itemset cũng nhƣ một thành phần riêng biệt, vì cả hai <(x) (y)> và <(x y)> đều cho cùng một dãy <(y)> khi loại bỏ phần tử đầu tiên. (Ta thấy rằng s1 và s2 là các dãy con liên tục của các dãy ứng viên mới.)

2. Giai đoạn thanh loại (Prune Phase): Ta loại bỏ các dãy ứng viên có dãy con liên tục (k-1)-subsequence mà có độ hỗ trợ nhỏ hơn độ hỗ trợ tối thiểu. Nếu không tính ràng buộc thời gian max-gap, ta cũng loại bỏ các dãy ứng viên mà có bất kỳ dãy con nào không thỏa mãn độ hỗ trợ tối thiểu.

Ví dụ: Hình 2.16 cho thấy L3, và C4 sau khi thực hiện giai đoạn nối và thanh loại. Trong giai đoạn nối, dãy <(1, 2) (3)> nối với <(2) (3, 4)> để sinh ra dãy <(1, 2) (3, 4)> và nối với <(2) (3) (5)> để sinh ra dãy <(1, 2) (3) (5)>. Các dãy còn lại không đƣợc nối với bất kỳ dãy nào trong L3. Chẳng hạn, dãy <(1, 2) (4)> không đƣợc nối với bất kỳ dãy nào vì không có dãy nào có dạng <(2) (4 x)> hoặc <(2) (4) (x)>. Trong giai đoạn thanh loại, dãy <(1, 2) (3) (5)> bị loại bỏ vì dãy con liên tục của nó là <(1) (3) (5)> không thuộc L3.

Frequent 3-Sequences

Candidate 4-Sequences after join after pruning <(1, 2) (3)> <(1, 2) (4)> <(1) (3, 4)> <(1, 3) (5)> <(2) (3, 4)> <(2) (3) (5)> <(1, 2) (3, 4)> <(1, 2) (3) (5)> <(1, 2) (3, 4)>

Hình 2.16: Ví dụ sinh dãy ứng viên

 Tính độ hỗ trợ các ứng viên (Counting Candidates)

Trong quá trình duyệt dữ liệu, ta đọc mỗi dữ liệu dãy tại một thời điểm và tăng độ hỗ trợ của các ứng viên có trong dữ liệu dãy. Nhƣ vậy, với một tập các dãy ứng viên C và một dữ liệu dãy d, ta cần tìm tất cả các dãy trong C có chứa d. Ta sử dụng hai kỹ thuật sau để giải quyết vấn đề này:

1. Sử dụng cấu trúc dữ liệu hash-tree để giảm số lƣợng các ứng viên trong C đã đƣợc kiểm tra cho một dữ liệu dãy.

2. Biến đổi đại diện của dữ liệu dãy d để có thể tìm kiếm ứng viên là dãy con của d một cách hiệu quả.

Giảm số lượng các ứng viên cần kiểm tra:

a. Thêm các dãy ứng viên vào hash-tree: Khi thêm một dãy s, ta bắt đầu đi từ nút gốc cho tới khi tìm đƣợc một nút lá. Tại nút trung gian có độ sâu p, ta lựa chọn nhánh tiếp theo bằng cách áp dụng một hàm băm cho phần tử thứ p của dãy. Lƣu ý là ta áp dụng hàm băm đến phần tử thứ p, không phải là thành

Khai phá luật dãy Nguyễn Đình Văn phần thứ p. Tất cả các nút đƣợc khởi tạo bƣớc đầu là các nút lá. Khi số lƣợng các dãy trong một nút lá vƣợt quá một ngƣỡng, nút lá khi đó đƣợc chuyển đến nút trung gian.

b. Tìm các dãy ứng viên đƣợc chứa trong dữ liệu dãy: Bắt đầu từ nút gốc, ta tìm tất các các ứng viên đƣợc chứa trong dữ liệu dãy d. Áp dụng thủ tục sau, dựa trên các loại nút bao gồm: (adsbygoogle = window.adsbygoogle || []).push({});

 Nút trung gian là nút gốc: Áp dụng hàm băm cho mỗi phần tử trong d, và áp dụng đệ quy thủ tục này tới nút nằm trong bucket tƣơng ứng. Với bất kỳ dãy s đƣợc chứa trong dữ liệu dãy d, phần tử đầu tiên của s phải nằm trong d. Thực hiện băm trên mọi phần tử trong d, ta đảm bảo rằng chỉ bỏ qua các dãy bắt đầu với một phần tử không nằm trong d.

 Nút trung gian không phải là nút gốc: Giả sử ta đến nút này bằng việc thực hiện băm phần tử x có thời gian giao dịch (transaction-time) là t. Áp dụng hàm băm tới mỗi phần tử trong d có thời gian giao dịch trong khoảng [t – window-size, t + max(window-size, max-gap)] và áp dụng đệ quy thủ tục này tới các nút trong bucket tƣơng ứng.

Để thấy tại sao kết quả trả về là tập các ứng viên, xét một dãy ứng viên s với hai phần tử liên tục là x và y. Cho x là phần tử đƣợc chứa trong giao dịch d với thời gian giao dịch là t. Vì d chứa s nên thời gian giao dịch tƣơng ứng với y cần phải trong khoảng [t – window-size, t + window-size] nếu y là một phần của cùng thành phần chứa x, hoặc trong khoảng thời gian (t, t + max-gap] nếu y là một phần của thành phần kế tiếp. Do đó nếu chúng ta đạt đến nút này bằng thực hiện băm trên một phần tử x với thời gian giao dịch t, y phải đƣợc chứa trong một giao dịch có thời gian giao dịch ở trong khoảng [t – window-size, t + max (window-size, max-gap)] cho dữ liệu dãy để hỗ trợ các dãy. Nhƣ vậy chúng ta chỉ cần áp dụng hàm băm tới các phần tử trong d có thời gian giao dịch nằm trong khoảng thời gian trên, và kiểm tra các nút tƣơng ứng.

 Nút lá: Đối với mỗi dãy s là nút lá, ta kiểm tra xem d có chứa s, và thêm s vào tập kết quả nếu cần thiết. (Chúng ta sẽ thảo luận dƣới đây cách chính xác để tìm d chứa một dãy ứng viên cụ thể.) Từ đó ta kiểm tra mỗi dãy đƣợc chứa trong nút này, và không bỏ qua bất kỳ dãy nào.

Kiểm tra dữ liệu dãy chứa một dãy cho trước:

Cho dữ liệu dãy d, và một dãy ứng viên s = <s1 … sn> . Trƣớc tiên ta mô tả thuật toán để kiểm tra nếu d chứa s, giả sử tồn tại một thủ tục tìm kiếm sự xuất hiện đầu tiên của một thành phần của s ở d sau một thời gian nhất định, và sau đó mô tả thủ tục này.

Khai phá luật dãy Nguyễn Đình Văn Thuật toán này kiểm tra nếu dữ liệu dãy d chứa một dãy ứng viên s luân phiên giữa hai giai đoạn. Thuật toán bắt đầu với giai đoạn duyệt xuôi từ phần tử đầu tiên.

 Giai đoạn duyệt xuôi (forward phase): Thuật toán tìm thành phần kế tiếp của s trong d miễn là hiệu số giữa thời gian kết thúc của thành phần đã đƣợc tìm thấy và thời gian bắt đầu của thành phần trƣớc đó là ít hơn khoảng max-gap. (Nhắc lại rằng đối với mỗi thành phần si, thời gian bắt đầu start-time(si) và thời gian kết thúc end-time(si) tƣơng ứng với thời gian giao dịch đầu tiên và cuối cùng của tập các giao dịch có chứa si). Nếu hiệu số này nhiều hơn max-gap, thuật toán sẽ chuyển sang giai đoạn duyệt ngƣợc. Nếu một thành phần không đƣợc tìm thấy tức là dữ liệu dãy không chứa s.

 Giai đoạn duyệt ngƣợc (backward phase): Thuật toán thực hiện quay lui và xét (kéo lên) các thành phần liền trƣớc. Nếu si là thành phần hiện tại và thời gian kết thúc end-time(si) = t, thuật toán tìm tập các giao dịch đầu tiên có chứa si mà có thời gian giao dịch sau (t – max-gap). Thời gian bắt đầu đối với si–1 (sau khi si–1 đƣợc xét đến) có thể sau thời gian kết thúc end-time của si. Trong khi xét si–1 có thể đòi hỏi phải xét cả si–2 bởi vì ràng buộc max-gap giữa si–1 và si–2 có thể không còn đƣợc thỏa mãn. Thuật toán thực hiện quay lui cho đến khi hoặc là ràng buộc max-gap giữa thành phần vừa xét và thành phần liền trƣớc thỏa mãn, hoặc là thành phần đầu tiên đƣợc lấy lên. Sau đó thuật toán chuyển sang giai đoạn duyệt xuôi để tìm các thành phần của s trong d bắt đầu từ thành phần liền sau của thành phần cuối cùng đƣợc lấy lên của giai đoạn duyệt ngƣợc. Nếu không có bất kỳ thành phần nào đƣợc lấy lên (nghĩa là không có tập dãy con của các giao dịch có chứa thành phần) khi đó dữ liệu dãy không chứa s.

Thủ tục thực hiện lặp đi lặp lại, hoán đổi giữa giai đoạn duyệt xuôi và duyệt ngƣợc cho tới khi tất cả các thành phần đƣợc tìm thấy.

Ví dụ: Cho dữ liệu dãy trong Hình 2.17. Xét trƣờng hợp max-gap là 30, min-gap là 5 và window-size là 0. Với dãy ứng viên <(1, 2) (3) (4)>, (forward phase) trƣớc tiên ta cần tìm (1, 2) tại thời gian giao dịch 10, tiếp theo tìm thành phần (3) tại thời gian giao dịch 45. Khi đó khoảng thời gian giữa hai thành phần (35 ngày) lớn hơn max-gap, (backward phase) lấy lên thành phần (1, 2). Tìm lần xuất hiện đầu tiên của (1, 2) sau thời gian 15, bởi vì thời gian kết thúc end-time((3)) = 45 và max-gap là 30, và vì vậy thậm chí nếu (1, 2) xảy ra tại một số thời điểm trƣớc 15, nó vẫn sẽ không thỏa mãn ràng buộc max-gap. Ta tìm (1, 2) tại thời gian 50. Vì đây là thành phần đầu tiên nên không phải kiểm tra xem liệu ràng buộc max-gap có nằm giữa (1, 2) và thành phần trƣớc đó có thỏa mãn không. Ta chuyển sang bƣớc tiếp theo. Vì (3) không còn xảy ra lớn hơn 5 ngày sau (1, 2), cần tìm sự xuất hiện tiếp theo của (3) sau thời gian 55. Ta

Khai phá luật dãy Nguyễn Đình Văn tìm thấy (3) tại thời gian 65. Khi ràng buộc giữa (3) và (1, 2) thõa mãn, ta tiếp tục di chuyển tiếp và tìm thấy (4) tại thời gian 90. Ràng buộc max-gap giữa (4) và (3) đƣợc thỏa mãn.

Transaction-Time Items Item Times

10 25 45 50 65 90 95 1, 2 4, 6 3 1, 2 3 2, 4 6 1 2 3 4 5 6 7 → 10 → 50 → NULL → 10 → 50 → 90 → NULL → 45 → 65 → NULL → 25 → 90 → NULL → NULL → 25 → 95 → NULL → NULL

Hình 2.17: Dữ liệu dãy Hình 2.18: Item xuất hiện theo thời gian Để tìm kiếm một cách hiệu quả một phần tử đơn lẻ (item), ta sử dụng mảng để lƣu trữ tất cả các phần tử có trong dữ liệu dãy và thời gian giao dịch, dữ liệu dãy trong Hình 2.17 đƣợc biến đổi nhƣ Hình 2.18, nhằm hỗ trợ cho việc tìm kiếm lần xuất hiện đầu tiên của một thành phần trong dữ liệu dãy sau thời gian t. Thuật toán duyệt một lần tất cả các phần tử trong thành phần và tìm thời gian giao dịch đầu tiên của mỗi phần tử lớn hơn t. Nếu hiệu số giữa thời gian bắt đầu và thời gian kết thúc nhỏ hơn hoặc bằng với window-size thì chấp nhận. Nếu không, t đƣợc lấy là hiệu số giữa thời gian kết thúc và window-size, thủ tục tiếp tục đƣợc lặp lại.

Ví dụ: Cho dữ liệu dãy trong Hình 2.17, giả sử window-size = 7 ngày, ta phải tìm lần xuất hiện đầu tiên của thành phần (2, 6) sau thời gian t = 20. Ta tìm phần tử 2 tại thời gian 50, phần tử 6 tại thời gian 25. Vì end-time((2,6)) – start-time((2,6)) > 7 nên ta đặt t là 43 (= end-time((2,6)) – window-size) và thử lại. Phần tử 2 còn lại tại thời gian 90, trong khi phần tử 6 tiếp theo tại thời gian 95. Vì khoảng thời gian giữa 90 và 95 nhỏ hơn window-size nên ta bỏ qua.

 Phân loại

Cách tiếp cận cơ bản là thay thế mỗi dữ liệu dãy d với một dãy mở rộng d’, trong đó, mỗi giao dịch d’i của d’ chứa các phần tử trong giao dịch di của d tƣơng ứng, cũng nhƣ tất cả các “ancestor” (tổ tiên) của mỗi phần tử trong di. Ví dụ, một dữ liệu dãy <(1, 2) (3)> có thể đƣợc thay thế với dãy mở rộng <(1, 2, 4, 5, 6) (3, 4, 6)> . Sau đó, ta thực GSP trên các dãy mở rộng này.

Có hai cách tối ƣu hóa để cải thiện đáng kể hiệu suất thực hiện. Cách thứ nhất là tính toán trƣớc các “ancestor” của mỗi phần tử và loại bỏ các “ancestor” không có trong bất kỳ dãy ứng viên nào đƣợc tính trƣớc khi thực hiện duyệt dữ liệu. Ví dụ, nếu (2), (3) và (4) không nằm trong bất kỳ dãy ứng viên nào đƣợc tính trong lần duyệt hiện tại, ta sẽ thay thế dãy <(1, 2) (3)> với dãy mở rộng <(1, 5, 6) (5, 6)> (thay vì dãy mở rộng <(1, 2, 4, 5, 6) (3, 5, 6)>). Cách tối ƣu hóa thứ hai là không tính các mẫu dãy với một thành phần có chứa cả phần tử x và phần tử y là ancestor của x, vì độ hỗ trợ của

Khai phá luật dãy Nguyễn Đình Văn các dãy này sẽ luôn giống độ hỗ trợ cho các mẫu dãy không có y. (Bất kỳ giao dịch nào chứa x cũng sẽ chứa y.)

Một phần của tài liệu Một số thuật toán khai phá luật dãy và ứng dụng thử nghiệm vào hệ thống quản lý khách hàng và tính hóa đơn nước (Trang 30)