Zaman Bükme Düzenleme Mesafesi - Time Warp Edit Distance

Zaman Bükme Düzenleme Mesafesi (TWED), ayrık için bir mesafe ölçüsüdür. Zaman serisi zaman 'esnekliği' ile eşleştirme. Diğer mesafe ölçüleriyle karşılaştırıldığında, (örneğin DTW (Dinamik Zaman Bükme ) veya LCS (En Uzun Yaygın Sonradan Oluşan Problem )), TWED bir metrik. Hesaplamalı zaman karmaşıklığı , ancak bazı özel durumlarda arama alanını azaltmak için bir koridor kullanılarak büyük ölçüde azaltılabilir. Bellek alanı karmaşıklığı azaltılabilir . İlk olarak 2009 yılında P.-F. Marteau.

Tanım


buna karşılık



Oysa özyinelemeşu şekilde başlatılır:



ile

Uygulamalar

TWED Algoritmasının C veya Matlab'da bir uygulaması yazarların ana sayfasından indirilebilir.[1]

TWED'in bir R uygulaması, madencilik için bir R paketi olan TraMineR'ye entegre edildi, durumların veya olayların sıralarını ve daha genel olarak ayrık dizi verilerini açıklayan ve görselleştiren[2]

Bunlara ek olarak, cuTWED G. Wright (2020) sayesinde geliştirilmiş bir algoritma kullanan TWED'in CUDA hızlandırılmış bir uygulamasıdır. Bu yöntem bellekte doğrusaldır ve büyük ölçüde paralelleştirilmiştir. cuTWED, CUDA C / C ++ ile yazılmıştır, python bağlamaları ile birlikte gelir ve ayrıca Marteau'nun referans C uygulaması için python bağlamaları içerir.

Python

ithalat dizi gibi npdef Dlp(Bir, B, p=2):    maliyet = np.toplam(np.güç(np.abs(Bir - B), p))    dönüş np.güç(maliyet, 1 / p)def twed(Bir, timeSA, B, timeSB, nu, _lambda):    # [mesafe, DP] = TWED (A, timeSA, B, timeSB, lambda, nu)    # Belirli bir A ve B zaman serileri için Zaman Bükme Düzenleme Mesafesini (TWED) Hesapla    #    # A: = Zaman serisi A (ör. [10 2 30 4])    # timeSA: = A zaman serisinin zaman damgası (ör. 1: 4)    # B: = Zaman serisi B    # timeSB: = B zaman serisinin zaman damgası    # lambda: = Silme işlemi için ceza    # nu: = Esneklik parametresi - nu> = 0 mesafe ölçümü için gerekli    # Referans :    # Marteau, P .; F. (2009). "Zaman Serisi Eşleştirme için Sertlik Ayarlı Zaman Bükme Düzenleme Mesafesi".    # Örüntü Analizi ve Makine Zekası ile ilgili IEEE İşlemleri. 31 (2): 306–318. arXiv: cs / 0703033    # http://people.irisa.fr/Pierre-Francois.Marteau/    # Giriş bağımsız değişkenlerini kontrol edin    Eğer len(Bir) != len(timeSA):        Yazdır("A'nın uzunluğu, zamana eşit değildirSA")        dönüş Yok, Yok    Eğer len(B) != len(timeSB):        Yazdır("B'nin uzunluğu timeSB'nin uzunluğuna eşit değildir")        dönüş Yok, Yok    Eğer nu < 0:        Yazdır("nu negatiftir")        dönüş Yok, Yok    # Dolgu ekleyin    Bir = np.dizi([0] + liste(Bir))    timeSA = np.dizi([0] + liste(timeSA))    B = np.dizi([0] + liste(B))    timeSB = np.dizi([0] + liste(timeSB))    n = len(Bir)    m = len(B)    # Dinamik programlama    DP = np.sıfırlar((n, m))    # DP Matrisini başlatın ve ilk satırı ve sütunu sonsuza ayarlayın    DP[0, :] = np.inf    DP[:, 0] = np.inf    DP[0, 0] = 0    # Minimum maliyeti hesaplayın    için ben içinde Aralık(1, n):        için j içinde Aralık(1, m):            # Çeşitli işlemlerin maliyetini hesaplayın ve tasarruf edin            C = np.olanlar((3, 1)) * np.inf            # A'da Silme            C[0] = (                DP[ben - 1, j]                + Dlp(Bir[ben - 1], Bir[ben])                + nu * (timeSA[ben] - timeSA[ben - 1])                + _lambda            )            # B'de Silme            C[1] = (                DP[ben, j - 1]                + Dlp(B[j - 1], B[j])                + nu * (timeSB[j] - timeSB[j - 1])                + _lambda            )            # Veri noktalarını her iki zaman serisinde de saklayın            C[2] = (                DP[ben - 1, j - 1]                + Dlp(Bir[ben], B[j])                + Dlp(Bir[ben - 1], B[j - 1])                + nu * (abs(timeSA[ben] - timeSB[j]) + abs(timeSA[ben - 1] - timeSB[j - 1]))            )            # Minimum maliyetle operasyonu seçin ve DP Matrisini güncelleyin            DP[ben, j] = np.min(C)    mesafe = DP[n - 1, m - 1]    dönüş mesafe, DP

