×

Algoritma Dynamic Time Warping

Algoritma Dynamic Time Warping

2,706 Views

Dynamic Time Warping atau kita singkat saja dengan DTW  (jangan kebalik dengan DWT) adalah algoritma penyelarasan time series yang dikembangkan awalnya untuk pengenalan suara (1). Ini bertujuan menyelaraskan dua urutan vektor fitur dengan memutar sumbu waktu secara iteratif hingga kecocokan optimal (menurut metrik yang sesuai) antara dua urutan ditemukan.

(1) Sakoe, H. And Chibam, S. Dynamic Programming algorithm optimization for spoken word recognition. IEEE Trans. On Acoust, Speech, and Signal Processing, ASSP 26, 43-49 (1978)

Bagaimana mengukur tingkat jarak pada time series diatas?

Gambar kiri (non elastis) : Jarak manapun (Euclidean, Manhattan,…) yang menyelaraskan titik (i) pada satu seri waktu dengan titik ke (i) di sisi yang lain akan menghasilkan skor kesamaan yang buruk.

Gambar kanan (elastis): Perataan non-linear (elastis) menghasilkan ukuran kesamaan yang lebih intuitif, memungkinkan bentuk-bentuk serupa untuk dicocokkan bahkan jika mereka keluar (beda fase) dalam domain waktu.

Ilustrasi Fungsi Dynamic Time Warping

Time Normalized Distance measure

Cara Perhitungan Dynamic Time Warping

Membuat 2 sinyal yang akan dibandingkan, kita akan mengukur jarak/kemiripan 2 sinyal dibawah ini yang mempunyai time yang berbeda

Perhatikan variabel berikut

x = [1, 1, 2, 3, 2, 0]; 
y = [0, 1, 1, 2, 3, 2, 1];

Kita akan menghitung distances menggunakan eucledian distances

distances = zeros(length(y),length(x));
for i=1:length(y)
    for j=1:length(x)
        distances(i,j) = (y(i)-x(j))^2;
    end
end

hasilnya

distances =

     1     1     4     9     4     0
     0     0     1     4     1     1
     0     0     1     4     1     1
     1     1     0     1     0     4
     4     4     1     0     1     9
     1     1     0     1     0     4
     0     0     1     4     1     1

Kita bisa visualisasikan dalam heatmap plot

Menghitung accumulated_cost mulai dari baris pertama

accumulated_cost = zeros(length(y),length(x));
accumulated_cost(1,1) = distances(1,1);
for i=2:length(x)
    accumulated_cost(1,i) = distances(1,i) + accumulated_cost(1, i-1);
end

Dilanjutkan sisi kolom pertama dari y

for i=2:length(y)
    accumulated_cost(i,1) = distances(i,1) + accumulated_cost(i-1,1);
end

Menghitung untuk semua element (yaitu baris dan kolom ke 2) yang lain, dengan rumus berikut

See also  Mengenal Conv2d pada algoritma CNN

 

    \[Accumulated</strong><strong> </strong><strong>Cost</strong><strong> </strong><strong>(</strong><strong>D</strong><strong>(</strong><strong>i</strong><strong>,</strong><strong>j</strong><strong>))=min{</strong><strong>D</strong><strong>(</strong><strong>i</strong><strong>−</strong><strong>1</strong><strong>,</strong><strong>j</strong><strong>−</strong><strong>1</strong><strong>),</strong><strong>D</strong><strong>(</strong><strong>i</strong><strong>−</strong><strong>1</strong><strong>,</strong><strong>j</strong><strong>),</strong><strong>D</strong><strong>(</strong><strong>i</strong><strong>,</strong><strong>j</strong><strong>−</strong><strong>1</strong><strong>)}+</strong><strong>distance</strong><strong>(</strong><strong>i</strong><strong>,</strong><strong>j</strong><strong>)\]

for i=2:length(y)
    for j=2:length(x)
        accumulated_cost(i, j) = min([accumulated_cost(i-1, j-1), accumulated_cost(i-1, j), accumulated_cost(i, j-1)]) + distances(i, j);
    end
end

Mencari path optimal : sekarang perlu menemukan jalan yang meminimalkan jarak yang kita lakukan dengan teknik backtracking (mundur). Prosedur backtracking cukup sederhana dan melibatkan upaya untuk kembali dari titik terakhir (M, N) dan menemukan tempat mana yang akan dicapai (dengan meminimalkan biaya) dan melakukan ini dengan cara berulang.

path(1,:) = [length(x), length(y)];
i = length(y);
j = length(x);
index = 2;
while i>1 && j>1
    if i==1
        j = j - 1;
    elseif j==1
        i = i - 1;
    else
        minimal = min([accumulated_cost(i-1, j-1), accumulated_cost(i-1, j), accumulated_cost(i, j-1)]);
        if accumulated_cost(i-1, j) == minimal
            i = i - 1;
        elseif accumulated_cost(i, j-1) == minimal
            j = j - 1;
        else
            i = i - 1;
            j = j- 1;
        end
    end
    path(index,:)=[j, i];
    index = index+1;
end
path(index,:)=[1,1];

menghasilkan

path =

     6     7
     5     6
     4     5
     3     4
     2     3
     2     2
     1     2
     1     1

Kemudian menghitung cost dari path (index distances) yang telah diketahui

cost  = 0;
for i=1:length(path)
    cost = cost+distances(path(i,2),path(i,1));
end
cost

hasil cost yang merupakan DTW yaitu

2

 

You May Have Missed