Que fait (vraiment) dtw (dynamic time warping) ?
Bonjour,
Quelqu'un connait-il / utilise-t-il la fonction dtw ?
En théorie, elle calcule la distance entre deux courbes en utilisant les dynamic time warping. Selon ce que j'en sais, elle doit donner soit la somme des longueurs des segments qui permettent de joindre les courbes, soit leur max. Mais je n'arrive pas à retrouver les résultats à la main...
Première constatation : l'argument dist.method ne semble pas marcher :
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| trajE <- sin((1:150)/10)+rnorm(150,,0.1)
trajF <- sin((1:150)/20)+rnorm(150,,0.1)
plot(trajE,type="o",col=2)
lines(trajF,type="o",col=4)
dtw(trajE,trajF)$dist
#[1] 44.10298
dtw(trajE,trajF,dist.method="max")$dist
#[1] 44.10298
dtw(trajE,trajF,dist.method="manhattan")$dist
#[1] 44.10298 |
Deuxième constatation : la distance donnée n'est ni la somme, ni le max des longueurs des segments :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| res <- dtw(trajE,trajF)
tab <- matrix(0,length(res$index1),5)
for(i in 1:length(res$index1)){
lines(
c(res$index1[i],res$index2[i]),
c(trajE[res$index1[i]],trajF[res$index2[i]])
)
ecartX <- abs(res$index1[i]-res$index2[i])
ecartY <- abs(trajE[res$index1[i]]-trajF[res$index2[i]])
tab[i,] <- c(ecartX,ecartY,sqrt(ecartX^2+ecartY^2),max(ecartX,ecartY),ecartX+ecartY)
}
res$dist
# [1] 45.58186
summary(tab)
V1 V2 V3 V4 V5
Min. : 0.00 Min. :0.0000275 Min. : 0.03737 Min. : 0.03737 Min. : 0.03737
1st Qu.: 6.00 1st Qu.:0.0301886 1st Qu.: 6.00001 1st Qu.: 6.00000 1st Qu.: 6.00932
Median :12.00 Median :0.0727731 Median :12.01507 Median :12.00000 Median :12.60169
Mean :13.47 Mean :0.1784525 Mean :13.48360 Mean :13.47852 Mean :13.65170
3rd Qu.:22.00 3rd Qu.:0.1665101 3rd Qu.:22.00000 3rd Qu.:22.00000 3rd Qu.:22.00734
Max. :32.00 Max. :1.0417611 Max. :32.00012 Max. :32.00000 Max. :32.08815
apply(tab,2,sum)
#[1] 3274.00000 43.36395 3276.51560 3275.28156 3317.36395
apply(tab,2,mean)
#[1] 13.4732510 0.1784525 13.4836033 13.4785249 13.6517035 |
Quelqu'un a une idée ?
Christophe