diff --git a/dtw_DEMO.ipynb b/dtw_DEMO.ipynb deleted file mode 100644 index 5d7a074614c22dd1c8bd7b098ed9fff9fb116242..0000000000000000000000000000000000000000 --- a/dtw_DEMO.ipynb +++ /dev/null @@ -1,283 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "<center>\n", - "\n", - "*******************************************************************************************\n", - " \n", - "### DYNAMIC TIME WARPING \n", - "\n", - "### DEMONSTRATION \n", - "\n", - "##### 28 JULY 2023 \n", - "\n", - "##### Juan Ignacio Mendoza Garay \n", - "##### doctoral student \n", - "##### Department of Music, Art and Culture Studies \n", - "##### University of Jyväskylä \n", - "\n", - "*******************************************************************************************\n", - "\n", - "</center>\n", - "\n", - "#### INFORMATION:\n", - "\n", - "\n", - "* Description:\n", - "\n", - " Demonstrates the most simple (as in \"easy to understand\", not necessarily faster)\n", - " algorithm for Dynamic Time Warping.\n", - "\n", - "\n", - "* Instructions:\n", - "\n", - " Edit the values indicated with an arrow like this: <--- \n", - " Comment/uncomment or change values as suggested by the comments.\n", - " Run the program, close your eyes and hope for the best. \n", - "\n", - "*******************************************************************************************\n" - ] - }, - { - "cell_type": "code", - "execution_count": 304, - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "outputs": [], - "source": [ - "import numpy as np\n", - "from tslearn.metrics import dtw_path\n", - "import matplotlib.pyplot as plt\n", - "from scipy.spatial.distance import cdist\n", - "from time import time" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "*******************************************************************************************\n", - "#### TEST SIGNALS:\n" - ] - }, - { - "cell_type": "code", - "execution_count": 312, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "<Figure size 640x480 with 1 Axes>" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# EXAMPLE SET 1:\n", - "if True: # <---\n", - " \n", - " x = np.arange(0,30)\n", - " y = np.zeros(x.size)\n", - " y_1 = y.copy()\n", - " y_2 = y.copy()\n", - " y_1[10:20] = np.arange(0,10,1)\n", - " #y_2 = y_1 # <--- same shape, no lag\n", - " #y_2[18:28] = np.arange(0,10,1) # <--- same shape, lag forwards (delay)\n", - " #y_2[5:15] = np.arange(0,10,1) # <--- same shape, lag backwards (anticipation)\n", - " y_2[14:29] = np.arange(0,15,1) # <--- different shape, lag forwards (delay)\n", - " #y_2[5:20] = np.arange(0,15,1) # <--- different shape, lag backwards (anticipation)\n", - "\n", - "# EXAMPLE SET 2:\n", - "if False: # <--- \n", - "\n", - " x = np.arange(0,10)\n", - " y = np.zeros(x.size)\n", - " y_1 = y.copy()\n", - " y_2 = y.copy()\n", - " y_1[1:6] = np.arange(0,5,1) # <--- \n", - " #y_1[3:8] = np.arange(0,5,1) # <--- \n", - " y_2[2:9] = np.arange(0,7,1) # <--- \n", - "\n", - "y_1_rs = y_1.reshape(-1,1)\n", - "y_2_rs = y_2.reshape(-1,1)\n", - " \n", - "if True: # <--- you get the idea... yes you do\n", - " plt.plot(y_1) \n", - " plt.plot(y_2)\n", - " plt.pause(0.1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "*******************************************************************************************\n", - "#### METHOD 1:\n", - "Using the 'tslearn' library. Simple, fast, easy. Gets the job done with no hassle.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 306, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "computation time DTW 1 = 0.0005371570587158203\n" - ] - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "<Figure size 640x480 with 1 Axes>" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "dm_1 = cdist( y_1_rs, y_2_rs , 'cityblock' )\n", - "\n", - "tic = time()\n", - "optimal_path_1, dtw_score_1 = dtw_path(y_1, y_2)\n", - "print('computation time DTW 1 = '+str(time()-tic))\n", - "\n", - "op_1_x = [col[0] for col in optimal_path_1]\n", - "op_1_y = [col[1] for col in optimal_path_1]\n", - "\n", - "if True:\n", - " plt.imshow(dm_1.T, origin='lower')\n", - " plt.plot(op_1_x, op_1_y, ':w')\n", - " plt.title('DTW 1 = '+str(round(dtw_score_1,3)))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "*******************************************************************************************\n", - "#### METHOD 2:\n", - "Using hand-made, home-brewed, simple, raw and no-BS code written with love by your humble servant.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 323, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "computation time DTW 2 = 0.004911184310913086\n" - ] - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "<Figure size 640x480 with 1 Axes>" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# REFERENCES: \n", - "# https://tslearn.readthedocs.io/en/stable/user_guide/dtw.html\n", - "# https://en.wikipedia.org/wiki/Dynamic_time_warping\n", - "# Only the traceback part of this one: https://github.com/pollen-robotics/dtw/blob/master/dtw/dtw.py\n", - "\n", - "tic = time()\n", - "dm_2 = cdist( y_1_rs, y_2_rs , 'cityblock' )\n", - "\n", - "# initialisation:\n", - "C = np.empty((dm_2.shape[0]+1,dm_2.shape[1]+1))\n", - "C[:] = np.inf\n", - "C[0,0] = 0\n", - "\n", - "# main loop:\n", - "for i in range(1,C.shape[0]):\n", - " for j in range(1,C.shape[1]):\n", - " C[i,j] = dm_2[i-1,j-1] + min(C[i-1, j], C[i, j-1], C[i-1, j-1]) # goes barebones\n", - " # C[i,j] = dm_2[i-1,j-1]**2 + min(C[i-1, j], C[i, j-1], C[i-1, j-1]) # gets cocky\n", - "\n", - "dtw_score_2 = C[i,j] # barebones\n", - "#dtw_score_2 = np.sqrt(C[i,j]) # cocky\n", - " \n", - "# trace-back path:\n", - "i, j = np.array(C.shape)-2\n", - "optimal_path_2 = [[i,j]]\n", - "while (i > 0) or (j > 0):\n", - " \n", - " tb = np.argmin((C[i, j], C[i, j + 1], C[i + 1, j]))\n", - " \n", - " if tb == 0:\n", - " i -= 1\n", - " j -= 1\n", - " elif tb == 1:\n", - " i -= 1\n", - " else: # (tb == 2):\n", - " j -= 1\n", - " \n", - " optimal_path_2.append([i,j])\n", - "\n", - "print('computation time DTW 2 = '+str(time()-tic))\n", - "\n", - "op_2_x = [col[0] for col in optimal_path_2]\n", - "op_2_y = [col[1] for col in optimal_path_2]\n", - "\n", - "if True:\n", - " plt.imshow(dm_2.T, origin='lower')\n", - " plt.plot(op_2_x, op_2_y, ':w')\n", - " plt.title('DTW 2 = '+str(round(dtw_score_2,3)))\n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Notice that the 'barebones' (default) version of method 2 returns a DTW based on absolute differences, not on the Euclidean distance as in the 'cocky' version used by the tslearn library." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.4" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -}