2.
3.6 Giải thuật nối mô típ
Giải thuật nối mô típ (Motif Concatenation) được Heng Tang và Stephen Liao đưa ra năm 2008 [7] nhằm giải quyết bài toán tìm kiếm mô típ có chiều dài khác nhau trên dữ liệu chuỗi thời gian. Đây cũng là giải thuật chính mà đề tài sẽ xem xét.
Giải thuật nối mô típ sử dụng ma trận đụng độ được tạo ra bởi giải thuật chiếu ngẫu nhiên để tìm mô típ. Chiều dài w của các chuỗi con sẽ được chọn rất nhỏ để tìm tất cả các mô típ có chiều dài w. Sau đó, các mô típ nhỏ này sẽ được nối thành một mô típ dài hơn. Việc nối mô típ được thực hiện nhờ tính chất các mô típ con của một mô típ lớn hơn sẽ có dạng là một đoạn thẳng hướng lên trên trong biểu diễn ma trận đụng độ. Tính chất này được minh hoạ như trong hình 3-11.
Hình 3-12: Biểu diễn ma trận đụng độ của các chuỗi con. Các mô típ nhỏ hơn tạo thành các đoạn thẳng hướng lên trên (hình bên trái) và các mô típ lớn thật sự của
chúng (hình bên phải) (nguồn [7]).
Giải thuật sẽ xem sét từng mô típ nhỏ và phân chia chúng vào từng phân đoạn
(segment) riêng. Mỗi phân đoạn sẽ bao gồm các mô típ lân cận nhau tạo thành đoạn thẳng trên ma trận đụng độ. Việc chia phân đoạn này được thực hiện dựa vào tính chất hình học của đoạn thẳng. Giải thuật sẽ sử dụng một hằng số d thể hiện phạm vi tìm kiếm, hai hằng số α1 và α2 thể hiện phạm vi độ dốc (hệ số góc) cho phép của hai mô típ.
Giả sử mô típ hiện tại là Mi, mô típ đang xét tiếp theo là Mj. Nếu Mj nằm trong diện tích tìm kiếm của Mi được xác định bởi hằng số d, thì hệ số góc của đường thẳng tạo bởi Mi và Mj sẽ được tính. Nếu hệ số góc này nằm trong đoạn [α1, α2] thì
Mj sẽ cùng phân đoạn với Mi. Hình 3-12 thể hiện một cách trực quan phương pháp chia phân đoạn này.
Hình 3-13: Khu vực tìm kiếm được xác định bởi hằng số d (hình vuông nét đứt), hai vectơ là hai hệ số góc α1 và α2 giới hạn khu vực hợp lệ của hệ số góc (phần gạch
chéo) (nguồn [7]).
Sau đây là giải thuật nối mô típ được thể hiện với mã giả. For each Mi in setM, Mi = (si1,si2) Do
Mi.segid = 0 End for
For each Mi in setM Do
If Mi.segid = 0 then Mi.segid = new(segid) //Nếu segid = 0 thì tạo một segid mới
For each Mj in setM, j > i, if |si1 – sj1| ≤ d and |si2 – sj2| ≤ d then // Nếu Mj thuộc không gian tìm kiếm tạo bởi d
slope = (sj2 – sj1) / (si2 – si1) If slope in [α1, α2] then
//Nếu hệ số góc slope thuộc đoạn [α1, α2] If Mj.segid = 0 then Mj.segid = Mi.segid
// Nếu Mj chưa thuộc phân đoạn nào thì gán nó thuộc cùng phân đoạn với Mi
End for End for
For each segment ID segidi Do
Sau khi đã chia các mô típ nhỏ vào các phân đoạn, mỗi phân đoạn này sẽ tạo thành một mô típ lớn hơn khi nối các mô típ trong đó lại với nhau. Do đó, việc chọn giá trị chiều dài w của mô típ rất nhỏ ban đầu lúc xây dựng ma trận đụng độ sẽ giúp giải thuật phát hiện tất cả các mô típ có thể có với chiều dài khác nhau.