En uygun maliyetli yolu bulmak için geriye dönük izleme:

def geri izleme(DP):    # [en iyi_yol] = GERİ TAKİP (DP)    # Maliyet açısından en verimli yolu hesaplayın    # DP: = TWED işlevinin DP matrisi    x = np.şekil(DP)    ben = x[0] - 1    j = x[1] - 1    # Yolların indisleri ters yönde kaydedilir    # yol = np.ones ((i + j, 2)) * np.inf;    en iyi_yol = []    adımlar = 0    süre ben != 0 veya j != 0:        en iyi_yol.eklemek((ben - 1, j - 1))        C = np.olanlar((3, 1)) * np.inf        # Veri noktalarını her iki zaman serisinde de saklayın        C[0] = DP[ben - 1, j - 1]        # A'da Silme        C[1] = DP[ben - 1, j]        # B'de Silme        C[2] = DP[ben, j - 1]        # En düşük maliyetli dizini bulun        idx = np.argmin(C)        Eğer idx == 0:            # Veri noktalarını her iki zaman serisinde de saklayın            ben = ben - 1            j = j - 1        elif idx == 1:            # A'da Silme            ben = ben - 1            j = j        Başka:            # B'de Silme            ben = ben            j = j - 1        adımlar = adımlar + 1    en iyi_yol.eklemek((ben - 1, j - 1))    en iyi_yol.tersine çevirmek()    dönüş en iyi_yol[1:]

MATLAB

