# dtwDist: Compute a dissimilarity matrix In dtw: Dynamic Time Warping Algorithms

## Description

Compute the dissimilarity matrix between a set of single-variate timeseries.

## Usage

 ```1 2``` ```dtwDist(mx,my=mx,...) # dist(mx,my=mx,method="DTW",...) ```

## Arguments

 `mx` numeric matrix, containing timeseries as rows `my` numeric matrix, containing timeseries as rows (for cross-distance) `...` arguments passed to the `dtw` call

## Details

`dtwDist` computes a dissimilarity matrix, akin to `dist`, based on the Dynamic Time Warping definition of a distance between single-variate timeseries.

The `dtwDist` command is a synonym for the `dist` function of package proxy; the DTW distance is registered as `method="DTW"` (see examples below).

The timeseries are stored as rows in the matrix argument `m`. In other words, if `m` is an N * T matrix, `dtwDist` will build N*N ordered pairs of timeseries, perform the corresponding N*N `dtw` alignments, and return all of the results in a matrix. Each of the timeseries is T elements long.

`dtwDist` returns a square matrix, whereas the `dist` object is lower-triangular. This makes sense because in general the DTW "distance" is not symmetric (see e.g. asymmetric step patterns). To make a square matrix with the `dist` function sematics, use the two-arguments call as `dist(m,m)`. This will return a square `crossdist` object.

## Value

A square matrix whose element `[i,j]` holds the Dynamic Time Warp distance between row `i` (query) and `j` (reference) of `mx` and `my`, i.e. `dtw(mx[i,],my[j,])\$distance`.

## Note

To convert a square cross-distance matrix (`crossdist` object) to a symmetric `dist` object, use a suitable conversion strategy (see examples).

## Author(s)

Toni Giorgino

Other "distance" functions are: `dist`, `vegdist` in package `vegan`, `distance` in package `analogue`, etc.
 ``` 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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59``` ```## Symmetric step pattern => symmetric dissimilarity matrix; ## no problem coercing it to a dist object: m <- matrix(0,ncol=3,nrow=4) m <- row(m) dist(m,method="DTW"); # Old-fashioned call style would be: # dtwDist(m) # as.dist(dtwDist(m)) ## Find the optimal warping _and_ scale factor at the same time. ## (There may be a better, analytic way) # Prepare a query and a reference query<-sin(seq(0,4*pi,len=100)) reference<-cos(seq(0,4*pi,len=100)) # Make a set of several references, scaled from 0 to 3 in .1 increments. # Put them in a matrix, in rows scaleSet <- seq(0.1,3,by=.1) referenceSet<-outer(1/scaleSet,reference) # The query has to be made into a 1-row matrix. # Perform all of the alignments at once, and normalize the result. dist(t(query),referenceSet,meth="DTW")->distanceSet # The optimal scale for the reference is 1.0 plot(scaleSet,scaleSet*distanceSet, xlab="Reference scale factor (denominator)", ylab="DTW distance",type="o", main="Sine vs scaled cosine alignment, 0 to 4 pi") ## Asymmetric step pattern: we can either disregard part of the pairs ## (as.dist), or average with the transpose mm <- matrix(runif(12),ncol=3) dm <- dist(mm,mm,method="DTW",step=asymmetric); # a crossdist object # Old-fashioned call style would be: # dm <- dtwDist(mm,step=asymmetric) # as.dist(dm) ## Symmetrize by averaging: (dm+t(dm))/2 ## check definition stopifnot(dm[2,1]==dtw(mm[2,],mm[1,],step=asymmetric)\$distance) ```