From 0a7c32d7f43284ad47294b1a904455281e3fc726 Mon Sep 17 00:00:00 2001 From: hadware Date: Thu, 7 May 2020 00:34:42 +0200 Subject: [PATCH] Mostly done with the RPDE notebook. --- numba_examples/principe_rpde.png | Bin 0 -> 12756 bytes numba_examples/rpde.ipynb | 59 ++++++++++++++++++++++++------- 2 files changed, 47 insertions(+), 12 deletions(-) create mode 100644 numba_examples/principe_rpde.png diff --git a/numba_examples/principe_rpde.png b/numba_examples/principe_rpde.png new file mode 100644 index 0000000000000000000000000000000000000000..9317932ec0b3cea8aabc612ef082ba279bcebfd4 GIT binary patch literal 12756 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 S9Ol6ngjAnsDi%Ms2>BoD*4%sm literal 0 HcmV?d00001 diff --git a/numba_examples/rpde.ipynb b/numba_examples/rpde.ipynb index 1b87642..9539681 100644 --- a/numba_examples/rpde.ipynb +++ b/numba_examples/rpde.ipynb @@ -49,7 +49,10 @@ "\n", "_Loading the audio data, and embedding the audio time series_\n", " Our algorithm operates on time series\n", - "(here, it's audio, what a coincidence!).\n" + "(here, it's audio, what a coincidence!).\n", + "\n", + "Then, we'll create a special function that creates an embedding of several time\n", + "series for our audio data.\n" ], "metadata": { "collapsed": false, @@ -82,10 +85,12 @@ "outputs": [], "source": [ "def embed_time_series(data: np.ndarray, dim: int, tau: int):\n", - " \"\"\"This creates an special embedding for the input data. The\n", + " \"\"\"This creates a special embedding for the input data. The\n", " output shape of this function is (N, D) with\n", " N = len(data) - (dim - 1) * tau\n", - " D = dim\"\"\"\n", + " D = dim\n", + "\n", + " N is the number of time series in the embedding\"\"\"\n", " embed_points_nb = data.shape[0] - (dim - 1) * tau\n", " embed_mask = np.arange(embed_points_nb)[:, np.newaxis] + np.arange(dim)\n", " tau_offsets = np.arange(dim) * (tau - 1)\n", @@ -100,7 +105,7 @@ "outputs": [], "source": [ "# this creates an embedding of a slice of the time series\n", - "ts = embed_time_series(data[:2000], dim=4, tau=22)\n", + "ts = embed_time_series(data[:2000], dim=3, tau=22)\n", "print(ts.shape)" ] }, @@ -156,7 +161,14 @@ "as it outputs a value close to the actual value, but some race conditions make it\n", "undeterministic.\n", "3. The third one is a fixed parallelized version of the previous numba implementation,\n", - "fully adapted to work in parallel" + "fully adapted to work in parallel\n", + "\n", + "The goal of our RPDE algorithm is to find, for each one of the\n", + " times series contained in the embeddings:\n", + "- the first point to exit a sphere of radius epsilon (index k_0)\n", + "- the first point, after k_0, to re-enter the sphere (index k_1)\n", + "\n", + "![RPDE algorithm's basic principle](principe_rpde.png)" ], "metadata": { "collapsed": false, @@ -172,11 +184,12 @@ "source": [ "def plain_python_recurrence_histogram(ts: np.ndarray, epsilon: float, t_max: int):\n", " distances_histogram = np.zeros(len(ts))\n", - " epsilon = 0.25\n", " for i in tqdm(np.arange(len(ts))):\n", " # finding the first \"out of ball\" index\n", " first_out = len(ts) # security\n", " for j in np.arange(i + 1, len(ts)):\n", + " if 0 < t_max < j - i:\n", + " break\n", " d = norm(ts[i] - ts[j])\n", " if d > epsilon:\n", " first_out = j\n", @@ -184,6 +197,8 @@ "\n", " # finding the first \"back to the ball\" index\n", " for j in np.arange(first_out + 1, len(ts)):\n", + " if 0 < t_max < j - i:\n", + " break\n", " d = norm(ts[i] - ts[j])\n", " if d < epsilon:\n", " distances_histogram[j - i] += 1\n", @@ -213,13 +228,13 @@ "outputs": [], "source": [ "@jit(int32[:](float32[:,:], float32, int32), nopython=True)\n", - "def recurrence_histogram(ts: np.ndarray, epsilon: float, t_max: int):\n", + "def numba_recurrence_histogram(ts: np.ndarray, epsilon: float, t_max: int):\n", " distances_histogram = np.zeros(len(ts), dtype=np.int32)\n", " for i in np.arange(len(ts)):\n", " # finding the first \"out of ball\" index\n", " first_out = len(ts) # security\n", " for j in np.arange(i + 1, len(ts)):\n", - " if t_max > 0 and j - i > t_max:\n", + " if 0 < t_max < j - i:\n", " break\n", " d = norm(ts[i] - ts[j])\n", " if d > epsilon:\n", @@ -250,7 +265,7 @@ " # finding the first \"out of ball\" index\n", " first_out = len(ts) # security\n", " for j in prange(i + 1, len(ts)):\n", - " if t_max > 0 and j - i > t_max:\n", + " if 0 < t_max < j - i:\n", " break\n", " d = norm(ts[i] - ts[j])\n", " if d > epsilon:\n", @@ -287,7 +302,7 @@ " # finding the first \"out of ball\" index\n", " first_out = len(ts) # security\n", " for j in np.arange(i + 1, len(ts)):\n", - " if t_max > 0 and j - i > t_max:\n", + " if 0 < t_max < j - i:\n", " break\n", " d = norm(ts[i] - ts[j])\n", " if d > epsilon:\n", @@ -296,7 +311,7 @@ "\n", " # finding the first \"back to the ball\" index\n", " for j in np.arange(first_out + 1, len(ts)):\n", - " if t_max > 0 and j - i > t_max:\n", + " if 0 < t_max < j - i:\n", " break\n", " d = norm(ts[i] - ts[j])\n", " if d < epsilon:\n", @@ -354,14 +369,34 @@ } ], "source": [ + "# taking a look at our histogram\n", + "\n", "distances_histogram = plain_python_recurrence_histogram(ts, 0.12, 10000)\n", "px.line(distances_histogram, x=range(len(distances_histogram)), y=distances_histogram)" ] }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "# checking that values match\n", + "numba_histogram = numba_recurrence_histogram(ts, 0.12, 10000)\n", + "np.isclose(distances_histogram, numba_histogram)" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + } + }, { "cell_type": "markdown", "source": [ - "### The ~~hour~~ seconds of truth" + "### The ~~hour~~ seconds of truth\n", + "\n", + "Let's now test the performance of each implementation." ], "metadata": { "collapsed": false