işlevi[mesafe, DP] =twed(A, zamanSA, B, zamanSB, lambda, nu)% [mesafe, DP] = TWED (A, timeSA, B, timeSB, lambda, nu)    Verilen A ve B zaman serileri için% Hesaplama Zaman Bükme Düzenleme Mesafesi (TWED)    %    % A: = Zaman serisi A (ör. [10 2 30 4])    % timeSA: = A zaman serisinin zaman damgası (ör. 1: 4)    % B: = Zaman serisi B    % timeSB: = B zaman serisinin zaman damgası    % lambda: = Silme işlemi için ceza    % nu: = Esneklik parametresi - nu> = 0 mesafe ölçümü için gerekli    %    % Kodlayan: P.-F. Marteau - http://people.irisa.fr/Pierre-Francois.Marteau/     % Giriş bağımsız değişkenlerini kontrol edin    Eğer uzunluk (A) ~ = uzunluk (timeSA)        uyarı('A'nın uzunluğu, zamana eşit değildirSA')        dönüşson    Eğer uzunluk (B) ~ = uzunluk (timeSB)        uyarı('B'nin uzunluğu, zaman SB'nin uzunluğuna eşit değildir')        dönüşson    Eğer nu <0        uyarı("nu negatiftir")        dönüşson    % Dolgu ekle    Bir = [0 Bir];    timeSA = [0 timeSA];    B = [0 B];    timeSB = [0 timeSB];     % Dinamik programlama    DP = sıfırlar(uzunluk(Bir), uzunluk(B));     % DP Matrisini başlatın ve ilk satırı ve sütunu sonsuza ayarlayın    DP(1, :) = inf;    DP(:, 1) = inf;    DP(1, 1) = 0;     n = uzunluk(timeSA);    m = uzunluk(timeSB);    Minimum hesaplama maliyeti    için i = 2: n        için j = 2: m            maliyet = Dlp(Bir(ben), B(j));                     % Çeşitli işlemlerin maliyetini hesaplayın ve tasarruf edin            C = olanlar(3, 1) * inf;                     A'da Silme Yüzdesi            C(1) = DP(ben - 1, j) + Dlp(Bir(ben - 1), Bir(ben)) + nu * (timeSA(ben) - timeSA(ben - 1)) + lambda;            B'de Silme Yüzdesi            C(2) = DP(ben, j - 1) + Dlp(B(j - 1), B(j)) + nu * (timeSB(j) - timeSB(j - 1)) + lambda;            Veri noktalarını her iki zaman serisinde% tut            C(3) = DP(ben - 1, j - 1) + Dlp(Bir(ben), B(j)) + Dlp(Bir(ben - 1), B(j - 1)) + ...            nu * (abs(timeSA(ben) - timeSB(j)) + abs(timeSA(ben - 1) - timeSB(j - 1)));                     % Minimum maliyetle operasyonu seçin ve DP Matrisini güncelleyin            DP(ben, j) = min(C);        sonson     mesafe = DP(n, m);     % Öklid mesafesini hesaplama işlevi    işlevi[maliyet] =Dlp(A, B)maliyet = sqrt(toplam((Bir - B) .^ 2, 2));    sonson

En uygun maliyetli yolu bulmak için geriye dönük izleme:

işlevi[yol] =geri izleme(DP)% [yol] = GERİ TAKİP (DP)    En uygun maliyetli yolu hesaplayın    % DP: = TWED işlevinin DP matrisi     x = boyut(DP);    ben = x(1);    j = x(2);     Yolların indisleri ters yönde kaydedilir    yol = olanlar(ben + j, 2) * Inf;     adımlar = 1;    süre (ben ~= 1 || j ~= 1)        yol(adımlar, :) = [ben; j];             C = olanlar(3, 1) * inf;             Veri noktalarını her iki zaman serisinde% tut        C(1) = DP(ben - 1, j - 1);        A'da Silme Yüzdesi        C(2) = DP(ben - 1, j);        B'de Silme Yüzdesi        C(3) = DP(ben, j - 1);             En düşük maliyet için dizini bulun        [~, idx] = min(C);             değiştirmek idx            durum 1                Veri noktalarını her iki zaman serisinde% tut                ben = ben - 1;                j = j - 1;            durum 2                A'da Silme Yüzdesi                ben = ben - 1;                j = j;            durum 3                B'de Silme Yüzdesi                ben = ben;                j = j - 1;        son        adımlar = adımlar + 1;    son    yol (adımlar, :) = [ben j];     % Yol ters yönde hesaplandı.    yol = yol(1:adımlar, :);    yol = yol(son: - 1:1, :); son

Referanslar

  1. ^ Marteau, P.-F. "IRISA sunucularındaki web sitesi". Alındı 2016-09-11.
  2. ^ TraMineR. "Cenevre Üniversitesi, CH sunucularındaki web sitesi". Alındı 2016-09-11.
  • Marteau, P .; F. (2009). "Zaman Serisi Eşleştirme için Sertlik Ayarlı Zaman Bükme Düzenleme Mesafesi". Örüntü Analizi ve Makine Zekası için IEEE İşlemleri. 31 (2): 306–318. arXiv:cs / 0703033. doi:10.1109 / TPAMI.2008.76.