{ "metadata": { "name": "", "signature": "sha256:654a69106e52df27a8e1fefc6ad9002c730b8e2a42476d82348389ab3e3c5d3a" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Change Detection Tutorial\n", "\n", " author: @amanqa\n", " source: github.com/amanahuja/change-detection-tutorial\n" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Modified Stylesheet for notebook.\n", "from IPython.core.display import HTML\n", "def css_styling():\n", " styles = open(\"custom.css\", \"r\").read()\n", " return HTML(styles)\n", "\n", "css_styling()" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "\n" ], "metadata": {}, "output_type": "pyout", "prompt_number": 1, "text": [ "" ] } ], "prompt_number": 1 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Section 0: Some Scaffolding\n", "\n", "Overview\n", "\n", " * Offline vs. Online change detection\n", " * We write some utility functions that allow us to \n", " * pass signals to a change detection algorithm in \"online\" simulation mode\n", " * calculate residuals after receiving each new data point\n", " * Test the stopping rules at each iteration\n", " * Plot results and output conveniently.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Aside: Offline vs. Online algorithms\n", "\n", "An \"offline\" change detection algorithm is one in which we are given the entire signal and are attempting to \"look back\" and recognize where the change occcured. \n", "\n", "An \"online\" algorithm is quite different, in which we imagine our signal as \"streaming into\" our detector, and at any given moment we only have knowledge of the most recent data point and whatever information the detector has retain about the signal. See wikipedia on Sequential Analysis http://en.wikipedia.org/wiki/Sequential_analysis\n", "\n", "My interest is in the latter \"online\" class of algorithms. That means I want to make sure data points are passed to the algorithm one by one, and that I am interested in \n", "\n", " 1. detecting a change, \n", " 2. in deciding whether a change is significant enough to trigger an alert, and \n", " 3. in how quickly I can detect the change after it occurs. \n", "\n", "I also want to make sure that I am not cheating when I run my experiments. \n", "\n", "To do all this, it is helpful to write some code that helps me simulate the online streaming scenario of interest. " ] }, { "cell_type": "code", "collapsed": false, "input": [ "import matplotlib.pyplot as plt\n", "import numpy as np" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 2 }, { "cell_type": "code", "collapsed": false, "input": [ "from collections import defaultdict\n", "np.random.seed(seed=111111)\n", "np.set_printoptions(precision=2, suppress=True)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 3 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## ... thus we need some \"scaffolding\"\n", "\n", "This notebook is an optional part of the tutorial, in which we create a class and some methods in order to \"simulate\" streaming data. \n", "\n", "The scenario that we are simulating: \n", "\n", " * each data point is passed to the algorithm one by one\n", " * the algorithm performs its analysis on that new information along with any stored historical information\n", " * the algorithm decides after each data point whether or not a change has been detected. \n", "\n", "With these tools, which we will utilize in the tutorial, we can experiment with online algorithms and, more specifically, online change detection algorithms. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Pseudocode\n", "\n", "Thinking this through, here's what I came up with, in pseudocode" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Essentially a change detection algorithm is just calculating residuals and updating them for each new value passed. \n", "\n", "```\n", "class ChangeDetector:\n", " INIT:\n", " initialize residuals (to zero or neutral values)\n", " accept custom parameters\n", " \n", " METHOD step(new_signal_value):\n", " Update residuals with new_signal_value\n", " IF Stopping Rules have been triggered:\n", " RETURN True\n", "```\n", "\n", "We'll make that step method a generator, so we can yield values for each new value of the signal." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Then, we can write a simulation that accepts an instance of Change Detector and a signal, and conveniently steps through the signal (one data points at a time). \n", "\n", "```\n", "class OnlineSimulator(change_detector, signal): \n", "\n", " METHOD run: \n", " # Pass each data point to the algorithm one by one\n", " FOR EACH data point in the signal:\n", " CALL change_detector.step() \n", " Store value of each residual in change detector\n", " IF stopping rules were triggered: \n", " BREAK FOR LOOP\n", " \n", " PLOT signal, residual values\n", "```\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Import this scaffolding\n", "\n", "To see the implementation details, you can check out \n", "\n", " src/change_detector.py \n", "\n", "in the current github repository. But it should be possible to follow this tutorial if you just understand the pseudocode above" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import sys; sys.path.append('../src/')\n", "from change_detector import ChangeDetector" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 4 }, { "cell_type": "code", "collapsed": false, "input": [ "# Initialize change detector\n", "\n", "detector = ChangeDetector()\n", "\n", "print detector\n", "print \"Signal size:\", detector.signal_size" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Change Detector(triggered=False, residuals={})\n", "Signal size: 0\n" ] } ], "prompt_number": 5 }, { "cell_type": "code", "collapsed": false, "input": [ "# Add one point to the change_detector\n", "next(detector.step(10))\n", "\n", "# (The step() function is written as a python generator)\n", "\n", "print detector\n", "print \"Signal size:\", detector.signal_size" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Change Detector(triggered=False, residuals={})\n", "Signal size: 1\n" ] } ], "prompt_number": 6 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The Online Simulator \n", "\n", "It would be inconvenient to have to manually pass the entire signal, one point at a time, to our change detector, so we will use the online simulator. \n", "\n", "OnlineSimulator.run() will plot the signal, our residuals, and -- if any rules were triggered -- the stopping point will be shown in the plot. " ] }, { "cell_type": "code", "collapsed": false, "input": [ "from change_detector import OnlineSimulator" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 7 }, { "cell_type": "code", "collapsed": false, "input": [ "signal = np.random.randint(10, size=20)\n", "print \"Signal: {}\".format(signal)\n", "\n", "# reset\n", "sim = OnlineSimulator(detector, signal)\n", "\n", "# pass the signal the online_simulator\n", "sim.run(plot=True)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Signal: [9 7 7 5 2 3 4 4 0 1 7 4 7 9 5 9 1 5 9 0]\n", "Residuals: []\n", "Stopping rule not triggered.\n" ] }, { "metadata": {}, "output_type": "pyout", "prompt_number": 8, "text": [ "False" ] }, { "metadata": {}, "output_type": "display_data", "png": "iVBORw0KGgoAAAANSUhEUgAAAsAAAADSCAYAAABErnZWAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XtwlPW5B/Dv5k6yG5KwySaBcBErN7m1qYpTNY6CllFR\nUVrlVMUgc3r0tFiPzrRz5pzotAXH3rTaOeK0SHuEFuecaquSYjuzOdCK1BEpUlpaIZDbbq6b+3Wz\n54+nbzaBJOzlvb/fzwwDhM3uj+zuu8/7/J73eVyRSCQCIiIiIiKHSDF6AUREREREemIATERERESO\nwgCYiIiIiByFATAREREROQoDYCIiIiJyFAbAREREROQoDICJiDT22muv4ZZbbtH8cfx+P8rKyjR/\nHCIiq2MATESkksOHD+Paa69FXl4eZs2ahc997nP44IMPsHnzZvzmN78xenlERPQPaUYvgIjIDrq6\nunDbbbfh5ZdfxqZNmzA4OIhDhw4hMzPT6KUREdEFmAEmIlLB6dOn4XK58IUvfAEulwtZWVlYu3Yt\nli9fjldffRXXXXfd2G0PHjyIRYsWIS8vD48++ihuuOEG/PjHPwYAvPrqq/jc5z6HJ598EgUFBbjs\nsstQXV099r27d+/G0qVLkZubi4ULF2LXrl26/1+JiKyOATARkQoWLVqE1NRUPPTQQ6iurkZHR8ek\nt2ttbcW9996LZ599Fu3t7Vi0aBHee+89uFyusdscPXoUixcvRltbG5566ilUVlaO/ZvP58Pbb7+N\nrq4u7N69G48//jiOHTum+f+PiMhOGAATEanA4/Hg8OHDcLlceOSRR1BUVIQNGzagubl5wu3eeecd\nXHnllbjzzjuRkpKCr3zlKyguLp5wm3nz5qGyshIulwsPPPAAmpqaxu5n/fr1WLBgAQDg+uuvx7p1\n63Do0CF9/pNERDbBAJiISCWLFy/G7t27UVdXh48//hiNjY3Yvn37hOxuY2Mj5syZM+H7Lvz7+IA4\nOzsbANDT0wMAOHDgAK655hrMmjUL+fn5eOedd9DW1qbVf4mIyJYYABMRaWDRokV48MEH8fHHH0/4\nemlpKerr68f+HolEJvx9OoODg9i4cSOeeuopNDc3o6OjA+vXr0ckElF17UREdscAmIhIBX/961/x\nve99Dw0NDQCAuro67Nu3D2vWrJlwu/Xr1+PEiRN48803MTIygpdeegmBQCCmxxgaGsLQ0BC8Xi9S\nUlJw4MABHDx4UPX/CxGR3TEAJiJSgcfjwfvvv4+rr74abrcba9aswYoVK/Dd734XAMbKILxeL15/\n/XU89dRT8Hq9OHXqFMrLy8fapblcrgklE+O/1+Px4IUXXsCmTZtQUFCAffv2YcOGDZPeloiIpuaK\ncO+MiMgwo6OjKCsrw969e3HDDTcYvRwiIkdgBpiISGcHDx5EKBTC4OAgvv3tbwMArrnmGoNXRUTk\nHAyAiYh09t577+Hyyy9HYWEh3n77bbzxxhucGEdEpCOWQBARERGRo6RpdcerVq3C8ePHtbp7IiIi\nIiIAwMqVK/HRRx/FfHvNMsAul4u9KcmUqqqqUFVVZfQyiCbF1yeZFV+bZGbxxp2sASYiIiIiR2EA\nTERERESOwgCYHKeiosLoJRBNia9PMiu+NslOWANMRERERJbGGmAiIiIiomkwACYiIiIiR2EATERE\nRESOwgCYiIiIiByFATAREREROQoDYCIiIiJyFAbAREREROQoDICJiIiIyFEYABMRERGRo0wbAD/8\n8MPw+XxYvnz52NeefPJJLFmyBCtXrsTdd9+Nzs5OzRdJRERERKSWaQPgLVu2oLq6esLX1q1bh5Mn\nT+L48eO44oorsGPHDk0XSERERESkpmkD4Ouuuw75+fkTvrZ27VqkpMi3XX311aivr9dudURERERE\nKkuqBvgnP/kJ1q9fr9ZaiIiIiIg0l5boN37rW99CRkYG7r///ilvU1VVNfbniooKVFRUJPpwRERE\nREQAAL/fD7/fn/D3uyKRSGS6G9TW1uL222/HiRMnxr726quv4pVXXsHvfvc7ZGVlTX7HLhcucddE\nREREREmLN+6MOwNcXV2N5557DjU1NVMGv0REREREZjVtBvi+++5DTU0NWltb4fP58PTTT2PHjh0Y\nGhpCQUEBAGDNmjX40Y9+dPEdMwNMRERERDqIN+68ZAmEXgshIiIiIkpEvHEnJ8ERERERkaMwACYi\nIiIiR2EATERERESOwgCYiIiIiByFATAREREROQoDYCIiIiJyFAbAREREROQoDICJiIiIyFEYABMR\nERGRozAAJiIiIiJHYQBMRERERI7CAJiIiIiIHIUBMBERERE5CgNgIiIiInIUBsBERERE5CgMgImI\niIjIUaYNgB9++GH4fD4sX7587Gvt7e1Yu3YtrrjiCqxbtw6hUEjzRRIRERERqWXaAHjLli2orq6e\n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\n", "text": [ "" ] } ], "prompt_number": 8 }, { "cell_type": "raw", "metadata": {}, "source": [ "(Note that the stopping rule will not be triggered, because we haven't created any stopping rules yet.)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print detector" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Change Detector(triggered=False, residuals={})\n" ] } ], "prompt_number": 9 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Important: \n", "When we send a signal to OnlineSimulator.run() we are stepping through each data point in the signal one by one, just as if\n", "\n", " for datapoint in signal: \n", " detector.step(datapoint)\n", "\n", "At each step, the detector decides whether the stopping rule should be triggered with only the information available to it at that step. \n", "\n", "This is what makes the detector an online algorithm. " ] }, { "cell_type": "raw", "metadata": {}, "source": [ "Fine, okay, that works, but it doesn't do much. \n", "\n", "We'll now write a new Class that extends ChangeDetector. We'll add a residual. \n" ] }, { "cell_type": "code", "collapsed": false, "input": [ "class MeanDetector(ChangeDetector):\n", " \"\"\"\n", " This is a simple detector that extends the base \n", " ChangeDetector. \n", " \n", " This serves as a useful \"skeleton\" on how to override \n", " the methods of ChangeDetector.\n", " \n", " We're adding a \"residual\" -- we'll keep track of the \n", " mean of the signal. \n", " \"\"\"\n", " def __init__(self):\n", " super(MeanDetector, self).__init__()\n", "\n", " self.total_val = 0\n", " # Mean is a pretty simple and useful residual\n", " self.mean_ = np.nan\n", " \n", " def update_residuals(self, new_signal_value):\n", " self._update_base_residuals(new_signal_value)\n", " \n", " self.total_val += new_signal_value\n", " self.mean_ = float(self.total_val) / self.signal_size\n", " \n", " def check_stopping_rules(self, new_signal_value):\n", " # Implement Stopping rules here\n", " if np.abs(new_signal_value - self.mean_) > 100: \n", " self.rules_triggered = True\n", "\n" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 10 }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can use this improved detector just like before:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "detector = MeanDetector()\n", "\n", "OnlineSimulator(detector, signal).run()" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Residuals: ['mean_']\n", "Stopping rule not triggered.\n" ] }, { "metadata": {}, "output_type": "pyout", "prompt_number": 11, "text": [ "False" ] }, { "metadata": {}, "output_type": "display_data", "png": "iVBORw0KGgoAAAANSUhEUgAAAsAAAAF6CAYAAAAXlu5hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xl8VPW9//H3ZAOyQUKSSSBhkRYBZbNUK610rEK9tLih\nVkVUBL331rZqLd7e9mcbvbeCV6zW3m7WFmjdqr0Pa6sQ8WHvUCsqtWDEpdoKkQBZyE7WyTK/P753\nskASMpOZOWfmvJ6PBw+yzJz5JjM58z6f8znfr8vv9/sFAAAAOESC1QMAAAAAookADAAAAEchAAMA\nAMBRCMAAAABwFAIwAAAAHIUADAAAAEchAANAhD322GP6/Oc/H/HH8Xq9KioqivjjAECsIwADQJj8\n+c9/1uLFizVhwgRNnDhRn/nMZ/TGG29o1apVeuGFF6weHgDg/yRZPQAAiAdNTU364he/qJ/97Ge6\n4oor1NHRoZdfflljxoyxemgAgONQAQaAMPjggw/kcrn0pS99SS6XS2PHjtXSpUs1d+5cbdmyReec\nc07vbXfs2KFTTz1VEyZM0M0336zPfvaz+sUvfiFJ2rJliz7zmc9o/fr1ys7O1imnnKKSkpLe+27e\nvFlz5sxRZmamZsyYoYcffjjqPysAxDoCMACEwamnnqrExERdf/31KikpUX19/aC3q6mp0eWXX657\n771XdXV1OvXUU/Xqq6/K5XL13mb37t2aNWuWamtrdccdd2jt2rW933O73Xr++efV1NSkzZs367bb\nbtPevXsj/vMBQDwhAANAGGRkZOjPf/6zXC6XbrzxRuXl5emiiy5SdXX1gNtt27ZNp59+ui6++GIl\nJCToa1/7mvLz8wfcZurUqVq7dq1cLpeuvfZaVVRU9G5n+fLlmj59uiRpyZIlWrZsmV5++eXo/JAA\nECcIwAAQJrNmzdLmzZtVXl6ut99+W0eOHNGtt946oLp75MgRFRYWDrjf8Z/3D8SpqamSpObmZknS\n9u3b9alPfUoTJ05UVlaWtm3bptra2kj9SAAQlwjAABABp556qq677jq9/fbbA74+adIkHTp0qPdz\nv98/4PPhdHR0aOXKlbrjjjtUXV2t+vp6LV++XH6/P6xjB4B4RwAGgDB4//339f3vf1+HDx+WJJWX\nl+uJJ57Q2WefPeB2y5cv1759+/Tss8+qq6tLP/rRj1RZWTmix/D5fPL5fMrJyVFCQoK2b9+uHTt2\n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\n6XK59PWvf1179+7V3r17dcEFF1g0OjhZcnKyHnjgAb3zzjt67bXX9KMf/Ujvvfde0PvPsAfg3bt3\n62Mf+5imTZum5ORkXXnllXr22WfD/TBAyLjuE3ZwzjnnKCsra8DXfv/73+u6666TJF133XX63e9+\nZ8XQgEFfnxL7T1gvPz9fCxYskCSlp6dr9uzZOnz4cND7z7AH4MOHD6uoqKj388LCQh0+fDjcDwOE\nxOVy6fzzz9eiRYv085//3OrhAANUVVXJ7XZLktxut6qqqiweETDQD3/4Q82fP19r166lRQeWKysr\n0969e3XWWWcFvf8MewB2uVzh3iQQNq+88or27t2r7du360c/+pFefvllq4cEDMrlcrE/ha3867/+\nqw4cOKA333xTBQUFuv32260eEhysublZK1eu1A9+8ANlZGQM+N5I9p9hD8CTJ09WeXl57+fl5eUq\nLCwM98MAISkoKJAk5ebm6pJLLqEPGLbidrtVWVkpSaqoqFBeXp7FIwL65OXl9QaLdevWsf+EZTo7\nO7Vy5UqtXr1aF198saTg959hD8CLFi3S3//+d5WVlcnn8+k3v/mNLrzwwnA/DBC01tZWHTt2TJLU\n0tKiHTt2DLjCGbDahRdeqK1bt0qStm7d2rtjB+ygoqKi9+NnnnmG/Scs4ff7tXbtWs2ZM0e33npr\n79eD3X9GZCW47du369Zbb1V3d7fWrl2rf//3fw/3QwBBO3DggC655BJJUldXl1atWsVrE5a56qqr\ntHPnTtXU1Mjtduvuu+/WRRddpCuuuEIHDx7UtGnT9NRTT2nChAlWDxUOdPzr86677pLX69Wbb74p\nl8ul6dOn62c/+1lvzyUQLX/+85+1ZMkSzZs3r7fNYcOGDTrzzDOD2n+yFDIAAAAchZXgAAAA4CgE\nYAAAADgKARgAAACOQgAGAACAoxCAAQAA4CgEYAAAADgKARgAAACOQgAGAACAo/x/vpRvLk7PF8gA\nAAAASUVORK5CYII=\n", "text": [ "" ] } ], "prompt_number": 11 }, { "cell_type": "markdown", "metadata": {}, "source": [ "We have a residual, now, called `mean_`. \n", "\n", "*We are also retaining a new attribute, `total_val` which we use to calculate the mean. Our scaffolding code only plots attributes ending with underscore (`_`), which we use as a way of marking our residuals.*\n", "\n", "The mean is close to `5` right now. The stopping rule says that if a new value passed differs from the mean by more than 100 units, then the stopping rule should be triggered. \n", "\n", "Let's test this out by building a new signal." ] }, { "cell_type": "code", "collapsed": false, "input": [ "signal[17] = 200\n", "\n", "plt.plot(signal)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 12, "text": [ "[]" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\nAAAASUVORK5CYII=\n", "text": [ "" ] } ], "prompt_number": 12 }, { "cell_type": "code", "collapsed": false, "input": [ "# Let's run our detector on this signal\n", "\n", "OnlineSimulator(detector, signal).run()\n" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Residuals: ['mean_']\n", "Change detected. Stopping Rule triggered at 17.\n", "\n" ] }, { "metadata": {}, "output_type": "pyout", "prompt_number": 13, "text": [ "True" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\nqFGj9Je//KXbz+uLL77QOeec4/45KSmpxe033XSTLr30UkVGRraorSvS09N13XXXae7cuYqKitK4\nceP03XdUiYo8AAAWAElEQVTfKSMjQ1arVaeeeqreffdd9/0PHz6s+fPn6+STT5bNZtODDz7ofq67\nd+/WL37xCw0ZMkRDhw7Vr371Kx0+fNj92ISEBK1YsULjx49XdHS0brjhBtXU1HT79QAAbyMcAwho\nrkC4f/9+ZWVl6fzzz5ckFRYW6vLLL9dDDz2ksrIyPf7445o1a5YOHjyo6upq3XXXXcrKylJFRYU+\n+eQTTZgw4YRlHzhwQLNmzdLy5ct18OBBjRo1Sh999JH79s5Gaq1Wq95++21VVFRozZo1uvvuu5Wb\nm9ul5/XII48oJiZGc+bM0bp16xQTE6P//d//1ezZszVo0KAuBeF9+/YpJiZG+/fvb/c+b731lm66\n6SaVlZUpKSlJycnJkqSioiI9+OCD+s1vfuO+780336w+ffpo9+7dys3NVXZ2tp577jn37b///e9V\nXFysHTt2qKCgQOnp6e7bLBaLXn/9db3zzjvau3evvvrqK73wwgtdei0AwJcIxwACVmNjo6666ipF\nRUXplFNO0ahRo/T//t//kyS99NJLmjFjhi699FJJ0vTp0zVx4kS9/fbbslgsCgkJ0fbt2/XTTz/J\narUqMTHxhOVv3LhRZ599tq655hqFhoZq0aJFiouLa7H+jsyYMUMjRoyQJE2dOlUpKSn64IMPuvTc\nHnroIf34448aMWKE9uzZo7fffluXXnqpysvLdejQoS61UJxyyikqKyuTzWZr9z5Tp05VcnKyQkND\nde211+rgwYO6//77FRoaquuvv175+fmqqKhQaWmpNm3apJUrV6pfv34aOnSoFi1apFdffVWSNGrU\nKE2bNk3h4eEaMmSI7r777hYj9ZL029/+VnFxcYqJidHMmTO1devWLr0WAOBLhGMAActisWjDhg2q\nqKiQw+HQP//5T33xxReSpO+//16vv/66YmJi3F8fffSRSkpK1L9/f7322mv67//+b5188sm6/PLL\n9e23356w/KKiohOCZXdmmNi0aZMuuOACDR48WDExMdq4caMOHjzY6eO2bt2qmJgYDRo0SLt27dIZ\nZ5yhX/ziF3I4HIqJidEbb7zR5Ro6Exsb6/65X79+GjJkiDt49+vXT5JUVVWl77//XseOHdOwYcPc\nr+e//du/6ccff5QklZaW6oYbbpDNZtPAgQM1d+7cE55r8w8W/fr1U1VVlWHPAwCMQjgGEBSmTp2q\nO++8U0uXLpXkHDWdO3euysrK3F+VlZVasmSJJCklJUXZ2dkqKSnRmDFjdOutt56wzJNPPlkFBQXu\ny42NjS0uR0RE6MiRI+7LJSUl7p9ramo0a9YsLVmyRD/88IPKyso0Y8aMLrVDTJgwQWVlZfr973+v\nP/zhDyorK1NiYqK++uorlZWV6eqrr27zcd09IK879x8+fLhOOukkHTx40P16Hj58WNu3b5ckPfDA\nAwoNDdXXX3+tw4cP629/+5u7H9mIWgHAVwjHAILGokWLlJOTo88++0y/+tWv9Pe//13Z2dmqr6/X\n0aNH5XA4VFhYqB9++EEbNmxQdXW1wsPDNWDAAIWGhp6wvBkzZuibb77RG2+8obq6Oq1atapFAJ4w\nYYL+9a9/qaCgQIcPH1ZGRob7ttraWtXW1mrIkCEKCQnRpk2blJ2d3a3n4zoYr7a2VkVFRRo5cuQJ\n96mrq9PRo0dVX1+vY8eO6ejRox2G0ua6cwDfsGHDlJKSonvuuUeVlZVqaGjQ7t279a9//UuSc3R5\nwIABioqKUmFhoR577DHD1g0AvkQ4BhA0hgwZorS0ND366KOy2WzasGGDli9frtjYWJ1yyilasWKF\nGhsb1dDQoJUrVyo+Pl6DBw/WBx98oP/6r/+S1HIe4yFDhuj111/X/fffryFDhmjXrl268MIL3eub\nPn26rr/+eo0bN07nnXeeZs6c6X5sZGSkVq1apdTUVA0aNEhr167VlVde2aLezkZPt2zZonPOOUfb\nt2/X2LFj27zPggUL1L9/f7366qv64x//qP79++ull16S5DwgLzIyst0D8tqas7mjy3/9619VW1ur\nxMREDRo0SNddd537w8KyZcu0ZcsWDRw4UDNnztSsWbM6fH7+mC8aALrC0sjHdwAAAEASI8cAAACA\nG+EYAOA3y5cvV2Rk5Alfl112mb9LA9BL0VYBAAAANAnzx0onTJigbdu2+WPVAAAA6CXGjx/f7RMO\n+WXk2GKxMI0PTCk9Pb3FKW8BM2H7hFmxbcKsepI56TkGAAAAmhCOAQAAjMIIesAjHAPN2O12f5cA\ntIvtE2bFtolgQs8xAAAAghI9xwAAAIAHCMcAAABGoec44PU4HN9yyy2yWq0aO3bsCbetWLFCISEh\n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\n/wfTTuqYshNZ6gAAAABJRU5ErkJggg==\n", "text": [ "" ] } ], "prompt_number": 13 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that the signal was triggered at data point 17. No information about the rest of the signal was available to the detector at the time the stopping rule was triggered. \n", "\n", "After the rules were triggered, the simulation stopped. No residuals were calculated for the remainder of the points. (The rest of signal is still shown, only for illustrative purposes)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### This is the important disctinction between online and offline algorithms.\n", "\n", "Our online change detectors, at any given time $t_0$, only have access to the portion of the signal that has before, $t < t_0$. \n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Finally, let's get started.\n", "\n", "\n", "Okay, so now we have the ability to write change detectors, \n", "easily pass signals to them in an \"online\" fashion, and to \n", "examine and visualize the results. \n", "\n", "Return to the Change Detection Tutorial [Table of Contents](https://github.com/amanahuja/change-detection-tutorial)" ] } ], "metadata": {} } ] }