Created
          January 20, 2017 08:40 
        
      - 
      
- 
        Save nipunbatra/dbbded02ce99a550c0985a14e1704819 to your computer and use it in GitHub Desktop. 
  
    
      This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      Learn more about bidirectional Unicode characters
    
  
  
    
  | { | |
| "metadata": { | |
| "name": "", | |
| "signature": "sha256:1da68ef5916d0f0c56026752e830fd2b9c319204968662d234c9ab34617bb206" | |
| }, | |
| "nbformat": 3, | |
| "nbformat_minor": 0, | |
| "worksheets": [ | |
| { | |
| "cells": [ | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "So you just recorded yourself saying a word and try to match it against another instance. The signals look similar, but have varying lengths and different activations for different features. So, how do you decide the similarity. Dynamic time warping (DTW) is probably something which can come to your rescue. Quoting wikipedia:\n", | |
| "\n", | |
| "\n", | |
| "\"In time series analysis, dynamic time warping (DTW) is an algorithm for measuring similarity between two temporal sequences which may vary in time or speed. For instance, similarities in walking patterns could be detected using DTW, even if one person was walking faster than the other, or if there were accelerations and decelerations during the course of an observation.\"" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "In this post I will try and put forward a naive implementation of DTW and also explain the different pieces of the problem." | |
| ] | |
| }, | |
| { | |
| "cell_type": "heading", | |
| "level": 4, | |
| "metadata": {}, | |
| "source": [ | |
| "Customary imports\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "import pandas as pd\n", | |
| "import numpy as np\n", | |
| "import matplotlib.pyplot as plt\n", | |
| "import seaborn as sns\n", | |
| "%matplotlib inline" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 1 | |
| }, | |
| { | |
| "cell_type": "heading", | |
| "level": 4, | |
| "metadata": {}, | |
| "source": [ | |
| "Creating two signals" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "x = np.array([1, 1, 2, 3, 2, 0])\n", | |
| "y = np.array([0, 1, 1, 2, 3, 2, 1])" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 2 | |
| }, | |
| { | |
| "cell_type": "heading", | |
| "level": 4, | |
| "metadata": {}, | |
| "source": [ | |
| "Plotting the two signals" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "plt.plot(x,'r', label='x')\n", | |
| "plt.plot(y, 'g', label='y')\n", | |
| "plt.legend();" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "metadata": {}, | |
| "output_type": "display_data", | |
| "png": "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\nYJIAAAAASUVORK5CYII=\n", | |
| "text": [ | |
| "<matplotlib.figure.Figure at 0x7f7973fa8790>" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 3 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "So, it appears that both the signals show similar behaviour: they both have a peak and around the peak they slop downwards. They vary in their speed and total duration. So, all set for DTW." | |
| ] | |
| }, | |
| { | |
| "cell_type": "heading", | |
| "level": 4, | |
| "metadata": {}, | |
| "source": [ | |
| "Aim" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Our aim is to find a mapping between all points of x and y. For instance, x(3) may be mapped to y(4) and so on." | |
| ] | |
| }, | |
| { | |
| "cell_type": "heading", | |
| "level": 4, | |
| "metadata": {}, | |
| "source": [ | |
| "Making a 2d matrix to compute distances between all pairs of x and y" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "In this initial step, we will find out the distance between all pair of points in the two signals. Lesser distances implies that these points may be candidates to be matched together." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "distances = np.zeros((len(y), len(x)))" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 4 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "distances" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "metadata": {}, | |
| "output_type": "pyout", | |
| "prompt_number": 5, | |
| "text": [ | |
| "array([[ 0., 0., 0., 0., 0., 0.],\n", | |
| " [ 0., 0., 0., 0., 0., 0.],\n", | |
| " [ 0., 0., 0., 0., 0., 0.],\n", | |
| " [ 0., 0., 0., 0., 0., 0.],\n", | |
| " [ 0., 0., 0., 0., 0., 0.],\n", | |
| " [ 0., 0., 0., 0., 0., 0.],\n", | |
| " [ 0., 0., 0., 0., 0., 0.]])" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 5 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "We will use euclidean distance between the pairs of points." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "for i in range(len(y)):\n", | |
| " for j in range(len(x)):\n", | |
| " distances[i,j] = (x[j]-y[i])**2 " | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 6 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "distances" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "metadata": {}, | |
| "output_type": "pyout", | |
| "prompt_number": 7, | |
| "text": [ | |
| "array([[ 1., 1., 4., 9., 4., 0.],\n", | |
| " [ 0., 0., 1., 4., 1., 1.],\n", | |
| " [ 0., 0., 1., 4., 1., 1.],\n", | |
| " [ 1., 1., 0., 1., 0., 4.],\n", | |
| " [ 4., 4., 1., 0., 1., 9.],\n", | |
| " [ 1., 1., 0., 1., 0., 4.],\n", | |
| " [ 0., 0., 1., 4., 1., 1.]])" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 7 | |
| }, | |
| { | |
| "cell_type": "heading", | |
| "level": 4, | |
| "metadata": {}, | |
| "source": [ | |
| "Visualizing the distance matrix" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "We will write a small function to visualize the distance matrix we just created." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "def distance_cost_plot(distances):\n", | |
| " im = plt.imshow(distances, interpolation='nearest', cmap='Reds') \n", | |
| " plt.gca().invert_yaxis()\n", | |
| " plt.xlabel(\"X\")\n", | |
| " plt.ylabel(\"Y\")\n", | |
| " plt.grid()\n", | |
| " plt.colorbar();\n" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 8 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "distance_cost_plot(distances)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "metadata": {}, | |
| "output_type": "display_data", | |
| "png": "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\n", | |
| "text": [ | |
| "<matplotlib.figure.Figure at 0x7f79a4934810>" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 9 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "From the plot above, it seems like the diagonal entries have low distances, which means that the distance between similar index points in x and y is low." | |
| ] | |
| }, | |
| { | |
| "cell_type": "heading", | |
| "level": 4, | |
| "metadata": {}, | |
| "source": [ | |
| "Warping path" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "In order to create a mapping between the two signals, we need to create a path in the above plot. The path should start at (0,0) and want to reach (M,N) where (M, N) are the lengths of the two signals. Our aim is to find the path of minimum distance. To do this, we thus build a matrix similar to the distances matrix. This matrix would contain the minimum distances to reach a specific point when starting from (0,0). We impose some restrictions on the paths which we would explore:\n", | |
| "1. The path must start at (0,0) and end at (M,N)\n", | |
| "2. We cannot go back in time, so the path only flows forwards, which means that from a point (i, j), we can only right (i+1, j) or upwards (i, j+1) or diagonal (i+1, j+1).\n", | |
| "\n", | |
| "These restrictions would prevent the combinatorial explosion and convert the problem to a Dynamic Programming problem which can be solved in O(MN) time." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "accumulated_cost = np.zeros((len(y), len(x)))" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 10 | |
| }, | |
| { | |
| "cell_type": "heading", | |
| "level": 4, | |
| "metadata": {}, | |
| "source": [ | |
| "Let us now build up the accumulated cost" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "* Since we start from (0,0), the accumulated cost at this point is distance(0,0)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "accumulated_cost[0,0] = distances[0,0]" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 11 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Lets see how accumulated cost looks at this point." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "distance_cost_plot(accumulated_cost)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "metadata": {}, | |
| "output_type": "display_data", | |
| "png": "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\n", | |
| "text": [ | |
| "<matplotlib.figure.Figure at 0x7f7973e93250>" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 12 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "* If we were to move along the first row, i.e. from (0,0) in the right direction only, one step at a time" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "for i in range(1, len(x)):\n", | |
| " accumulated_cost[0,i] = distances[0,i] + accumulated_cost[0, i-1] " | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 13 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "distance_cost_plot(accumulated_cost)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "metadata": {}, | |
| "output_type": "display_data", | |
| "png": "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\nAAAAAElFTkSuQmCC\n", | |
| "text": [ | |
| "<matplotlib.figure.Figure at 0x7f79a40c2850>" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 14 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "* If we were to move along the first column, i.e. from (0,0) in the upwards direction only, one step at a time" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "for i in range(1, len(y)):\n", | |
| " accumulated_cost[i,0] = distances[i, 0] + accumulated_cost[i-1, 0] " | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 15 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "distance_cost_plot(accumulated_cost)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "metadata": {}, | |
| "output_type": "display_data", | |
| "png": "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\n", | |
| "text": [ | |
| "<matplotlib.figure.Figure at 0x7f79a40c2990>" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 16 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "* For all other elements, we have $ \\mathrm{Accumulated\\ Cost\\ (D (i, j)) = \\min\\{{D(i-1, j-1), D(i-1, j), D(i, j-1)}\\} + distance(i, j)}$" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "for i in range(1, len(y)):\n", | |
| " for j in range(1, len(x)):\n", | |
| " accumulated_cost[i, j] = min(accumulated_cost[i-1, j-1], accumulated_cost[i-1, j], accumulated_cost[i, j-1]) + distances[i, j]" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 17 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "distance_cost_plot(accumulated_cost)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "metadata": {}, | |
| "output_type": "display_data", | |
| "png": "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\n", | |
| "text": [ | |
| "<matplotlib.figure.Figure at 0x7f79a40c2950>" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 18 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "So, now we have obtained the matrix containing cost of all paths starting from (0,0). We now need to find the path minimizing the distance which we do by backtracking." | |
| ] | |
| }, | |
| { | |
| "cell_type": "heading", | |
| "level": 4, | |
| "metadata": {}, | |
| "source": [ | |
| "Backtracking and finding the optimal warp path" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Backtracking procedure is fairly simple and involves trying to move back from the last point (M, N) and finding which place we would reached there from (by minimizing the cost) and do this in a repetitive fashion." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "path = [[len(x)-1, len(y)-1]]\n", | |
| "i = len(y)-1\n", | |
| "j = len(x)-1\n", | |
| "while i>0 and j>0:\n", | |
| " if i==0:\n", | |
| " j = j - 1\n", | |
| " elif j==0:\n", | |
| " i = i - 1\n", | |
| " else:\n", | |
| " if accumulated_cost[i-1, j] == min(accumulated_cost[i-1, j-1], accumulated_cost[i-1, j], accumulated_cost[i, j-1]):\n", | |
| " i = i - 1\n", | |
| " elif accumulated_cost[i, j-1] == min(accumulated_cost[i-1, j-1], accumulated_cost[i-1, j], accumulated_cost[i, j-1]):\n", | |
| " j = j-1\n", | |
| " else:\n", | |
| " i = i - 1\n", | |
| " j= j- 1\n", | |
| " path.append([j, i])\n", | |
| "path.append([0,0])" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 19 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "path" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "metadata": {}, | |
| "output_type": "pyout", | |
| "prompt_number": 20, | |
| "text": [ | |
| "[[5, 6], [4, 5], [3, 4], [2, 3], [1, 2], [1, 1], [0, 1], [0, 0]]" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 20 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "path_x = [point[0] for point in path]\n", | |
| "path_y = [point[1] for point in path]" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 21 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "distance_cost_plot(accumulated_cost)\n", | |
| "plt.plot(path_x, path_y);" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "metadata": {}, | |
| "output_type": "display_data", | |
| "png": "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\n", | |
| "text": [ | |
| "<matplotlib.figure.Figure at 0x7f7973ebd950>" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 22 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "The above plot shows the optimum warping path which minimizes the sum of distance (DTW distance) along the path. Let us wrap up the function by also incorporating the DTW distance between the two signals as well." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "def path_cost(x, y, accumulated_cost, distances):\n", | |
| " path = [[len(x)-1, len(y)-1]]\n", | |
| " cost = 0\n", | |
| " i = len(y)-1\n", | |
| " j = len(x)-1\n", | |
| " while i>0 and j>0:\n", | |
| " if i==0:\n", | |
| " j = j - 1\n", | |
| " elif j==0:\n", | |
| " i = i - 1\n", | |
| " else:\n", | |
| " if accumulated_cost[i-1, j] == min(accumulated_cost[i-1, j-1], accumulated_cost[i-1, j], accumulated_cost[i, j-1]):\n", | |
| " i = i - 1\n", | |
| " elif accumulated_cost[i, j-1] == min(accumulated_cost[i-1, j-1], accumulated_cost[i-1, j], accumulated_cost[i, j-1]):\n", | |
| " j = j-1\n", | |
| " else:\n", | |
| " i = i - 1\n", | |
| " j= j- 1\n", | |
| " path.append([j, i])\n", | |
| " path.append([0,0])\n", | |
| " for [y, x] in path:\n", | |
| " cost = cost +distances[x, y]\n", | |
| " return path, cost " | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 23 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "path, cost = path_cost(x, y, accumulated_cost, distances)\n", | |
| "print path\n", | |
| "print cost" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "[[5, 6], [4, 5], [3, 4], [2, 3], [1, 2], [1, 1], [0, 1], [0, 0]]\n", | |
| "2.0\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 24 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Let us compare our naive implementation with that of [mlpy](http://mlpy.sourceforge.net/) which also provides a DTW implementation." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "import mlpy" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 25 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "dist, cost, path = mlpy.dtw_std(x, y, dist_only=False)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 26 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "import matplotlib.cm as cm\n", | |
| "fig = plt.figure(1)\n", | |
| "ax = fig.add_subplot(111)\n", | |
| "plot1 = plt.imshow(cost.T, origin='lower', cmap=cm.gray, interpolation='nearest')\n", | |
| "plot2 = plt.plot(path[0], path[1], 'w')\n", | |
| "xlim = ax.set_xlim((-0.5, cost.shape[0]-0.5))\n", | |
| "ylim = ax.set_ylim((-0.5, cost.shape[1]-0.5))" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "metadata": {}, | |
| "output_type": "display_data", | |
| "png": "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\nrvl447zx8TXg9sHUzaPA/oh4o/Sd9Izzwfpj5JFs8LLwkxXspTd8m75f/GZ0xQysf4ysQgbWT0ZW\nEQPrLyOrgIH1m5FlZmAysowMTGBk2RiYLjOyDAxMVzKykhmYrmZkJTIwDWNkJTEwXY/zyUrgfDCt\npdTI6pjPVbY2zwcrcppHWc9R9HSbubm5Wtcv+udfXl6+5td8uViA88E0DiObkvPBNC4jm4JvcmgS\nRjYhA9OkjGwCBqZpGNmYDEzTMrIxGJiKMLIRDExFGdkaDExlMLLrMDCVxciGMDCVac2fXUwprQMO\nAx8E3g18ISK+WcXG6mJgKtuoI9mngJci4veAXcCX82+pXgamso36KfynWb0WPqwGeTHvdurjfDDl\nsmZkEXEBIKV0E6vBfb6KTVXN+WDKaeScnpTSLcAzwN9GxPJa9z1z5szKrbfeWtLWpHY5cuQIc3Nz\nk80nGwz9OwY8EBHHRy1y2223Tb9DYGVlpdB8rkl1bT5Y0RMOy5jPVeRzsLCwwOLiYm3r79mzhyNH\njhRaf5hRb3w8CLwXeCildHzwcWPpu6iB88FUlVFfk+0H9le0l8r4Nr2q1LtvRhuYqtaryAxMdehN\nZAamuvQiMgNTnTofmYGpbp2OzMDUBJ2NzMDUFJ2MzMDUJJ2LzMDUNJ2KzMDURJ2JzMDUVJ2IzMDU\nZK2PzMDUdK2OzMDUBq2NzMDUFq2MzMDUJq2LzMDUNq2KzMDURq2JzMDUVq2IzMDUZo2PzMDUdo2O\nzMDUBY2NzMDUFY2MzMDUJRNFllK6K6U08nLdRRiYumbU6KS3pZQ+B3waeC3fdpwPpu6Z5Ej2AvAJ\nxpgEMw3ng6mrxo4sIp4h4xDAhYUFwPlg6p6Jjkoppc3AP0bER4b9vvPJ1GdTzSebVJH5ZMeOHWPn\nzp2sW7eOixfrmZpbdD6a88mcTzbMNG/hr5S+C6nDJjqSRcQ54O48W5G6qZHfjJa6xMikzIxMyszI\npMyMTMrMyKTMjEzKzMikzIxMyszIpMyMTMrMyKTMSj3VpW5FTzUp+hxFTzUp+hxzc3OF1y/6HNu2\nbSv0+Msn79Zlz549hR4/7PPnkUzKzMikzIxMyszIpMyMTMrMyKTMjEzKzMikzIxMyszIpMyMTMps\n5M8uppRuAP4O+BDwBvCZiPhJ7o1JXTHOkexPgF+OiLuBvwQez7slqVvGiex3gaMAEfEs8NtZdyR1\nzDiR3Qz84orbbw1eQpZqZcU5Fuqmcc4n+wVw0xW3b4iIS8PueObMGYrOJ3vzzTcLPb6os2fP1rr+\n0tJSresXPR9M1xonsu8CHweeTin9DvDc9e5YZD4ZOB+s6HywMk64PHnyZOHn0DuNE9k/AztTSt8d\n3C42JU7qmZGRRcQKcH8Fe5E6yW9GS5kZmZSZkUmZGZmUmZFJmRmZlJmRSZkZmZSZkUmZGZmUmZFJ\nmRmZJEmSJEmSJEmS+mj6S0OVqCmXAk8p3QU8GhE7Kl53HXAY+CDwbuALEfHNitZ+F/AEkIAV4L6I\n+GEVa1+1j43A94CPRURUvPb3gVcGN38aEfvKfP5xrlZVhbcvBT74i/744Ncqk1L6HPBp4LUq1x34\nFPBSRMymlNYDPwAqiQy4B7gUER9NKW0Dvkj1n/t1wFeAC1WuO1j7RoCc/7A25Sc+mnAp8BeAT1DP\n0f1p4KHBf98AXKxq4Yj4OnDv4OZm4OdVrX2Fx4BDwM9qWPvDwHtSSt9KKX178I98qZoSWSWXAl9L\nRDxDhX+5r1r7QkS8llK6idXgPl/x+m+llJaBvwH+ocq1U0pzrB7Fjw1+qep/5C4Aj0XEHwL3AV8t\n++9eUyIb+1LgXZVSugX4d+DvI+Kfql4/IuZY/brsiZTSr1S49DyrF889DtwOHEkpva/C9QP4KkBE\n/Bh4GXh/mQs05WuysS8F3kWDv1THgAci4njFa88CmyLiEeB14NLgoxIR8fZ1vQeh3RsR56tan9XI\nPwR8NqX0AVZfVZX6srUpkTXpUuB1jJd5EHgv8FBK6fLXZn8UEf9bwdpfA5ZTSieBdcD+iHijgnWb\n4ilgKaX0ncHt+b69ipIkSZIkSZIkSZIktdD/AeW9FXJYUuKpAAAAAElFTkSuQmCC\n", | |
| "text": [ | |
| "<matplotlib.figure.Figure at 0x7f7973ed9790>" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 27 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "The path looks almost identical to the one we got. The slight difference is due to the fact that the path chosen by our implementation and the one chosen by DTW have the same distance and thus we woulc choose either." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "dist" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "metadata": {}, | |
| "output_type": "pyout", | |
| "prompt_number": 28, | |
| "text": [ | |
| "2.0" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 28 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Not bad! Our implementation gets the same distance between x and y. " | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Let us look at another interesting way to visualize the warp. We will place the two signals on the same axis and " | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "plt.plot(x, 'bo-' ,label='x')\n", | |
| "plt.plot(y, 'g^-', label = 'y')\n", | |
| "plt.legend();\n", | |
| "paths = path_cost(x, y, accumulated_cost, distances)[0]\n", | |
| "for [map_x, map_y] in paths:\n", | |
| " print map_x, x[map_x], \":\", map_y, y[map_y]\n", | |
| " \n", | |
| " plt.plot([map_x, map_y], [x[map_x], y[map_y]], 'r')" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "5 0 : 6 1\n", | |
| "4 2 : 5 2\n", | |
| "3 3 : 4 3\n", | |
| "2 2 : 3 2\n", | |
| "1 1 : 2 1\n", | |
| "1 1 : 1 1\n", | |
| "0 1 : 1 1\n", | |
| "0 1 : 0 0\n" | |
| ] | |
| }, | |
| { | |
| "metadata": {}, | |
| "output_type": "display_data", | |
| "png": "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\nAAAAAElFTkSuQmCC\n", | |
| "text": [ | |
| "<matplotlib.figure.Figure at 0x7f7973ebdfd0>" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 29 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "The above plot shows the mapping between the two signal. The red lines connect the matched points which are given by the DTW algorithm Looks neat isn't it? Now, let us try this for some known signal. This example is inspired from the example used in R's dtw implementation. We will see the DTW path between a sine and cosine on the same angles. " | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "idx = np.linspace(0, 6.28, 100)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 30 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "x = np.sin(idx)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 31 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "y = np.cos(idx)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 32 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "distances = np.zeros((len(y), len(x)))" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 33 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "for i in range(len(y)):\n", | |
| " for j in range(len(x)):\n", | |
| " distances[i,j] = (x[j]-y[i])**2 " | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 34 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "distance_cost_plot(distances)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "metadata": {}, | |
| "output_type": "display_data", | |
| "png": "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\nP8p6V6qTkCtBAAAAAElFTkSuQmCC\n", | |
| "text": [ | |
| "<matplotlib.figure.Figure at 0x7f7973d8ca50>" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 35 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "accumulated_cost = np.zeros((len(y), len(x)))\n", | |
| "accumulated_cost[0,0] = distances[0,0]\n", | |
| "for i in range(1, len(y)):\n", | |
| " accumulated_cost[i,0] = distances[i, 0] + accumulated_cost[i-1, 0]\n", | |
| "for i in range(1, len(x)):\n", | |
| " accumulated_cost[0,i] = distances[0,i] + accumulated_cost[0, i-1] \n", | |
| "for i in range(1, len(y)):\n", | |
| " for j in range(1, len(x)):\n", | |
| " accumulated_cost[i, j] = min(accumulated_cost[i-1, j-1], accumulated_cost[i-1, j], accumulated_cost[i, j-1]) + distances[i, j]" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 36 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "plt.plot(x, 'bo-' ,label='x')\n", | |
| "plt.plot(y, 'g^-', label = 'y')\n", | |
| "plt.legend();\n", | |
| "paths = path_cost(x, y, accumulated_cost, distances)[0]\n", | |
| "for [map_x, map_y] in paths:\n", | |
| " #print map_x, x[map_x], \":\", map_y, y[map_y]\n", | |
| " \n", | |
| " plt.plot([map_x, map_y], [x[map_x], y[map_y]], 'r')" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "metadata": {}, | |
| "output_type": "display_data", | |
| "png": "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\nJgL/HzhpWenej1CDAAAAAElFTkSuQmCC\n", | |
| "text": [ | |
| "<matplotlib.figure.Figure at 0x7f79712d8cd0>" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 37 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Ok, this does look nice. I am impressed!" | |
| ] | |
| }, | |
| { | |
| "cell_type": "heading", | |
| "level": 4, | |
| "metadata": {}, | |
| "source": [ | |
| "Conclusions" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "We worked out a naive DTW implementation pretty much from scratch. It seems to do reasonably well on artificial data." | |
| ] | |
| }, | |
| { | |
| "cell_type": "heading", | |
| "level": 4, | |
| "metadata": {}, | |
| "source": [ | |
| "References\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "1. [Wikipedia page on dtw](http://en.wikipedia.org/wiki/Dynamic_time_warping)\n", | |
| "2. [R's dtw package](http://dtw.r-forge.r-project.org/)\n", | |
| "3. [mlpy page on dtw](http://mlpy.sourceforge.net/docs/3.4/dtw.html)\n", | |
| "4. [DTW review paper](http://www2.hawaii.edu/~senin/assets/papers/DTW-review2008draft.pdf)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Feel free to comment!" | |
| ] | |
| } | |
| ], | |
| "metadata": {} | |
| } | |
| ] | |
| } | 
  
    Sign up for free
    to join this conversation on GitHub.
    Already have an account?
    Sign in to comment