Added hook to git to remove all notebook output prior to committing.

This should make git ignore differences caused by merely running a notebook.
This commit is contained in:
Roger Labbe committed 2014-05-06 09:48:35 -05:00
1 parent 499f8d91f5
commit 9ae5aea761
8 files changed
+2040 -2006

No files matched your search

+200 -198
View File
@@ -1,199 +1,201 @@
{
"metadata": {
"name": ""
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#Gaussian Probabilities\n",
"\n",
"#### Introduction\n",
"\n",
"The histogram filter uses a vector or multidimensional array of probabilities to represent our belief of the system state. This is very powerful, but it has limitations. Let us list a few. First, it is multimodal, and we may not want a multimodal result. In other words, we would not want our GPS telling us that we are 50% likely to be here, 40% likely to be there, and so on. There are plenty of techniques to go from a multimodal histogram to a unimodal result, but they all involve significant processing time. This becomes worse as we extend the problem into multiple dimensions. In general for $d$ dimensions the computational run time will be $O(n^d)$. So these filters become intractable in higher dimensions. \n",
"\n",
"Second, the results are hard to analyze. Recall the GPS in your car. It probably has a display that tells you how much error is in the filter - it tells you are at a specific location on the earth, with for example 9 meters of error. How would you derive that information from a histogram filter? There is no clear cut way. Most, if not all of the bins in the histogram will be non-zero, and there will usually be several clusters of higher probabilities. Being multimodal, there is no clear way to derive a single error estimate. Certainly one could come up with a heuristic, but often we want mathematically precise answers, not heuristics.\n",
"\n",
"Third, the histogram is discrete, but we live in a continuous world. The histogram requires that you model the output of your filter as a set of discrete points. In our dog in the hallway example, we used 10 positions, which is obviously far too few positions for anything but a toy problem. For example, for a 100 meter hallway you would need 10,000 positions to model the hallway to 1cm accuracy. So each sense and update operation would entail performing calculations for 10,000 different probabilities. It gets exponentially worse as we add dimensions. If our dog was roaming in a $100x100 m^2$ courtyard, we would need 100,000,000 bins ($10,000^2$) to get 1cm accuracy.\n",
"\n",
"Finally, the histogram does not represent what happens in the pysical world very well. For example, in the last chapter we had this as a probability distribution: [ 0.2245871 0.06288015 0.06109133 0.0581008 0.09334062 0.2245871\n",
" 0.06288015 0.06109133 0.0581008 0.09334062]. The largest probabilities are in position 0 and position 5. This does not fit our physical intuition at all. A dog cannot be in two places at once.\n",
" \n",
" \n",
"Consider how a bimetallic thermometer works. These thermometers use a strip of bimetallic material bent into a loose coil shape, with a pointer attached to the spring. The two metals expand at different rates, so the strip will either coil tighter or uncoil as the temperature changes, and the pointer indicates the current temperature. It is in some ways a crude system, yet it works well. What kinds of errors might we expect from this system? It will not respond to rapid temperature changes, so it will always lag the current temperature a small amount. There may be frictions in the system causing the pointer to not register the correct value. And so on. Finally, when you read the dial you will rarely be exactly perpindicular to the face of the dial. Viewing the pointer against the dial from an angle will result in a small reading error - 34 might look like 35 from the left of the dial, for example. However, in total all of these effects will generally be low, and we would expect the total errors to always be small. We would probably agree that an error of 2 degrees is reasonable, but an error of 100 degrees would occur extremely rarely, if ever. Furthermore, we would expect the errors to cluster around the correct value. So in most systems we would expect the errors to equally likely to be larger or smaller than the correct value. If the correct temperature was 35 degrees, and we were told the thermometer was accurate within 2 degrees, we wouldn't be suprised to read either 33 degrees or 37 degrees. \n",
"\n",
"So we desire a unimodal, continuous way to represent probabilities that models how the real world works, and that is very computationally efficient to calculate. As you might guess from the chapter name, gaussian distributions provide all of these features.\n",
"\n",
"\n",
"#### Probability Distributions\n",
"\n",
"Before we go into the math, lets look at a graph of the gaussian distribution. Don't bother reading the code yet; it is not important at this stage."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import math\n",
"\n",
"def gaussian (x, mu, sigma):\n",
" ''' compute the gaussian with the specified mean(mu) and sigma'''\n",
" return math.exp (-0.5 * (x-mu)**2 / sigma) / math.sqrt(2.*math.pi*sigma)\n"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 7
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"xs = arange(0,10,0.1)\n",
"ys = [gaussian (x, 5, 3) for x in xs]\n",
"plot (xs, ys)\n",
"show()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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 truncated
"text": [
"<matplotlib.figure.Figure at 0x3d52450>"
]
}
],
"prompt_number": 16
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Probably this is immediately recognizable to you as a 'bell curve'. This curve is ubiquitious because under real world conditions most observations are distributed in such a manner. We will not prove the math here, but the **central limit theorem** proves that under certain conditions the arithmetic mean of independent observations will be distributed in this manner, even if the observations themselves do not have this distribution. In nonmathematical terms, this means that if you take a bunch of measurements from a sensor and use them in a filter, they are very likely to create this distribution.\n",
"\n",
"Before we go further, a moment for terminology. This is variously called a normal distribution, a Gaussian distribution, or a bell curve. However, other distributions also have a bell shaped curve, so that name is somewhat ambiguous, and we will not use it again."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Gaussian Distributions\n",
"\n",
"So let us explore how gaussians work. A gaussian is a continuous probability distribution that is completely described with two parameters, the mean ($\\mu$) and the variance ($\\sigma^2$). It is defined as:\n",
"$$ \n",
"f(x, \\mu, \\sigma) = \\frac{1}{\\sigma\\sqrt{2\\pi}} e^{-0.5*{(x-\\mu)^2}/\\sigma^2 }\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You will not need to understand how this equation comes about, or remember it for this book, but it is useful to look at it to see how it works. Specifically, notice the term for $e$. When $x==\\mu$, the term reduces to $e^0=1$. Any other value of x will result in a smaller value for the exponent term due to the negative sign, so the curve will always be highest at $x==\\mu$.\n",
"\n",
"Now we will plot a gaussian centered around 23 ($\\mu=23$), with a variance of 1 ($\\sigma^2=1$). "
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"xs = arange(16,30,0.1)\n",
"ys = [gaussian (x,23,1) for x in xs]\n",
"plt.plot (xs,ys, 'r')\n",
"plt.axvline(23); plt.axvline(24) \n",
"plt.show()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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 truncated
"text": [
"<matplotlib.figure.Figure at 0x41ff2d0>"
]
}
],
"prompt_number": 34
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As we expected the curve is centered around 23. The width of the curve is defined by the variance. If the variance is large than the curve will be wide, and if the variance is small the curve will be narrow.\n",
"\n",
"So what does this curve *mean*? Assume for a moment that we have a themometer that reads 23$\\,^{\\circ}$. We have asserted (without proof) that the distribution will be *normal*. If that is true, then this chart can be interpreted as a continuous curve depicting our belief that the temperature is any given temperature. In this curve, we assign a probability of the temperature being exactly 23$\\,^{\\circ}$ is 40%. Looking to the right, we assign the probability that the temperature is 24$\\,^{\\circ}$ is about 25%. We find 20$\\,^{\\circ}$ and 26$\\,^{\\circ}$ quite unlikely, and temperatures beyond that range extremely rare. \n",
"\n",
"Since this is a probability distribution it is required that the area under the curve always equals one. This should be intuitively clear - the area under the curve represents all possible occurances, which must sum to one.\n",
"\n",
"This leads to an important insight. If the variance is small the curve will be narrow. To keep the area == 1, the curve must also be tall. On the other hand if the variance is large the curve will be wide, and thus it will also have to be short to make the area == 1.\n",
"\n",
"Let us look at that:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"plt.plot (xs,[gaussian(x, 23, .2) for x in xs],'b')\n",
"plt.plot (xs,[gaussian(x, 23, 1) for x in xs],'g')\n",
"plt.plot (xs,[gaussian(x, 23, 5) for x in xs],'r')\n",
"plt.show()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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 truncated
"text": [
"<matplotlib.figure.Figure at 0x4478790>"
]
}
],
"prompt_number": 35
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So what is this telling us? The blue gaussian is very narrow. It is saying that we believe x=23, and that we are very sure about that. In contrast, the red gaussian also believes that x=23, but we are much less sure about that. Our believe that x=23 is lower, and so our belief about the likely possible values for x is spread out - we think it is quite likely that x=2 or x=8, for example. The blue gaussian has almost completely eliminated 22 or 24 as possible value - their probably is almost 0.0, whereas the red curve considers them nearly as likely as 23.\n",
"\n",
"If we think back to the thermometer, we can consider these three curves as representing 3 thermometers. The blue curve represents a very accurate thermometer, and the red one represents a fairly inaccurate one. Green of course represents one in between the two others. Note the very powerful property the Gaussian distribution affords us - we can entirely represent both the reading and the error of a thermometer with only two numbers - the mean and the variance.\n",
"\n",
"The standard notation for a normal distribution is just $N(\\mu,\\sigma^2)$. I will not go into detail as to why $\\sigma^2$ is used, other than to note that $\\sigma$ is commonly called the *standard deviation*, which has enormous utility in statistics. The standard deviation is not really used in this book, so I will not address it further. The important thing to understand is that the variance ($\\sigma^2$) is a measure of the width of the curve. The curve above is notated as $N(23, 1)$, since $\\mu=23$ and $\\sigma=1$. We will use this notiation throughout the rest of the book, so learn it now.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Computational Properties of the Gaussian\n",
"\n",
"Recall how our histogram filter worked. We had a vector (Python array) representing our belief at a certain moment in time. When we performed another measurement using the *sense()* function we had to multiply probabilities together, and when we performed the motion step using the *update()* function we had to shift and add probabilities. I've promised you that the Kalman filter uses essentially the same process, and that it uses Gaussians instead of histograms, so you might reasonable expect that we will be multipling, adding, and shifting Gaussians in the Kalman filter.\n",
"\n",
"A typical math book would directly launch into a multipage proof of the behavior of Gaussians under these operations, but I don't see the value in that unless you plan to do statistics. I think the math will be much more intuitive and clear if we just start developing a Kalman filter using Gaussians, and I will provide the equations for multiplying and shifting Gaussians at the appropriate time. You will then be able to develop a physical intuition for what these operations do, rather than be forced to digest a lot of fairly abstract math.\n",
"\n",
"The key point, which I will only assert for now, is that all the operations are very simple, and that they preserve the properties of the Gaussian. This is somewhat remarkable, in that the Gaussian is a nonlinear function, and typically if you multiply a nonlinear equation with itself you end up with a different equation. For example, the shape of $sin(x)sin(x)$ is very different from $sin(x)$. But the result of multiplying two Gaussians is yet another Gaussian. This is a fundamental discovery, and the key reason why Kalman filters are possible\n",
"\n",
"\n",
"#### Summary and Key Points"
]
}
],
"metadata": {}
}
]
{
"metadata": {
"name": ""
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#Gaussian Probabilities\n",
"\n",
"#### Introduction\n",
"\n",
"The histogram filter uses a vector or multidimensional array of probabilities to represent our belief of the system state. This is very powerful, but it has limitations. Let us list a few. First, it is multimodal, and we may not want a multimodal result. In other words, we would not want our GPS telling us that we are 50% likely to be here, 40% likely to be there, and so on. There are plenty of techniques to go from a multimodal histogram to a unimodal result, but they all involve significant processing time. This becomes worse as we extend the problem into multiple dimensions. In general for $d$ dimensions the computational run time will be $O(n^d)$. So these filters become intractable in higher dimensions. \n",
"\n",
"Second, the results are hard to analyze. Recall the GPS in your car. It probably has a display that tells you how much error is in the filter - it tells you are at a specific location on the earth, with for example 9 meters of error. How would you derive that information from a histogram filter? There is no clear cut way. Most, if not all of the bins in the histogram will be non-zero, and there will usually be several clusters of higher probabilities. Being multimodal, there is no clear way to derive a single error estimate. Certainly one could come up with a heuristic, but often we want mathematically precise answers, not heuristics.\n",
"\n",
"Third, the histogram is discrete, but we live in a continuous world. The histogram requires that you model the output of your filter as a set of discrete points. In our dog in the hallway example, we used 10 positions, which is obviously far too few positions for anything but a toy problem. For example, for a 100 meter hallway you would need 10,000 positions to model the hallway to 1cm accuracy. So each sense and update operation would entail performing calculations for 10,000 different probabilities. It gets exponentially worse as we add dimensions. If our dog was roaming in a $100x100 m^2$ courtyard, we would need 100,000,000 bins ($10,000^2$) to get 1cm accuracy.\n",
"\n",
"Finally, the histogram does not represent what happens in the pysical world very well. For example, in the last chapter we had this as a probability distribution: [ 0.2245871 0.06288015 0.06109133 0.0581008 0.09334062 0.2245871\n",
" 0.06288015 0.06109133 0.0581008 0.09334062]. The largest probabilities are in position 0 and position 5. This does not fit our physical intuition at all. A dog cannot be in two places at once.\n",
" \n",
" \n",
"Consider how a bimetallic thermometer works. These thermometers use a strip of bimetallic material bent into a loose coil shape, with a pointer attached to the spring. The two metals expand at different rates, so the strip will either coil tighter or uncoil as the temperature changes, and the pointer indicates the current temperature. It is in some ways a crude system, yet it works well. What kinds of errors might we expect from this system? It will not respond to rapid temperature changes, so it will always lag the current temperature a small amount. There may be frictions in the system causing the pointer to not register the correct value. And so on. Finally, when you read the dial you will rarely be exactly perpindicular to the face of the dial. Viewing the pointer against the dial from an angle will result in a small reading error - 34 might look like 35 from the left of the dial, for example. However, in total all of these effects will generally be low, and we would expect the total errors to always be small. We would probably agree that an error of 2 degrees is reasonable, but an error of 100 degrees would occur extremely rarely, if ever. Furthermore, we would expect the errors to cluster around the correct value. So in most systems we would expect the errors to equally likely to be larger or smaller than the correct value. If the correct temperature was 35 degrees, and we were told the thermometer was accurate within 2 degrees, we wouldn't be suprised to read either 33 degrees or 37 degrees. \n",
"\n",
"So we desire a unimodal, continuous way to represent probabilities that models how the real world works, and that is very computationally efficient to calculate. As you might guess from the chapter name, gaussian distributions provide all of these features.\n",
"\n",
"\n",
"#### Probability Distributions\n",
"\n",
"Before we go into the math, lets look at a graph of the gaussian distribution. Don't bother reading the code yet; it is not important at this stage."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import math\n",
"\n",
"def gaussian (x, mu, sigma):\n",
" ''' compute the gaussian with the specified mean(mu) and sigma'''\n",
" return math.exp (-0.5 * (x-mu)**2 / sigma) / math.sqrt(2.*math.pi*sigma)\n"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 1
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%matplotlib inline\n",
"\n",
"xs = arange(0,10,0.1)\n",
"ys = [gaussian (x, 5, 3) for x in xs]\n",
"plot (xs, ys)\n",
"show()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAXsAAAEACAYAAABS29YJAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XlYlWX+x/H3UWjKJVNDFNBQQIFUtFBSszBFR0tLs4my\ndBIdszGzsfmZNU3aYlKTbTiNY9poGVlZaaXUWFHmEpmWJZotUIhpTrnkksDh+f1xF2bqERDOfZbP\n67q8CjgPfDzgl++5n3txOY7jICIiAa2O7QAiIlL7VOxFRIKAir2ISBBQsRcRCQIq9iIiQUDFXkQk\nCJyw2Ofk5BAfH09cXByZmZlHfXzBggUkJSXRsWNHevTowYYNGyo+Fh0dTceOHencuTNdu3at2eQi\nIlJpLk/z7N1uN+3atWP58uVERkbSpUsXsrOzSUhIqHjM6tWrSUxMpFGjRuTk5DBlyhTWrFkDQOvW\nrfnwww9p0qRJ7f9NRETkuDx29nl5ecTGxhIdHU1oaCjp6eksXrz4iMd069aNRo0aAZCSksLWrVuP\n+LjWbImI2Oex2BcXF9OyZcuKt6OioiguLj7u4+fMmcOAAQMq3na5XPTp04fk5GRmz55dA3FFRKQ6\nQjx90OVyVfoTvf3228ydO5eVK1dWvG/lypW0aNGCnTt3kpaWRnx8PD179qx+WhERqRaPxT4yMpKi\noqKKt4uKioiKijrqcRs2bGD06NHk5OTQuHHjive3aNECgLCwMAYPHkxeXt5RxT42NpYvv/zypP4S\nIiLBJiYmhi+++KLyFzgelJaWOm3atHEKCgqcQ4cOOUlJSU5+fv4Rj/n666+dmJgYZ/Xq1Ue8f//+\n/c7evXsdx3Gcffv2Od27d3def/31o77GCSIElTvvvNN2BJ+h5+IwPReH6bk4rKq102NnHxISQlZW\nFv369cPtdpORkUFCQgKzZs0CYMyYMdx1113s2rWLsWPHAhAaGkpeXh7bt29nyJAhAJSVlTFs2DD6\n9u1brd9gIiJycjwWe4D+/fvTv3//I943ZsyYiv9/4okneOKJJ466rk2bNnz00Uc1EFFERE6WVtD6\nkNTUVNsRfIaei8P0XBym56L6PC6q8koAl0tz8UVEqqiqtVOdvYhIEFCxFxEJAir2IiJBQMVeRCQI\nqNiLiAQBFXsRkSCgYi8iEgRU7EVEgoCKvYhIEFCxFxEJAifcCE0kmPz0E3z7LWzbBt99B40bQ0SE\n+dOgge10ItWnYi9BzXHgk09gyRLz5+OPoXlziIyEsDDYvdsU/uJiiIqCQYPg0kuhWzcI0b8e8SPa\nCE2CUnk5vPQSTJ0K+/aZAj5oEJx/PoSGHv14x4H16w//UtixA269FUaPhlNP9X5+karWThV7CTqv\nvAJ33GE687vugv79oQrHLQOwbh1MmWJ+Adx2myn66vTFm1TsRY5j1y74859Ngb7/frjkkqoX+d/6\n4AOYNAkOHoSnn4aYmJrJKnIi2uJY5BjefhuSkuDMM01XPnDgyRd6gC5dYPlySE+H886DuXPNkI+I\nr1FnLwHNcSAzEx57DObMgd//vva+1qefwjXXQIcO5mudckrtfS0RDeOI/MzthvHj4b33YNkyM32y\nth08CFddZW76vvginH567X9NCU4axhHBFN0rroBNm+Ddd71T6AFOOw0WLYK2beGCC8y0TRFfoGIv\nAefgQbj4Yvjd70xH36iRd79+3bowcyb84Q9mKmdxsXe/vsixaLKYBJTSUrjySmjWzMyOqVvXTg6X\ny0zJrFsX0tLMq4szz7STRQQ0Zi8BpLwcrr3WrHp96SXfuUF6663w5pvmj8bwpaboBq0EJceBG2+E\nDRsgJwfq1bOd6DDHgbFjYfNmk00rbqUm6AatBKWsLDNU8sorvlXowQzpzJxphnGuv17z8MUOdfbi\n995+20x3XL0aWre2neb49u+H7t0hI8NMCRU5GRrGkaBSWGhWri5YAL17205zYgUFZsfM7Gzo1ct2\nGvFnGsaRoHHgAAwebPam8YdCD+aVx4IF5pVIYaHtNBJM1NmL3xo92sypf+qpmtnnxptmzICFC83q\n3mNtqSxyIursJSgsWmTG6h9/3P8KPcDNN0PTpmY/fRFvUGcvfmfrVjj3XHOISEqK7TTVt2MHdOoE\nzz4LF15oO434G3X2EtDcbrNwavx4/y70AOHhZnfMa681e+2L1CZ19uJXMjNh6VJ46y17WyHUtJtu\ngu3bzRi+SGVp6qUErM2bzcZiH34IZ51lO03N+ekn6NwZ7rkHLr/cdhrxFyr2EpDKy6FnT7j6anO0\nYKBZudLskvnpp9C4se004g9qfMw+JyeH+Ph44uLiyMzMPOrjCxYsICkpiY4dO9KjRw82bNhQ6WtF\nKuuf/4Q6dcweM4GoRw/T1U+caDuJBCzHg7KyMicmJsYpKChwSkpKnKSkJCc/P/+Ix6xatcrZvXu3\n4ziOs2zZMiclJaXS1/78qsJTBBGnoMBxzjzTcTZvtp2kdv34o+OcdZbjvP667STiD6paOz129nl5\necTGxhIdHU1oaCjp6eksXrz4iMd069aNRj+fDpGSksLWrVsrfa3IiTgOjBljOt527WynqV0NGsCs\nWebvu2+f7TQSaDwW++LiYlq2bFnxdlRUFMUejt2ZM2cOAwYMqNa1Isfy3HNmpkqwDG/062duQt99\nt+0kEmg8nlTlqsLSxLfffpu5c+eycuXKKl87ZcqUiv9PTU0lNTW10tdK4Nq3D265xWwaFkxbCjzw\nAHToANddB/HxttOIr8jNzSU3N7fa13ss9pGRkRQVFVW8XVRURFRU1FGP27BhA6NHjyYnJ4fGP08l\nqOy1cGSxF/nF3XebnSHPP992Eu9q3hxuv90cxvLGG/65HYTUvN82wlOruteGpwH90tJSp02bNk5B\nQYFz6NChY95k/frrr52YmBhn9erVVb62OjcZJDhs2mRuyn77re0kdpSWOk779o7z/PO2k4ivqmrt\n9NjZh4SEkJWVRb9+/XC73WRkZJCQkMCsWbMAGDNmDHfddRe7du1i7M9z4kJDQ8nLyzvutSIn8ssR\ng7ffbrrcYBQSYk63uuYa6N8f6te3nUj8nRZVic958UW4805Yv94UvWA2bBhER8O999pOIr5GK2jF\nrx06BImJZgpinz6209hXXAwdO5pffK1a2U4jvkS7XopfmzkTEhJU6H8RGWm2h7jtNttJxN+psxef\n8f33Zqrhu++agi/Gvn3Qti0sXgxduthOI75CwzjityZMgJISsw+OHGnOHJg3D955R1MxxVCxF7+0\nZQt07w75+dCsme00vsfthnPOMTeuhwyxnUZ8gYq9+KUhQ6BrV7j1VttJfNd//ws33GB+IQbTimI5\nNt2gFb/z/vvwwQfmxCY5vrQ0aN3aDOmIVJU6e7HKcaB3b3MoyahRttP4vrVr4dJL4fPPoV4922nE\nJnX24leWLzdzyf/4R9tJ/ENysrm38dhjtpOIv1FnL9Y4jplKOGkSXHGF7TT+47PPzOZwW7boCMNg\nps5e/MaiRabg65DtqmnXzgzlPPCA7STiT9TZixVlZdC+PTz6KPTtazuN/ykqgk6dzAHlLVrYTiM2\nqLMXv7BgAYSHmxkmUnUtW8KIETB9uu0k4i/U2YvXlZaabRHmzoULL7Sdxn/t2GG2ldiwAY5zLpAE\nMHX24vPmzzfzxVXoT054uJmuet99tpOIP1BnL15VUmI29VqwAHr0sJ3G/+3caV4laQvk4KPOXnza\nk0+a4qRCXzPCwmDMGB1uIiemzl685tAhiIuD55+HlBTbaQLH99+bV0sffmhOtZLgoM5efNacOWa6\npQp9zWra1GyQds89tpOIL1NnL15RUgKxsfDCC2Z3S6lZP/xgXjWpuw8e6uzFJ82bZ86WVaGvHU2a\nmLH7zEzbScRXqbOXWldaasaUn35aN2Zr086dZisFzbsPDursxecsWGDm1avQ166wMMjIgPvvt51E\nfJE6e6lVZWVmlefs2ZCaajtN4PtlVe3GjdozJ9Cpsxef8uyz0Ly5Vst6S3g4DB+uHTHlaOrspdaU\nl5uplg8/rJ0tvWnbNvO8f/aZGdqRwKTOXnzGSy9Bgwba2dLbIiLgyivNL1mRX6izl1rhOOYIvTvu\ngMsus50m+BQUmFPAvvwSGjWynUZqgzp78QlvvGG2Rxg0yHaS4NS6NQwYADNn2k4ivkKdvdSKCy4w\ni3yGDbOdJHjl50OvXqbLr1fPdhqpaersxboVK6C42Iwbiz2JiWZtw+zZtpOIL1BnLzVuwAAYPBhG\nj7adRNauNd+LL7+EU06xnUZqkjp7sWr9erNcf/hw20kEzE3yxERzOpgEN3X2UqOuvNJsYfyXv9hO\nIr/IzYU//Qk2bYK6dW2nkZqizl6s+fxzeOstDd/4mgsvNLtivvSS7SRi0wmLfU5ODvHx8cTFxZF5\njP1TN2/eTLdu3Tj11FN58MEHj/hYdHQ0HTt2pHPnznTV3rYB74EHzCEaDRvaTiK/5nLB5MnmYHK9\niA5eHodx3G437dq1Y/ny5URGRtKlSxeys7NJSEioeMzOnTv5+uuvefnll2ncuDETJ06s+Fjr1q35\n8MMPadKkyfEDaBgnIPyyRH/LFjjzTNtp5LfKy6FDB7OqViuaA0ONDuPk5eURGxtLdHQ0oaGhpKen\ns3jx4iMeExYWRnJyMqGhocf8HCrkweGhh8xNWRV631SnDkyaBNOn204itngs9sXFxbRs2bLi7aio\nKIqLiyv9yV0uF3369CE5OZnZmuwbsHbtgrlzdVPW1111FXzxBeTl2U4iNoR4+qDL5TqpT75y5Upa\ntGjBzp07SUtLIz4+np49e57U5xTfM3MmDBwIrVrZTiKehIbCLbeYsXvdrA0+Hot9ZGQkRULine truncated
"text": [
"<matplotlib.figure.Figure at 0x5da42e8>"
]
}
],
"prompt_number": 2
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Probably this is immediately recognizable to you as a 'bell curve'. This curve is ubiquitious because under real world conditions most observations are distributed in such a manner. We will not prove the math here, but the **central limit theorem** proves that under certain conditions the arithmetic mean of independent observations will be distributed in this manner, even if the observations themselves do not have this distribution. In nonmathematical terms, this means that if you take a bunch of measurements from a sensor and use them in a filter, they are very likely to create this distribution.\n",
"\n",
"Before we go further, a moment for terminology. This is variously called a normal distribution, a Gaussian distribution, or a bell curve. However, other distributions also have a bell shaped curve, so that name is somewhat ambiguous, and we will not use it again."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Gaussian Distributions\n",
"\n",
"So let us explore how gaussians work. A gaussian is a continuous probability distribution that is completely described with two parameters, the mean ($\\mu$) and the variance ($\\sigma^2$). It is defined as:\n",
"$$ \n",
"f(x, \\mu, \\sigma) = \\frac{1}{\\sigma\\sqrt{2\\pi}} e^{-0.5*{(x-\\mu)^2}/\\sigma^2 }\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You will not need to understand how this equation comes about, or remember it for this book, but it is useful to look at it to see how it works. Specifically, notice the term for $e$. When $x==\\mu$, the term reduces to $e^0=1$. Any other value of x will result in a smaller value for the exponent term due to the negative sign, so the curve will always be highest at $x==\\mu$.\n",
"\n",
"Now we will plot a gaussian centered around 23 ($\\mu=23$), with a variance of 1 ($\\sigma^2=1$). "
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"xs = arange(16,30,0.1)\n",
"ys = [gaussian (x,23,1) for x in xs]\n",
"plt.plot (xs,ys, 'r')\n",
"plt.axvline(23); plt.axvline(24) \n",
"plt.show()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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 truncated
"text": [
"<matplotlib.figure.Figure at 0x84d8400>"
]
}
],
"prompt_number": 3
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As we expected the curve is centered around 23. The width of the curve is defined by the variance. If the variance is large than the curve will be wide, and if the variance is small the curve will be narrow.\n",
"\n",
"So what does this curve *mean*? Assume for a moment that we have a themometer that reads 23$\\,^{\\circ}$. We have asserted (without proof) that the distribution will be *normal*. If that is true, then this chart can be interpreted as a continuous curve depicting our belief that the temperature is any given temperature. In this curve, we assign a probability of the temperature being exactly 23$\\,^{\\circ}$ is 40%. Looking to the right, we assign the probability that the temperature is 24$\\,^{\\circ}$ is about 25%. We find 20$\\,^{\\circ}$ and 26$\\,^{\\circ}$ quite unlikely, and temperatures beyond that range extremely rare. \n",
"\n",
"Since this is a probability distribution it is required that the area under the curve always equals one. This should be intuitively clear - the area under the curve represents all possible occurances, which must sum to one.\n",
"\n",
"This leads to an important insight. If the variance is small the curve will be narrow. To keep the area == 1, the curve must also be tall. On the other hand if the variance is large the curve will be wide, and thus it will also have to be short to make the area == 1.\n",
"\n",
"Let us look at that:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"plt.plot (xs,[gaussian(x, 23, .2) for x in xs],'b')\n",
"plt.plot (xs,[gaussian(x, 23, 1) for x in xs],'g')\n",
"plt.plot (xs,[gaussian(x, 23, 5) for x in xs],'r')\n",
"plt.show()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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 truncated
"text": [
"<matplotlib.figure.Figure at 0x86255c0>"
]
}
],
"prompt_number": 4
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So what is this telling us? The blue gaussian is very narrow. It is saying that we believe x=23, and that we are very sure about that. In contrast, the red gaussian also believes that x=23, but we are much less sure about that. Our believe that x=23 is lower, and so our belief about the likely possible values for x is spread out - we think it is quite likely that x=2 or x=8, for example. The blue gaussian has almost completely eliminated 22 or 24 as possible value - their probably is almost 0.0, whereas the red curve considers them nearly as likely as 23.\n",
"\n",
"If we think back to the thermometer, we can consider these three curves as representing 3 thermometers. The blue curve represents a very accurate thermometer, and the red one represents a fairly inaccurate one. Green of course represents one in between the two others. Note the very powerful property the Gaussian distribution affords us - we can entirely represent both the reading and the error of a thermometer with only two numbers - the mean and the variance.\n",
"\n",
"The standard notation for a normal distribution is just $N(\\mu,\\sigma^2)$. I will not go into detail as to why $\\sigma^2$ is used, other than to note that $\\sigma$ is commonly called the *standard deviation*, which has enormous utility in statistics. The standard deviation is not really used in this book, so I will not address it further. The important thing to understand is that the variance ($\\sigma^2$) is a measure of the width of the curve. The curve above is notated as $N(23, 1)$, since $\\mu=23$ and $\\sigma=1$. We will use this notiation throughout the rest of the book, so learn it now.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Computational Properties of the Gaussian\n",
"\n",
"Recall how our histogram filter worked. We had a vector (Python array) representing our belief at a certain moment in time. When we performed another measurement using the *sense()* function we had to multiply probabilities together, and when we performed the motion step using the *update()* function we had to shift and add probabilities. I've promised you that the Kalman filter uses essentially the same process, and that it uses Gaussians instead of histograms, so you might reasonable expect that we will be multipling, adding, and shifting Gaussians in the Kalman filter.\n",
"\n",
"A typical math book would directly launch into a multipage proof of the behavior of Gaussians under these operations, but I don't see the value in that unless you plan to do statistics. I think the math will be much more intuitive and clear if we just start developing a Kalman filter using Gaussians, and I will provide the equations for multiplying and shifting Gaussians at the appropriate time. You will then be able to develop a physical intuition for what these operations do, rather than be forced to digest a lot of fairly abstract math.\n",
"\n",
"The key point, which I will only assert for now, is that all the operations are very simple, and that they preserve the properties of the Gaussian. This is somewhat remarkable, in that the Gaussian is a nonlinear function, and typically if you multiply a nonlinear equation with itself you end up with a different equation. For example, the shape of $sin(x)sin(x)$ is very different from $sin(x)$. But the result of multiplying two Gaussians is yet another Gaussian. This is a fundamental discovery, and the key reason why Kalman filters are possible\n",
"\n",
"\n",
"#### Summary and Key Points"
]
}
],
"metadata": {}
}
]
}
+1106 -1114
View File
File diff suppressed because it is too large. Load diff
+3 -2
View File
@@ -9,13 +9,14 @@ import math
import matplotlib.pyplot as plt
import noise
import numba
import numpy.random as random
class KalmanFilter1D(object):
def __init__ (self, x0, var):
self.mean = x0
self.variance = var
@jit
def estimate(self, z, z_variance):
self.mean = (self.variance*z + z_variance*self.mean) / (self.variance + z_variance)
self.variance = 1. / (1./self.variance + 1./z_variance)
@@ -132,4 +133,4 @@ if __name__ == "__main__":
if 1:
plt.figure()
_test_sin()
_test_sin()
+480 -478
View File
@@ -1,479 +1,481 @@
{
"metadata": {
"name": ""
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Multidimensional Kalman Filters\n",
"\n",
"The techniques in the last chapter are very powerful, but they only work in one dimension. The gaussians represent a mean and variance that are scalars - real numbers. They provide no way to represent multidimensional data, such as the position of a dog in a field. You may retort that you could use two Kalman filters for that case, one tracks the x coordinate and the other tracks the y coordinate. That does work in some cases, but put that thought aside, because soon you will see some enormous benefits to implementing the multidimensional case.\n",
"\n",
"\n",
"## Multivariate Normal Distributions\n",
"\n",
"What might a multivariate (meaning multidimensional) normal distribution look like? Our goal is to be able to represent a normal distribution across multiple dimensions. Consider the 2 dimensional case. Let's say we believe that x = 2 and y = 7. Therefore we can see that for N dimensions, we need N means, like so:\n",
"$$ \\mu = \\begin{bmatrix}{\\mu}_1\\\\{\\mu}_2\\\\ \\vdots \\\\{\\mu}_n\\end{bmatrix} \n",
"$$\n",
"\n",
"Therefore for this example we would have\n",
"$$\n",
"\\mu = \\begin{bmatrix}2\\\\7\\end{bmatrix} \n",
"$$\n",
"\n",
"The next step is representing our variances. At first blush we might think we would also need N variances for N dimensions. We might want to say the variance for x is 10 and the variance for y is 8. While this is possible, it does not consider the more general case. For example, suppose we were tracking house prices vs total $m^2$ of the floor plan. These numbers are *correlated*. It is not an exact correlation, but in general houses in the same neighborhood are more expensive if they have a larger floor plan. We want a way to express not only what we think the variance is in the price and the $m^2$, but also the degree to which they are correlated. It turns out that we use a matrix to denote this:\n",
"\n",
"$$\n",
"\\Sigma = \\begin{pmatrix}\n",
" {\\sigma}_{1,1} & {\\sigma}_{1,2} & \\cdots & {\\sigma}_{1,n} \\\\\n",
" {\\sigma}_{2,1} &{\\sigma}_{2,2} & \\cdots & {\\sigma}_{2,n} \\\\\n",
" \\vdots & \\vdots & \\ddots & \\vdots \\\\\n",
" {\\sigma}_{n,1} & {\\sigma}_{n,2} & \\cdots & {\\sigma}_{n,n}\n",
" \\end{pmatrix}\n",
"$$\n",
"\n",
"This is called the covariance matrix, and is probably a bit confusing at the moment. Rather than explain the math in detail at the moment, we will take our usual tactic of building our intuition first with various physical models. \n",
"\n",
"So here is the full equation for the multivarate normal distribution.\n",
"\n",
"$$\\mathcal{N}(\\mu,\\,\\Sigma) = (2\\pi)^{-\\frac{n}{2}}|\\Sigma|^{-\\frac{1}{2}}\\, e^{ -\\frac{1}{2}(\\mathbf{x}-\\mu)'\\Sigma^{-1}(\\mathbf{x}-\\mu) }$$\n",
"\n",
"I urge you to not try to remember this function. We will program it once in a function and then call it when we need to compute a specific value. However, if you look at it briefly you will note that it looks quite similar to the univarate normal distribution except it uses matrices instead of scalar values. If you are reasonably well-versed in linear algebra this equation should look quite managable; if not, don't worry, the python is coming up next!\n"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import numpy as np\n",
"import math\n",
"def multivariate_gaussian(x, mu, cov):\n",
" n = len(x)\n",
" det = np.sqrt(np.prod(np.diag(cov)))\n",
" frac = (2*math.pi)**(-n/2.) * (1./det)\n",
" fprime = (x - mu)**2\n",
" return frac * np.exp(-0.5*np.dot(fprime, 1./np.diag(cov)))\n"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 29
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's use it to compute a few values just to make sure we know how to call and use the function, and then move on to more interesting things.\n",
"\n",
"First, let's find the probability for our dog being at (2.5, 7.3) if we believe he is at (2,7) with a variance of 8 for x and a variance of 10 for y. This function requires us to pass everything in as numpy arrays (we will soon provide a more robust version that works with numpy matrices, numpy arrays, and/or scalars in any combinations. That code contains a lot of boilerplate which obscures the algorithm).\n",
"\n",
"So we set x to (2.5,7.3)"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"x = np.array([2.5, 7.3])"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 30
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Next, we set the mean of our belief:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"mu = np.array([2,7])"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 31
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Finally, we have to define our covariance matrix. In the problem statement we did not mention any correlation between x and y, and we will assume there is none. This makes sense; a dog can choose to independently wander in either the x direction or y direction without affecting the other. If there is no correlation between the values you just fill in the diagonal of the covariance matrix with the variances:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"cov = np.array([[8.,0],[0,10.]])"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 32
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now just call the function"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print multivariate_gaussian(x,mu,cov)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"0.0174395374407\n"
]
}
],
"prompt_number": 33
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's check the probability for the dog being at exactly (2,7)"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"x = np.array([2,7])\n",
"print multivariate_gaussian(x,mu,cov)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"0.0177940635854\n"
]
}
],
"prompt_number": 34
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"These numbers are not easy to interpret. Let's plot this in 3D, with the z coordinate being the probability."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from mpl_toolkits.mplot3d import Axes3D\n",
"pylab.rcParams['figure.figsize'] = 12,6\n",
"\n",
"xs, ys = arange(-8, 13, .75), arange(-8, 20, .75)\n",
"xv, yv = meshgrid (xs, ys)\n",
"\n",
"zs = np.array([multivariate_gaussian(np.array([x,y]),mu,cov) \n",
" for x,y in zip(np.ravel(xv), np.ravel(yv))])\n",
"zv = zs.reshape(xv.shape)\n",
"\n",
"ax = plt.figure().add_subplot(111, projection='3d')\n",
"ax.plot_wireframe(xv, yv, zv)\n",
"show()\n",
"pylab.rcParams['figure.figsize'] = 6,4"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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 truncated
"text": [
"<matplotlib.figure.Figure at 0x4068f50>"
]
}
],
"prompt_number": 35
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The result is clearly a 3D bell shaped curve. We can see that the gaussian is centered around (2,7), and that the probability quickly drops away in all directions.\n",
"\n",
"As beautiful as this is, it is perhaps a bit hard to get useful information. For example, it is not easy to tell if x and y both have the same variance or not. So for most of the rest of this book we will display multidimensional gaussian using contour plots. I will use some helper functions in gaussian.py to plot them. If you are interested in linear algebra go ahead and look at the code used to produce these contours, otherwise feel free to ignore it."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import gaussian as g\n",
"pylab.rcParams['figure.figsize'] = 12,4\n",
"\n",
"cov = array([[2,0],[0,2]])\n",
"e = g.sigma_ellipse (cov, 2, 7)\n",
"subplot(131)\n",
"g.plot_sigma_ellipse(e, '|2 0|\\n|0 2|')\n",
"\n",
"\n",
"cov = array([[2,0],[0,9]])\n",
"e = g.sigma_ellipse (cov, 2, 7)\n",
"subplot(132)\n",
"g.plot_sigma_ellipse(e, '|2 0|\\n|0 9|')\n",
"\n",
"subplot(133)\n",
"cov = array([[2,3],[1,2]])\n",
"e = g.sigma_ellipse (cov, 2, 7)\n",
"g.plot_sigma_ellipse(e,'|2 3|\\n|1 2|')\n",
"show()\n",
"pylab.rcParams['figure.figsize'] = 6,4"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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 truncated
"text": [
"<matplotlib.figure.Figure at 0x4054b90>"
]
}
],
"prompt_number": 36
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"From a mathematical perspective these display the values that the multivariate gaussian takes for a specific sigma (in this case $\\sigma^2=1$. Think of it as taking a horizontal slice through the 3D surface plot we did above. However, thinking about the physical interpretation of these plots clarifies their meaning.\n",
"\n",
"The first plot uses mean and the covariance matrices $\n",
"\\mu =\\begin{bmatrix}2\\\\7\\end{bmatrix}, cov = \\begin{bmatrix}2&0\\\\0&2\\end{bmatrix}$. Let this be our current belief about the position of our dog in a field. In other words, we believe that he is positioned at (2,7) with a variance of $\\sigma^2=2$ for both x and y. The contour plot shows where we believe the dog is located with the '+' in the center of the ellipse. The ellipse shows the boundary for the $1\\sigma^2$ probability - points where the dog is quite likely to be based on our current knowledge. Of course, the dog might be very far from this point, as Gaussians allow the mean to be any value. For example, the dog could be at (3234.76,189989.62), but that has vanishing low probability of being true. Generally speaking displaying the $1\\sigma^2$ to $2\\sigma^2$ contour captures the most likely values for the distribution. An equivelent way of thinking about this is the circle/ellipse shows us the amount of error in our belief. A tiny circle would indicate that we have a very small error, and a very large circle indicates a lot of error in our belief. We will use this throughout the rest of the book to display and evaluate the accuracy of our filters at any point in time. \n",
"\n",
"The second plot uses mean and the covariance matrices $\n",
"\\mu =\\begin{bmatrix}2\\\\7\\end{bmatrix}, cov = \\begin{bmatrix}2&0\\\\0&9\\end{bmatrix}$. This time we use a different variance for x (2) vs y (9). The result is an ellipse. When we look at it we can immediately tell that we have a lot more uncertainty in the y value vs the x value. Our belief that the value is (2,7) is the same in both cases, but errors are different. This sort of thing happens naturally as we track objects in the world - one sensor has a better view of the object, or is closer, than another sensor, and so we end up with different error rates in the different axis.\n",
"\n",
"\n",
"The third plot uses mean and the covariance matrices $\n",
"\\mu =\\begin{bmatrix}2\\\\7\\end{bmatrix}, cov = \\begin{bmatrix}2&3\\\\1&2\\end{bmatrix}$. This is the first contour that has values in the off-diagonal elements of $cov$, and this is the first contour plot with a slanted ellipse. This is not a coincidence. The two facts are telling use the same thing. A slanted ellipse tells us that the x and y values are somehow **correlated**. We denote that in the covariance matrix with values off the diagonal. What does this mean in physical terms? Think of trying to park your car in a parking spot. You can not pull up beside the spot and then move sideways into the space because most cars cannot go purely sideways. $x$ and $y$ are not independent. This is a consequence of the steering system in a car. When your tires are turned the car rotates around its rear axle while moving forward. Or think of a horse attached to a pivoting exercise bar in a corral. The horse can only walk in circles, he cannot vary $x$ and $y$ independently, which means he cannot walk straight forward to to the side. If $x$ changes, $y$ must also change in a defined way. \n",
"\n",
"So when we see this ellipse we know that $x$ and $y$ are correlated, and that the correlation is \"strong\". I will not prove it here, but a 45 $^{\\circ}$ angle denotes complete correlation between $x$ and $y$, whereas $0$ and $90$ denote no correlation at all. Those who are familiar with this math will be objecting quite strongly, as this is actually quite sloppy language that does not adress all of the mathematical issues. They are right, but for now this is a good first approximation to understanding these ellipses from a physical interpretation point of view. The size of the ellipse shows how much error we have in each axis, and the slant shows how strongly correlated the values are.\n",
"\n",
"\n",
"\n",
"\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"###Kalman Filter Basics\n",
"\n",
"Let's say we are tracking an aircraft and we get the following data for the $x$ coordinate at time $t$=1,2, and 3 seconds. What does your intuition tell you the value of $x$ will be at time $t$=4 seconds?\n"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"scatter ([1,2,3],[1,2,3]);xlim([0,4]);ylim([0,4]);show()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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 truncated
"text": [
"<matplotlib.figure.Figure at 0x404e910>"
]
}
],
"prompt_number": 37
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"It appears that the aircraft is flying in a straight line because we can draw a line between the three points, and we know that aircraft cannot turn on a dime. The most reasonable guess is that $x$=4 at $t$=4. I will depict that below with a green square to depict the predictions."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"scatter ([1,2,3],[1,2,3]);xlim([0,5]);ylim([0,5])\n",
"plot([0,5],[0,5],'r')\n",
"scatter ([4], [4], c='g', marker='s',s=200)\n",
"show()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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 truncated
"text": [
"<matplotlib.figure.Figure at 0x407b310>"
]
}
],
"prompt_number": 38
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"If this is data from a Kalman filter, then each point has both a mean and variance. Let's try to show that by showing the approximate error for each point. Don't worry about why I am using a covariance matrix to depict the variance at this point, it will become clear in a few paragraphs. The intent at this point is to show that while we have$x$=1,2,3 that there is a lot of error associated with each measurement."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"cov = array([[0.003,0], [0,12]])\n",
"sigma = sigma=[0.5,1.,1.5,2]\n",
"e1 = g.sigma_ellipses(cov, x=1, y=1, sigma=sigma)\n",
"e2 = g.sigma_ellipses(cov, x=2, y=2, sigma=sigma)\n",
"e3 = g.sigma_ellipses(cov, x=3, y=3, sigma=sigma)\n",
"g.plot_sigma_ellipses([e1, e2, e3], axis_equal=True,x_lim=[0,4],y_lim=[0,15])\n",
"plt.ylim([0,11])\n",
"show()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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 truncated
"text": [
"<matplotlib.figure.Figure at 0x3f8d690>"
]
}
],
"prompt_number": 39
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can see that there is a lot of error associated with each value of $x$. We could write a 1D Kalman filter as we did in the last chapter, but suppose this is the output of that filter, and not just raw sensor measurements. Are we out of luck?\n",
"\n",
"Let us think about how we predicted that $x$=4 at $t$=4. In one sense we just drew a straight line between the points and saw where it lay at $t$=4. My constant refrain: what is the physical interpretation of that? What is the difference in $x$ over time? What is $\\frac{\\partial x}{\\partial t}$? The derivative, or difference in distance over time is *velocity*. \n",
"\n",
"This is the **key point** in Kalman filters, so read carefully! Our sensor is only detecting the position of the aircraft (how doesn't matter). It does not have any kind of sensor that provides velocity to us. But based on the position estimates we can compute velocity. In Kalman filters we would call the velocity an **unobserved variable**. Unobserved means what it sounds like - there is no sensor that is measuring velocity directly. Since the velocity is based on the position, and the position has error, the velocity will have error as well. What happens if we draw the velocity errors over the positions errors?"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from matplotlib.patches import Ellipse\n",
"\n",
"cov = array([[1,1],[1,1.1]])\n",
"ev = g.sigma_ellipses(cov, x=2, y=2, sigma=sigma)\n",
"\n",
"isct = Ellipse(xy=(2,2), width=.2, height=1.2, edgecolor='r', fc='None', lw=4)\n",
"plt.figure().gca().add_artist(isct)\n",
"g.plot_sigma_ellipses([e1, e2, e3, ev], axis_equal=True,x_lim=[0,4],y_lim=[0,15])\n",
"plt.ylim([0,11])\n",
"plt.show()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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 truncated
"text": [
"<matplotlib.figure.Figure at 0x40514d0>"
]
}
],
"prompt_number": 40
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Think about what this plot means. We have a lot of error in our position estimates. We therefore have a lot of error in our velocity estimates. But look at the intersections between the velocity and the positions. Take the intersection at $t$=2. The intersection between the velocity and the position is where our aircraft is most likely to be, which I have roughly depicted with a red ellipse ('roughly' because I set the size via eyeball, not via math). The size of the error is much smaller than the error of the positions, despite the fact that velocity was derived from position. \n",
"\n",
"What makes this possible? Imagine for a moment that we superimposed the velocity from a *different* airplane over the position graph. Cleary the two are not related, and there is no way that combining the two could possibly yield any additional information. In contrast, the velocity of the this airplane tells us something very important - the direction and speed of travel. So long as the aircraft does not alter its velocity the velocity allows us to predict where the next position is. After a relatively small amount of error in velocity the probability that it is a good match with the position is very small. Think about it - if you suddenly change direction your position is also going to change a lot. If the position measurement is not in the direction of the assumed velocity change it is very unlikely to be true. The two are correlated, so if the velocity changes so must the position, and in a predictable way. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Kalman Filter Algorithm\n",
"So in general terms we can show how a multidimensional Kalman filter works. In the example above, we compute velocity from the previous position measurements using something called the **measurement function**. Then we predict the next position by using the current estimate and something called the **state transition function**. In our example above, *new_position = old_position + velocity&ast;time*. Next, we take the measurement from the sensor, and compare it to the prediction we just made. In a world with perfect sensors and perfect airplanes the prediction will always match the measured value. In the real world they will always be at least slightly different. We call the difference between the two the **residual**. Finally, we use something called the **Kalman gain** to update our estimate to be somewhere between the measured position and the predicted position. I will not describe how the gain is set, but suppose we had perfect confidence in our measurement - no error is possible. Then, clearly, we would set the gain so that 100% of the position came from the measurement, and 0% from the prediction. At the other extreme, if he have no confidence at all in the sensor (maybe it reported a hardware fault), we would set the gain so that 100% of the position came from the prediction, and 0% from the measurement. In normal cases, we will take a ratio of the two: maybe 53% of the measurement, and 47% of the prediction. The gain is updated on every cycle based on the variance of the variables (in a way yet to be explained). It should be clear that if the variance of the measurement is low, and the variance of the prediction is high we will favor the measurement, and vice versa. \n",
"\n",
"The chart shows a prior estimate of $x=1$ and $\\dot{x}=1$ ($\\dot{x}$ is the shorthand for the derivative of x, which is velocity). Therefore we predict $\\hat{x}=2$. However, the new measurement $x^{'}=1.3$, giving a residual $r=0.7$. Finally, Kalman filter gain $k$ gives us a new estimate of $\\hat{x^{'}}=1.8$.\n",
"\n",
"** CHECK SYMBOLOGY!!!!**"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from mkf_internal import *\n",
"show_residual_chart()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAW8AAAEKCAYAAADdBdT9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XlcVGX7P/DPsBkICoqCIALuLM4wQAouiLmgFsbjlpgE\n4m6mPtmTS5roo2ilmeaS+i13s5+Uj1gu5AKKhlaiqBSiMQJqiooim2zX748TR4YdBWYOXO/Xa15y\n5mzXmfFcc899rnOPjIgIjDHGJEVH0wEwxhirOU7ejDEmQZy8GWNMgjh5M8aYBHHyZowxCeLkzRhj\nEsTJW4vY2dnhxIkTmg6jQs7Ozjh9+jQAICQkBAEBARqO6MXZ2dnh5MmTAIDQ0FBMmjTphbZT8jXR\nZpGRkbCxsdF0GKwWcfKuZaUT8L59+9CiRQucOXOmynVlMhlkMlldhlct3t7eMDQ0hImJifg4f/48\nrl69Ci8vLwBQi1OlUkFHRwdFRUW1FkPxNov3b29vj08++aTWtl8y/gULFmDr1q1VrhMUFIRFixap\nPVfyNalN5X2Qb9++HX369Kn1fZX2svvJy8vDnDlzYGNjI753//73v8X5JT842YvT03QADU3JBLxj\nxw7MmTMHhw8fhoeHh4Yjqz6ZTIYNGzYgODi4wmXKu7frRe/3KigogJ5e+f8Vnzx5Ah0dHcTExKB/\n//5wcXGBj49PtdeXKm35IH8RK1aswMWLF/Hrr7/C0tISt27dUvt2IpPJXvj/CnuOW951gIiwefNm\nfPDBB4iIiBAT982bN/Haa6/B3NwcrVq1wrhx4/DkyZNytxESEoJRo0YhICAAzZo1g1wuR2JiIlas\nWAELCwvY2tri559/Fpfftm0bHB0d0axZM3To0AFbtmwR50VGRqJt27b4/PPPYWFhASsrK2zfvr3G\nx1W6xVScXIpbnqampmIrHQC++eYbODo6okWLFhg8eDCSk5PFdXV0dLBx40Z06tQJXbp0qXLfHh4e\ncHJywrVr18Tj+fTTT9GmTRtMmDABRISVK1eiY8eOMDc3x1tvvYX09HRx/V27dsHW1hbm5uYIDQ1V\n23bpLqDo6Gj07NkTZmZmaNeuHXbs2IGtW7di7969+PTTT2FiYoI333xTfE2KW8jPnj3D7NmzYW1t\nDWtra/z73/9GXl4egNp7D4oVfzPZunUrrK2tYWVlhdWrV4vzc3JyEBQUhBYtWsDJyQm//vqr2vrF\nr1WzZs3g5OSE//3vfwCAP/74A9OmTcMvv/wCExMTtGjRQjy2Dz74ALa2trC0tMS0adOQm5tbbmy/\n/fYb/Pz8YGlpCQCwtbUVX9+AgAAkJyfD19cXJiYmWLVqFQAgJiZGfM1dXFwQFRUlbs/b2xvz589H\njx490Lx5c/j5+am9t40WsVplZ2dHw4cPJwsLC4qLi1Obd+PGDTp+/Djl5eVRWloaeXl50ezZs9XW\nPXHiBBERLV68mF555RWKiIiggoICeuedd8jW1pZCQ0OpoKCAtm7dSvb29uK6P/30E/31119ERBQV\nFUVGRkZ08eJFIiI6deoU6enp0eLFi6mgoIAOHz5MRkZG9Pjx43KPwdvbm/7v//6v3GMrGd+4ceOI\niEilUpFMJqPCwkJx2f/973/UsWNH+vPPP6mwsJCWLVtGPXv2FOfLZDIaNGgQpaenU25ubpl9JSUl\nkUwmo4KCAioqKqLo6GgyMjKikydPisczb948ysvLo5ycHPriiy/I09OTbt++TXl5eTRlyhTy9/cn\nIqJr166RsbExnTlzhp49e0bvv/8+6enpiccSEhKidiwmJia0b98+KigooIcPH9KlS5eIiCgoKIgW\nLVpU4WuyaNEi8vT0pLS0NEpLS6OePXuKy9f0PSi53WLbtm2j3r17q70+Y8eOpezsbLpy5Qq1atWK\njh8/TkREc+fOJS8vL0pPT6eUlBRycnIiGxsbcVv79++nu3fvEhHRd999R02bNqW///6biIi2b98u\n7qfY7Nmz6c0336T09HR6+vQp+fr60vz588uNfdmyZdSuXTvauHEjxcXFUVFRUaXHlpqaSi1btqQj\nR44QEdHPP/9MLVu2pAcPHhARUd++fcna2pquXbtGWVlZNGLECPH9asw4edcyW1tbatasGfn5+ZX5\nT1vagQMHSKlUitOlk+OgQYPEeeHh4WRsbCxuMyMjg2QyGT158qTcbfv5+dHatWuJSEgchoaGasm1\ndevWdP78+XLX7du3LxkZGZGpqSmZmpqSm5tbufEVn0DFiaTk9gcPHkxff/21OF1YWEhGRkaUnJxM\nRELyPnXqVIWvTfE2TU1NyczMjBwcHOjLL78Uj8fAwICePXsmLu/g4KCWEO7cuUP6+vpUUFBAS5Ys\nERM5EVFWVhYZGBiUeyyhoaE0fPjwcmMKCgqihQsXqj1X8jXp0KGDmICIiI4dO0Z2dnZizDV5D6qb\n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 truncated
"text": [
"<matplotlib.figure.Figure at 0x4674f10>"
]
}
],
"prompt_number": 41
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 41
}
],
"metadata": {}
}
]
{
"metadata": {
"name": ""
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Multidimensional Kalman Filters\n",
"\n",
"The techniques in the last chapter are very powerful, but they only work in one dimension. The gaussians represent a mean and variance that are scalars - real numbers. They provide no way to represent multidimensional data, such as the position of a dog in a field. You may retort that you could use two Kalman filters for that case, one tracks the x coordinate and the other tracks the y coordinate. That does work in some cases, but put that thought aside, because soon you will see some enormous benefits to implementing the multidimensional case.\n",
"\n",
"\n",
"## Multivariate Normal Distributions\n",
"\n",
"What might a multivariate (meaning multidimensional) normal distribution look like? Our goal is to be able to represent a normal distribution across multiple dimensions. Consider the 2 dimensional case. Let's say we believe that x = 2 and y = 7. Therefore we can see that for N dimensions, we need N means, like so:\n",
"$$ \\mu = \\begin{bmatrix}{\\mu}_1\\\\{\\mu}_2\\\\ \\vdots \\\\{\\mu}_n\\end{bmatrix} \n",
"$$\n",
"\n",
"Therefore for this example we would have\n",
"$$\n",
"\\mu = \\begin{bmatrix}2\\\\7\\end{bmatrix} \n",
"$$\n",
"\n",
"The next step is representing our variances. At first blush we might think we would also need N variances for N dimensions. We might want to say the variance for x is 10 and the variance for y is 8. While this is possible, it does not consider the more general case. For example, suppose we were tracking house prices vs total $m^2$ of the floor plan. These numbers are *correlated*. It is not an exact correlation, but in general houses in the same neighborhood are more expensive if they have a larger floor plan. We want a way to express not only what we think the variance is in the price and the $m^2$, but also the degree to which they are correlated. It turns out that we use a matrix to denote this:\n",
"\n",
"$$\n",
"\\Sigma = \\begin{pmatrix}\n",
" {\\sigma}_{1,1} & {\\sigma}_{1,2} & \\cdots & {\\sigma}_{1,n} \\\\\n",
" {\\sigma}_{2,1} &{\\sigma}_{2,2} & \\cdots & {\\sigma}_{2,n} \\\\\n",
" \\vdots & \\vdots & \\ddots & \\vdots \\\\\n",
" {\\sigma}_{n,1} & {\\sigma}_{n,2} & \\cdots & {\\sigma}_{n,n}\n",
" \\end{pmatrix}\n",
"$$\n",
"\n",
"This is called the covariance matrix, and is probably a bit confusing at the moment. Rather than explain the math in detail at the moment, we will take our usual tactic of building our intuition first with various physical models. \n",
"\n",
"So here is the full equation for the multivarate normal distribution.\n",
"\n",
"$$\\mathcal{N}(\\mu,\\,\\Sigma) = (2\\pi)^{-\\frac{n}{2}}|\\Sigma|^{-\\frac{1}{2}}\\, e^{ -\\frac{1}{2}(\\mathbf{x}-\\mu)'\\Sigma^{-1}(\\mathbf{x}-\\mu) }$$\n",
"\n",
"I urge you to not try to remember this function. We will program it once in a function and then call it when we need to compute a specific value. However, if you look at it briefly you will note that it looks quite similar to the univarate normal distribution except it uses matrices instead of scalar values. If you are reasonably well-versed in linear algebra this equation should look quite managable; if not, don't worry, the python is coming up next!\n"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import numpy as np\n",
"import math\n",
"def multivariate_gaussian(x, mu, cov):\n",
" n = len(x)\n",
" det = np.sqrt(np.prod(np.diag(cov)))\n",
" frac = (2*math.pi)**(-n/2.) * (1./det)\n",
" fprime = (x - mu)**2\n",
" return frac * np.exp(-0.5*np.dot(fprime, 1./np.diag(cov)))\n"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 1
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's use it to compute a few values just to make sure we know how to call and use the function, and then move on to more interesting things.\n",
"\n",
"First, let's find the probability for our dog being at (2.5, 7.3) if we believe he is at (2,7) with a variance of 8 for x and a variance of 10 for y. This function requires us to pass everything in as numpy arrays (we will soon provide a more robust version that works with numpy matrices, numpy arrays, and/or scalars in any combinations. That code contains a lot of boilerplate which obscures the algorithm).\n",
"\n",
"So we set x to (2.5,7.3)"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"x = np.array([2.5, 7.3])"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Next, we set the mean of our belief:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"mu = np.array([2,7])"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 3
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Finally, we have to define our covariance matrix. In the problem statement we did not mention any correlation between x and y, and we will assume there is none. This makes sense; a dog can choose to independently wander in either the x direction or y direction without affecting the other. If there is no correlation between the values you just fill in the diagonal of the covariance matrix with the variances:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"cov = np.array([[8.,0],[0,10.]])"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 4
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now just call the function"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print multivariate_gaussian(x,mu,cov)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"0.0174395374407\n"
]
}
],
"prompt_number": 5
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's check the probability for the dog being at exactly (2,7)"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"x = np.array([2,7])\n",
"print multivariate_gaussian(x,mu,cov)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"0.0177940635854\n"
]
}
],
"prompt_number": 6
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"These numbers are not easy to interpret. Let's plot this in 3D, with the z coordinate being the probability."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%matplotlib inline\n",
"pylab.rcParams['figure.figsize'] = 12,6\n",
"\n",
"from mpl_toolkits.mplot3d import Axes3D\n",
"\n",
"xs, ys = arange(-8, 13, .75), arange(-8, 20, .75)\n",
"xv, yv = meshgrid (xs, ys)\n",
"\n",
"zs = np.array([multivariate_gaussian(np.array([x,y]),mu,cov) \n",
" for x,y in zip(np.ravel(xv), np.ravel(yv))])\n",
"zv = zs.reshape(xv.shape)\n",
"\n",
"ax = plt.figure().add_subplot(111, projection='3d')\n",
"ax.plot_wireframe(xv, yv, zv)\n",
"show()\n",
"pylab.rcParams['figure.figsize'] = 6,4"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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 truncated
"text": [
"<matplotlib.figure.Figure at 0x4cc43c8>"
]
}
],
"prompt_number": 7
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The result is clearly a 3D bell shaped curve. We can see that the gaussian is centered around (2,7), and that the probability quickly drops away in all directions.\n",
"\n",
"As beautiful as this is, it is perhaps a bit hard to get useful information. For example, it is not easy to tell if x and y both have the same variance or not. So for most of the rest of this book we will display multidimensional gaussian using contour plots. I will use some helper functions in gaussian.py to plot them. If you are interested in linear algebra go ahead and look at the code used to produce these contours, otherwise feel free to ignore it."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import gaussian as g\n",
"pylab.rcParams['figure.figsize'] = 12,4\n",
"\n",
"cov = array([[2,0],[0,2]])\n",
"e = g.sigma_ellipse (cov, 2, 7)\n",
"subplot(131)\n",
"g.plot_sigma_ellipse(e, '|2 0|\\n|0 2|')\n",
"\n",
"\n",
"cov = array([[2,0],[0,9]])\n",
"e = g.sigma_ellipse (cov, 2, 7)\n",
"subplot(132)\n",
"g.plot_sigma_ellipse(e, '|2 0|\\n|0 9|')\n",
"\n",
"subplot(133)\n",
"cov = array([[2,3],[1,2]])\n",
"e = g.sigma_ellipse (cov, 2, 7)\n",
"g.plot_sigma_ellipse(e,'|2 3|\\n|1 2|')\n",
"show()\n",
"pylab.rcParams['figure.figsize'] = 6,4"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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 truncated
"text": [
"<matplotlib.figure.Figure at 0x7e22438>"
]
}
],
"prompt_number": 8
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"From a mathematical perspective these display the values that the multivariate gaussian takes for a specific sigma (in this case $\\sigma^2=1$. Think of it as taking a horizontal slice through the 3D surface plot we did above. However, thinking about the physical interpretation of these plots clarifies their meaning.\n",
"\n",
"The first plot uses mean and the covariance matrices $\n",
"\\mu =\\begin{bmatrix}2\\\\7\\end{bmatrix}, cov = \\begin{bmatrix}2&0\\\\0&2\\end{bmatrix}$. Let this be our current belief about the position of our dog in a field. In other words, we believe that he is positioned at (2,7) with a variance of $\\sigma^2=2$ for both x and y. The contour plot shows where we believe the dog is located with the '+' in the center of the ellipse. The ellipse shows the boundary for the $1\\sigma^2$ probability - points where the dog is quite likely to be based on our current knowledge. Of course, the dog might be very far from this point, as Gaussians allow the mean to be any value. For example, the dog could be at (3234.76,189989.62), but that has vanishing low probability of being true. Generally speaking displaying the $1\\sigma^2$ to $2\\sigma^2$ contour captures the most likely values for the distribution. An equivelent way of thinking about this is the circle/ellipse shows us the amount of error in our belief. A tiny circle would indicate that we have a very small error, and a very large circle indicates a lot of error in our belief. We will use this throughout the rest of the book to display and evaluate the accuracy of our filters at any point in time. \n",
"\n",
"The second plot uses mean and the covariance matrices $\n",
"\\mu =\\begin{bmatrix}2\\\\7\\end{bmatrix}, cov = \\begin{bmatrix}2&0\\\\0&9\\end{bmatrix}$. This time we use a different variance for x (2) vs y (9). The result is an ellipse. When we look at it we can immediately tell that we have a lot more uncertainty in the y value vs the x value. Our belief that the value is (2,7) is the same in both cases, but errors are different. This sort of thing happens naturally as we track objects in the world - one sensor has a better view of the object, or is closer, than another sensor, and so we end up with different error rates in the different axis.\n",
"\n",
"\n",
"The third plot uses mean and the covariance matrices $\n",
"\\mu =\\begin{bmatrix}2\\\\7\\end{bmatrix}, cov = \\begin{bmatrix}2&3\\\\1&2\\end{bmatrix}$. This is the first contour that has values in the off-diagonal elements of $cov$, and this is the first contour plot with a slanted ellipse. This is not a coincidence. The two facts are telling use the same thing. A slanted ellipse tells us that the x and y values are somehow **correlated**. We denote that in the covariance matrix with values off the diagonal. What does this mean in physical terms? Think of trying to park your car in a parking spot. You can not pull up beside the spot and then move sideways into the space because most cars cannot go purely sideways. $x$ and $y$ are not independent. This is a consequence of the steering system in a car. When your tires are turned the car rotates around its rear axle while moving forward. Or think of a horse attached to a pivoting exercise bar in a corral. The horse can only walk in circles, he cannot vary $x$ and $y$ independently, which means he cannot walk straight forward to to the side. If $x$ changes, $y$ must also change in a defined way. \n",
"\n",
"So when we see this ellipse we know that $x$ and $y$ are correlated, and that the correlation is \"strong\". I will not prove it here, but a 45 $^{\\circ}$ angle denotes complete correlation between $x$ and $y$, whereas $0$ and $90$ denote no correlation at all. Those who are familiar with this math will be objecting quite strongly, as this is actually quite sloppy language that does not adress all of the mathematical issues. They are right, but for now this is a good first approximation to understanding these ellipses from a physical interpretation point of view. The size of the ellipse shows how much error we have in each axis, and the slant shows how strongly correlated the values are.\n",
"\n",
"\n",
"\n",
"\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"###Kalman Filter Basics\n",
"\n",
"Let's say we are tracking an aircraft and we get the following data for the $x$ coordinate at time $t$=1,2, and 3 seconds. What does your intuition tell you the value of $x$ will be at time $t$=4 seconds?\n"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"scatter ([1,2,3],[1,2,3]);xlim([0,4]);ylim([0,4]);show()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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 truncated
"text": [
"<matplotlib.figure.Figure at 0x7b7fef0>"
]
}
],
"prompt_number": 9
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"It appears that the aircraft is flying in a straight line because we can draw a line between the three points, and we know that aircraft cannot turn on a dime. The most reasonable guess is that $x$=4 at $t$=4. I will depict that below with a green square to depict the predictions."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"scatter ([1,2,3],[1,2,3]);xlim([0,5]);ylim([0,5])\n",
"plot([0,5],[0,5],'r')\n",
"scatter ([4], [4], c='g', marker='s',s=200)\n",
"show()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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 truncated
"text": [
"<matplotlib.figure.Figure at 0x8375f60>"
]
}
],
"prompt_number": 10
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"If this is data from a Kalman filter, then each point has both a mean and variance. Let's try to show that by showing the approximate error for each point. Don't worry about why I am using a covariance matrix to depict the variance at this point, it will become clear in a few paragraphs. The intent at this point is to show that while we have$x$=1,2,3 that there is a lot of error associated with each measurement."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"cov = array([[0.003,0], [0,12]])\n",
"sigma = sigma=[0.5,1.,1.5,2]\n",
"e1 = g.sigma_ellipses(cov, x=1, y=1, sigma=sigma)\n",
"e2 = g.sigma_ellipses(cov, x=2, y=2, sigma=sigma)\n",
"e3 = g.sigma_ellipses(cov, x=3, y=3, sigma=sigma)\n",
"g.plot_sigma_ellipses([e1, e2, e3], axis_equal=True,x_lim=[0,4],y_lim=[0,15])\n",
"plt.ylim([0,11])\n",
"show()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAXMAAAD7CAYAAACYLnSTAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJztnXmQXNV1/789M0K7NFpn0L7vSBoWCWP80xA2Q1BCjELA\nNmBjbCeV4EC5yi5SriC5sCKXndgidtlOUkWSMoWDSWEIqJQyywBGrEFik0AIaSSNNKN1NItGs7/f\nH5fDO+/2fd09PdPvvZn+fqqm5nX3m9atq+7vO+/cc8835XmeB0IIIYOakrgHQAghpP9QzAkhZAhA\nMSeEkCEAxZwQQoYAFHNCCBkCUMwJIWQIUFaoN169ejXefvvtQr09IYQMSVatWoVdu3b1+e8KFpm/\n/fbb8Dwv8T/3339/7GPgODlGjpPjlJ98g2CmWQghZAhAMSeEkCFA0Yt5dXV13EPICY5z4BgMYwQ4\nzoFmsIwzX1Ke5xWkN0sqlUKB3poQQoYs+Wpn0UfmhBAyFKCYE0LIEIBiTgghQwCKOSGEDAEo5oQQ\nMgSgmBNCyBCAYk4IIUMAijkhhAwBKOaEEDIEyCjmd955JyoqKnDBBRd8+tzp06dx9dVXY9GiRbjm\nmmtw5syZgg+SEEJIZjKK+Ve/+lVs37498NyWLVtw9dVXY+/evbjyyiuxZcuWgg6QEEJIdrL2Zqmt\nrcX69evx7rvvAgCWLFmCF154ARUVFWhoaEB1dTU++OCD9DdmbxZCCOkzkfVmOXbsGCoqKgAAFRUV\nOHbsWJ//UUIIIQNLvxZAU6kUUqnUQI2FEEJInvTZA1TSK5WVlaivr8fUqVNDz924ceOnx9XV1UO+\nnzAhxUZXF9DRAYwZE/dIBi81NTWoqanp9/v0OWf+ne98B5MmTcJ3v/tdbNmyBWfOnHEugjJnTsjQ\npqkJ+Oxngdpa4He/A666Ku4RDQ3y1c6MYn7rrbfihRdewMmTJ1FRUYHvf//7+NM//VPcfPPNOHTo\nEObMmYNHH30U5eXlAzYgQsjg4L77gIYG4NZbgb/6K2DvXqC0NO5RDX4KIub9gWJOyNClqwuYMQN4\n+WVg/nzg0kuB++8Hrr8+7pENfug0RAiJjJoaYO5cYMECIJUCbrkFePzxuEdV3FDMCSF95ve/Bz7/\nef/x+vXAtm0Ab8bjg2JOCOkzzz8PXHml/3j+fCPktbWxDanooZgTQvpEezuwezdw8cX+c6kUcPnl\nwB/+EN+4ih2KOSGkT7z9NrBoETByZPD5iy8G3nornjERijkhpI/s3AlceGH686tXA7t2RT8eYqCY\nE0L6xHvvAaor9qeImHMRNB4o5oSQPvHee8CKFenPT51qNg2x9148UMwJIX1izx5g6VL3a0uWAI6O\n2CQCKOaEkJxpbgbOngWmTXO/TjGPD4o5ISRn9u0zNeVhna8XLjTnkOihmBNCcmbfPiPYYcybB+zf\nH914iA/FnBCSM/v3m54sYcydCxw4EN14iA/FnBCSMwcPAnPmhL8ukTnLE6OHYk4IyZmDB4HZs8Nf\nnzAB6O01xhUkWijmhJCcySbmqRQwcyZw+HB0YyIGijkhJGcOHQJmzcp8DsU8HijmpKj47W+Byy4D\nnn467pEMPpqbTS583LjM51HM44FiToqGQ4eAv/xL4K67gDvuAE6ejHtEg4sjR4Dp08NrzAWKeTxQ\nzEnR8MtfGhG/807gxhuBX/0q7hENLkTMszFtGlBfX/jxkCAUc1IUeB7w8MPAV75iHn/lK8Cjj8Y5\nosHHkSPh2/g1559PMY8DijkpCqRfiLRu/cxnjOAcPBjfmAYbDQ1GqLNBMY8HijkpCp59FrjqKj/f\nW1oKrFsHvPhivOMaTDQ0AJWV2c+jmMcDxZwUBa+8YjwqNZdfDrz0UjzjGYwcOwZUVGQ/b+pU4NQp\noKen8GMiPhRzUhS8/jqwZk3wubVrgTffjGc8g5Fjx3KLzMvKgPJyI+gkOijmZMjT1GRu+5csCT6/\ncqXJpXd2xjOuwUZDQ26ROWCi8+PHCzseEoRiToY8778PLFtm8uSaUaPM1nSaKeTG8eNGpHOBYh49\nFHMy5AnzrATM87t3RzuewUhPD9DYCEyalNv5FPPooZiTIc/77wPLl7tfo81ZbjQ2AuPHm3x4LlDM\no4diToY8H30ELFrkfo1inhsnTgCTJ+d+/uTJbJcQNRRzMuT56CNgwQL3a4sXAx9+GO14BiMnTwJT\npuR+/qRJrGaJGoo5GdJ0dZmmT/PmuV+nM05u9DUyp5hHT95i/g//8A9Yvnw5LrjgAnzxi19ER0fH\nQI6LkAHh8GFTTjd8uPv1CRPMrtDGxmjHNdg4fTp98dPzgFtuMf3NbRNnplmiJy8xr62txb/+67/i\nrbfewrvvvouenh785je/GeixEdJvsnlWplLGhJiO8plxiflTT5kU1e23A9/7XvA1RubRk+PadJBx\n48Zh2LBhaGtrQ2lpKdra2jA9l96YhERMNpszwIh5bS1w8cWRDGlQcvo0MHFi8Ll//3fg7ruBL3zB\nROctLcDYsea1SZMYmUdNXpH5xIkT8e1vfxuzZs3CtGnTUF5ejquuumqgx0ZIv6mtzS7mNFPIji3m\nXV2medn69Wbr/qWXmsfCxIlMXUVNXpH5xx9/jJ/+9Keora3F+PHj8ed//ud4+OGH8aUvfSlw3saN\nGz89rq6uRnV1dX/GSkifOXTItLvNBMU8O7aY79xpLpJS4VJdbTpQ3nijeTxmDNDRYUR/2LDIhzuo\nqKmpQU1NTb/fJy8xf/PNN3HZZZdh0idJtC984QvYsWNHRjEn+dHeDvz858BFF5kvDOkbR44AM2Zk\nPmfmTOC116IZz2Dl9GmzWCy8/rppVCZcdhnwd3/nP06lTMTe2Jh7C4BixQ50N23alNf75JVmWbJk\nCV599VWcO3cOnufhmWeewbJly/IaAMnM3XcD27cDN98MvP123KMZfORidcbIPDtnzgTF/P/+zwQY\nwurVwDvvBNveTpjAVEuU5CXmq1atwu23346LL74YK1euBAB84xvfGNCBEZPvffxx4LHHgPvuAzZv\njntEg49cxHzaNODo0WjGM1g5c8ZE2sL77/uuTYB5bfLkYFVQebn5OxINKc8rzHaJVCqFAr110fDA\nA6Z1689/btq4zpwJ1NUB48bFPbLBQVubyfOeO5fZUb693fQdaW/P7jxfrEycCOzbZ3739prP4JEj\nZt6E664D/vqvgRtuMI+vvRa4917g85+PZ8yDlXy1kztAE8z//A9w003mePx444yzfXu8YxpM1Ncb\nC7NsAj1ihFmwY120m95eoLnZDyKOHjXzpYUcMH1u9uzxHzMyjxaKeUJpbDRfjM9+1n/ummuA556L\nb0yDjVw9KwEj+ky1uGltNb3fpWPivn3AwoXp5y1caF4Txo83d5QkGijmCeXVV80mFr0NnZ6VfSNX\nz0qAJsSZsPPlH38MzJ+ffp70uREo5tFCMU8odukXYCoGDh7kFyRX+hKZV1Sw/3YYTU3BdZraWneL\nBIp5vFDME8qbbwKXXBJ8rqzMOOO88048Yxps9CUyp5lCOM3Nwfx42K7aWbPMAn1vr3lMMY8WinlC\nefddYNWq9OdXrwZ27Yp+PIMRivnAoBc/AbOr1iXmI0YYAZd5pJhHC8U8gTQ3m/7Rc+emv7ZypRF6\nkp2+GCpMmWLmnKRji3ldXfiuWr0Bi2IeLRTzBLJ7tynzKnH87yxZQmecXDlxIncxZ2QejhZzzzNV\nP2EbsWQvBGA6KDY3RzNGQjFPJB9+aETbBT0rc6cv7jhTplDMw9Bifvq0qbAaPdp9rq4KGjvWtMUl\n0UAxTyBhdbyA+bKcO8eeF7nQlzQLzRTC0WJeX2/aH4RBMY8PinkCyWRAnEqZGl8642Smt9dc8Gx3\nnDAmT6aYh9HcbHZ8AtnLPSsr/c1XFPNooZgnkH37wsUcSK/nJemcOWNSAWVWk+edO43Nmd52DpjF\nurNnTf9tEqS11XcQylYhVFlpzgEo5lFDMU8gBw+6K1kEelZmx+VZ2dMD/MVfAJ2dwK23msU8oaTE\n7HI8fTracQ4GbDHPFJnrzVdjxpiUoNSdk8JCMU8YZ8+aL0+mhv7z5gEHDkQ3psGIy7PymWdMBP7I\nI8YF59VXg68z1eKmtdVPsxw/nnkdYupUv8SzpMT0dGltLfwYCcU8cRw8aHbSZer0N3Om2bhBwnGJ\n+RNPGJOPVArYsAH43e+Cr0+cyMjcRUuLL+bZyj3tEs8xYyjmUUExTxhhu+s0dMbJjkvMn3sOuPpq\nc3zVVYBtu0hnHDc6zZJNzEePNmmVs2f9x3JMCgvFPGFk2l0nUMyzc+pUUMwbG42ZgrjjrFljdtKe\nO+efQzF3o9MsJ09mr93X6aoxYyjmUUExTxi52JxNnGgW8VgpEE5jY7pnZVUVUFpqHo8cCSxaBLz3\nnn8OxdyNLebZyj11zf7o0UyzRAXFPGHkIuaplIneaaYQTlNTsAe3q3GZ3bSMYu7m7Fl/x6erSshm\n8mQj+gAj8yihmCeMXMQcoJlCNlwGxMuXB89ZvjxYb04xd3P2rKlK6e0182qvRdjoyJwLoNFBMU8Y\nR49m3i4t0OYsM7aYf/BBer+bxYuDfW7oWZlOV5cR8fPOMztBXRuxbPRFkWmW6KCYJ4yGBiPU2WBk\nnhlbzF39bhYvDnagZMvWdNrajCCnUibFotchwrDFvK2tsGMkBop5gujpyb05VGUlxTwTWsxbWsyP\nfccze7apHurpMY8p5ulIigUwc5qLmJeX+2I+ahTFPCoo5gni1CnzRRg2LPu555/v98Ag6TQ1+VZn\nYnNmb8QaMcJscpH+2+PHs/+2jV78tO92wtCROcU8OijmCaKhgTZnA4X2rQzzrASMMbG0RmLine truncated
"text": [
"<matplotlib.figure.Figure at 0x80f0b38>"
]
}
],
"prompt_number": 11
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can see that there is a lot of error associated with each value of $x$. We could write a 1D Kalman filter as we did in the last chapter, but suppose this is the output of that filter, and not just raw sensor measurements. Are we out of luck?\n",
"\n",
"Let us think about how we predicted that $x$=4 at $t$=4. In one sense we just drew a straight line between the points and saw where it lay at $t$=4. My constant refrain: what is the physical interpretation of that? What is the difference in $x$ over time? What is $\\frac{\\partial x}{\\partial t}$? The derivative, or difference in distance over time is *velocity*. \n",
"\n",
"This is the **key point** in Kalman filters, so read carefully! Our sensor is only detecting the position of the aircraft (how doesn't matter). It does not have any kind of sensor that provides velocity to us. But based on the position estimates we can compute velocity. In Kalman filters we would call the velocity an **unobserved variable**. Unobserved means what it sounds like - there is no sensor that is measuring velocity directly. Since the velocity is based on the position, and the position has error, the velocity will have error as well. What happens if we draw the velocity errors over the positions errors?"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from matplotlib.patches import Ellipse\n",
"\n",
"cov = array([[1,1],[1,1.1]])\n",
"ev = g.sigma_ellipses(cov, x=2, y=2, sigma=sigma)\n",
"\n",
"isct = Ellipse(xy=(2,2), width=.2, height=1.2, edgecolor='r', fc='None', lw=4)\n",
"plt.figure().gca().add_artist(isct)\n",
"g.plot_sigma_ellipses([e1, e2, e3, ev], axis_equal=True,x_lim=[0,4],y_lim=[0,15])\n",
"plt.ylim([0,11])\n",
"plt.show()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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 truncated
"text": [
"<matplotlib.figure.Figure at 0x7e146d8>"
]
}
],
"prompt_number": 12
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Think about what this plot means. We have a lot of error in our position estimates. We therefore have a lot of error in our velocity estimates. But look at the intersections between the velocity and the positions. Take the intersection at $t$=2. The intersection between the velocity and the position is where our aircraft is most likely to be, which I have roughly depicted with a red ellipse ('roughly' because I set the size via eyeball, not via math). The size of the error is much smaller than the error of the positions, despite the fact that velocity was derived from position. \n",
"\n",
"What makes this possible? Imagine for a moment that we superimposed the velocity from a *different* airplane over the position graph. Cleary the two are not related, and there is no way that combining the two could possibly yield any additional information. In contrast, the velocity of the this airplane tells us something very important - the direction and speed of travel. So long as the aircraft does not alter its velocity the velocity allows us to predict where the next position is. After a relatively small amount of error in velocity the probability that it is a good match with the position is very small. Think about it - if you suddenly change direction your position is also going to change a lot. If the position measurement is not in the direction of the assumed velocity change it is very unlikely to be true. The two are correlated, so if the velocity changes so must the position, and in a predictable way. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Kalman Filter Algorithm\n",
"So in general terms we can show how a multidimensional Kalman filter works. In the example above, we compute velocity from the previous position measurements using something called the **measurement function**. Then we predict the next position by using the current estimate and something called the **state transition function**. In our example above, *new_position = old_position + velocity&ast;time*. Next, we take the measurement from the sensor, and compare it to the prediction we just made. In a world with perfect sensors and perfect airplanes the prediction will always match the measured value. In the real world they will always be at least slightly different. We call the difference between the two the **residual**. Finally, we use something called the **Kalman gain** to update our estimate to be somewhere between the measured position and the predicted position. I will not describe how the gain is set, but suppose we had perfect confidence in our measurement - no error is possible. Then, clearly, we would set the gain so that 100% of the position came from the measurement, and 0% from the prediction. At the other extreme, if he have no confidence at all in the sensor (maybe it reported a hardware fault), we would set the gain so that 100% of the position came from the prediction, and 0% from the measurement. In normal cases, we will take a ratio of the two: maybe 53% of the measurement, and 47% of the prediction. The gain is updated on every cycle based on the variance of the variables (in a way yet to be explained). It should be clear that if the variance of the measurement is low, and the variance of the prediction is high we will favor the measurement, and vice versa. \n",
"\n",
"The chart shows a prior estimate of $x=1$ and $\\dot{x}=1$ ($\\dot{x}$ is the shorthand for the derivative of x, which is velocity). Therefore we predict $\\hat{x}=2$. However, the new measurement $x^{'}=1.3$, giving a residual $r=0.7$. Finally, Kalman filter gain $k$ gives us a new estimate of $\\hat{x^{'}}=1.8$.\n",
"\n",
"** CHECK SYMBOLOGY!!!!**"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from mkf_internal import *\n",
"show_residual_chart()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAW8AAAEKCAYAAADdBdT9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XlcVGX7P/DPsBkICoqCIALuLM4wQAouiLmgFsbjlpgE\n4m6mPtmTS5roo2ilmeaS+i13s5+Uj1gu5AKKhlaiqBSiMQJqiooim2zX748TR4YdBWYOXO/Xa15y\n5mzXmfFcc899rnOPjIgIjDHGJEVH0wEwxhirOU7ejDEmQZy8GWNMgjh5M8aYBHHyZowxCeLkzRhj\nEsTJW4vY2dnhxIkTmg6jQs7Ozjh9+jQAICQkBAEBARqO6MXZ2dnh5MmTAIDQ0FBMmjTphbZT8jXR\nZpGRkbCxsdF0GKwWcfKuZaUT8L59+9CiRQucOXOmynVlMhlkMlldhlct3t7eMDQ0hImJifg4f/48\nrl69Ci8vLwBQi1OlUkFHRwdFRUW1FkPxNov3b29vj08++aTWtl8y/gULFmDr1q1VrhMUFIRFixap\nPVfyNalN5X2Qb9++HX369Kn1fZX2svvJy8vDnDlzYGNjI753//73v8X5JT842YvT03QADU3JBLxj\nxw7MmTMHhw8fhoeHh4Yjqz6ZTIYNGzYgODi4wmXKu7frRe/3KigogJ5e+f8Vnzx5Ah0dHcTExKB/\n//5wcXGBj49PtdeXKm35IH8RK1aswMWLF/Hrr7/C0tISt27dUvt2IpPJXvj/CnuOW951gIiwefNm\nfPDBB4iIiBAT982bN/Haa6/B3NwcrVq1wrhx4/DkyZNytxESEoJRo0YhICAAzZo1g1wuR2JiIlas\nWAELCwvY2tri559/Fpfftm0bHB0d0axZM3To0AFbtmwR50VGRqJt27b4/PPPYWFhASsrK2zfvr3G\nx1W6xVScXIpbnqampmIrHQC++eYbODo6okWLFhg8eDCSk5PFdXV0dLBx40Z06tQJXbp0qXLfHh4e\ncHJywrVr18Tj+fTTT9GmTRtMmDABRISVK1eiY8eOMDc3x1tvvYX09HRx/V27dsHW1hbm5uYIDQ1V\n23bpLqDo6Gj07NkTZmZmaNeuHXbs2IGtW7di7969+PTTT2FiYoI333xTfE2KW8jPnj3D7NmzYW1t\nDWtra/z73/9GXl4egNp7D4oVfzPZunUrrK2tYWVlhdWrV4vzc3JyEBQUhBYtWsDJyQm//vqr2vrF\nr1WzZs3g5OSE//3vfwCAP/74A9OmTcMvv/wCExMTtGjRQjy2Dz74ALa2trC0tMS0adOQm5tbbmy/\n/fYb/Pz8YGlpCQCwtbUVX9+AgAAkJyfD19cXJiYmWLVqFQAgJiZGfM1dXFwQFRUlbs/b2xvz589H\njx490Lx5c/j5+am9t40WsVplZ2dHw4cPJwsLC4qLi1Obd+PGDTp+/Djl5eVRWloaeXl50ezZs9XW\nPXHiBBERLV68mF555RWKiIiggoICeuedd8jW1pZCQ0OpoKCAtm7dSvb29uK6P/30E/31119ERBQV\nFUVGRkZ08eJFIiI6deoU6enp0eLFi6mgoIAOHz5MRkZG9Pjx43KPwdvbm/7v//6v3GMrGd+4ceOI\niEilUpFMJqPCwkJx2f/973/UsWNH+vPPP6mwsJCWLVtGPXv2FOfLZDIaNGgQpaenU25ubpl9JSUl\nkUwmo4KCAioqKqLo6GgyMjKikydPisczb948ysvLo5ycHPriiy/I09OTbt++TXl5eTRlyhTy9/cn\nIqJr166RsbExnTlzhp49e0bvv/8+6enpiccSEhKidiwmJia0b98+KigooIcPH9KlS5eIiCgoKIgW\nLVpU4WuyaNEi8vT0pLS0NEpLS6OePXuKy9f0PSi53WLbtm2j3r17q70+Y8eOpezsbLpy5Qq1atWK\njh8/TkREc+fOJS8vL0pPT6eUlBRycnIiGxsbcVv79++nu3fvEhHRd999R02bNqW///6biIi2b98u\n7qfY7Nmz6c0336T09HR6+vQp+fr60vz588uNfdmyZdSuXTvauHEjxcXFUVFRUaXHlpqaSi1btqQj\nR44QEdHPP/9MLVu2pAcPHhARUd++fcna2pquXbtGWVlZNGLECPH9asw4edcyW1tbatasGfn5+ZX5\nT1vagQMHSKlUitOlk+OgQYPEeeHh4WRsbCxuMyMjg2QyGT158qTcbfv5+dHatWuJSEgchoaGasm1\ndevWdP78+XLX7du3LxkZGZGpqSmZmpqSm5tbufEVn0DFiaTk9gcPHkxff/21OF1YWEhGRkaUnJxM\nRELyPnXqVIWvTfE2TU1NyczMjBwcHOjLL78Uj8fAwICePXsmLu/g4KCWEO7cuUP6+vpUUFBAS5Ys\nERM5EVFWVhYZGBiUeyyhoaE0fPjwcmMKCgqihQsXqj1X8jXp0KGDmICIiI4dO0Z2dnZizDV5D6qb\n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 truncated
"text": [
"<matplotlib.figure.Figure at 0x7e22080>"
]
}
],
"prompt_number": 13
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 13
}
],
"metadata": {}
}
]
}
+189 -161
View File
@@ -1,162 +1,190 @@
{
"metadata": {
"name": ""
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "code",
"collapsed": false,
"input": [
"def to_array(x):\n",
" try:\n",
" x.shape\n",
" try:\n",
" if type(x) != numpy.ndarray:\n",
" x=asarray(x)[0]\n",
" return x\n",
" except:\n",
" pass\n",
"\n",
" except:\n",
" return array(mat(x)).reshape(1)\n",
"\n",
"def to_cov(x,n):\n",
" try:\n",
" x.shape\n",
" return x\n",
" except:\n",
" return eye(n) * x\n",
" \n",
"def multivariate_gaussian (x, mu, cov):\n",
" \"\"\" This is designed to work the same as scipy.stats.multivariate_normal\n",
" which is available before version 0.14. You may either pass in a \n",
" multivariate set of data:\n",
" multivariate_gaussian (array([1,1]), array([3,4]), eye(2)*1.4)\n",
" or unidimensional data:\n",
" multivariate_gaussian(1, 3, 1.4)\n",
" \n",
" In the multivariate case if cov is a scalar it is interpreted as eye(n)*cov\n",
" \"\"\"\n",
" \n",
" # force all to numpy.array type\n",
" x = to_array(x)\n",
" mu = to_array(mu)\n",
" n = mu.size\n",
" cov = to_cov (cov, n)\n",
"\n",
" det = numpy.sqrt(numpy.prod(numpy.diag(cov)))\n",
" frac = (2*numpy.pi)**(-n/2.0) * (1.0/det)\n",
" fprime = x - mu\n",
" fprime **= 2\n",
" m = frac * numpy.exp(-0.5*numpy.dot(fprime, 1/numpy.diag(cov)))\n",
" return m\n",
"\n"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 24
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print mvg (array([1,1]), array([1,1]), eye(2))\n",
"print mvg (mat([1,1]), mat([1,1]), eye(2))\n",
"print mvg (2,3,1)\n",
"\n",
"\n",
"\n",
"\n"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"0.159154943092\n",
"0.159154943092\n",
"0.241970724519\n"
]
}
],
"prompt_number": 30
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print numpy.array(3)\n",
"print pylab.rcParams['figure.figsize']"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"3\n",
"(6.0, 4.0)\n"
]
}
],
"prompt_number": 2
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"class KalmanFilter1D(object):\n",
"\n",
" def __init__ (self, x0, var):\n",
" self.mean = x0\n",
" self.variance = var\n",
"\n",
" def estimate(self, z, z_variance):\n",
" self.mean = \\\n",
" (self.variance*z + z_variance*self.mean) / \\\n",
" self.variance + z_variance\n",
" self.variance = 1. / (1./self.variance+ 1./z_variance)\n",
"\n",
"f = KalmanFilter1D(1,2)\n",
"f.estimate(z = 2,\n",
" z_variance = 3)\n",
"\n",
"print f.mean, f.variance"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"6 1.2\n"
]
}
],
"prompt_number": 6
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import scipy.interpolate\n"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 9
}
],
"metadata": {}
}
]
{
"metadata": {
"name": "",
"signature": "sha256:72a139de073c5d503980bcd0a85ebae9c6b611ce8aba196ba5cf862647b7cad0"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "code",
"collapsed": false,
"input": [
"def to_array(x):\n",
" try:\n",
" x.shape\n",
" try:\n",
" if type(x) != numpy.ndarray:\n",
" x=asarray(x)[0]\n",
" return x\n",
" except:\n",
" pass\n",
"\n",
" except:\n",
" return array(mat(x)).reshape(1)\n",
"\n",
"def to_cov(x,n):\n",
" try:\n",
" x.shape\n",
" return x\n",
" except:\n",
" return eye(n) * x\n",
" \n",
"def multivariate_gaussian (x, mu, cov):\n",
" \"\"\" This is designed to work the same as scipy.stats.multivariate_normal\n",
" which is available before version 0.14. You may either pass in a \n",
" multivariate set of data:\n",
" multivariate_gaussian (array([1,1]), array([3,4]), eye(2)*1.4)\n",
" or unidimensional data:\n",
" multivariate_gaussian(1, 3, 1.4)\n",
" \n",
" In the multivariate case if cov is a scalar it is interpreted as eye(n)*cov\n",
" \"\"\"\n",
" \n",
" # force all to numpy.array type\n",
" x = to_array(x)\n",
" mu = to_array(mu)\n",
" n = mu.size\n",
" cov = to_cov (cov, n)\n",
"\n",
" det = numpy.sqrt(numpy.prod(numpy.diag(cov)))\n",
" frac = (2*numpy.pi)**(-n/2.0) * (1.0/det)\n",
" fprime = x - mu\n",
" fprime **= 2\n",
" m = frac * numpy.exp(-0.5*numpy.dot(fprime, 1/numpy.diag(cov)))\n",
" return m\n",
"\n"
],
"language": "python",
"metadata": {},
"outputs": []
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print mvg (array([1,1]), array([1,1]), eye(2))\n",
"print mvg (mat([1,1]), mat([1,1]), eye(2))\n",
"print mvg (2,3,1)"
],
"language": "python",
"metadata": {},
"outputs": []
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print numpy.array(3)\n",
"print pylab.rcParams['figure.figsize']"
],
"language": "python",
"metadata": {},
"outputs": []
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"class KalmanFilter1D(object):\n",
"\n",
" def __init__ (self, x0, var):\n",
" self.mean = x0\n",
" self.variance = var\n",
"\n",
" def estimate(self, z, z_variance):\n",
" self.mean = \\\n",
" (self.variance*z + z_variance*self.mean) / \\\n",
" self.variance + z_variance\n",
" self.variance = 1. / (1./self.variance+ 1./z_variance)\n",
"\n",
"f = KalmanFilter1D(1,2)\n",
"f.estimate(z = 2,\n",
" z_variance = 3)\n",
"\n",
"print f.mean, f.variance"
],
"language": "python",
"metadata": {},
"outputs": []
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%file test.py\n",
"print 'hi'"
],
"language": "python",
"metadata": {},
"outputs": []
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%run test.py\n"
],
"language": "python",
"metadata": {},
"outputs": []
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import math\n",
"from IPython.html.widgets import interact, interactive, fixed\n",
"#from IPython.html import widgets\n",
"#from IPython.display import clear_output, display, HTML\n",
"\n",
"def gaussian (x, mu, sigma):\n",
" ''' compute the gaussian with the specified mean(mu) and sigma'''\n",
" return math.exp (-0.5 * (x-mu)**2 / sigma) / math.sqrt(2.*math.pi*sigma)\n",
"\n",
"def plt_g (mu,gamma):\n",
" xs = arange(0,10,0.15)\n",
" ys = [gaussian (x, mu,gamma) for x in xs]\n",
" plot (xs, ys)\n",
" show()\n",
"\n",
" \n",
"interact (plt_g, mu=(0,10), gamma=(0.01,6))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAXsAAAEACAYAAABS29YJAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xlc1WXe//EXBtXkrmOmgKGAgBvagGRp4YKmpaXZ3JSl\nk2RkOWXLZM7yS23KyLoro8VcGus2s+1WK6VSo9tUpNLGCtdcQsxySnIXOH5/f1yJmXoEPHCdc77v\n5+PBQ4HzhbdH/fA51/daQhzHcRARkaBWy3YAERGpfir2IiIuoGIvIuICKvYiIi6gYi8i4gIq9iIi\nLnDaYp+Tk0N8fDyxsbFkZWWd8PlZs2aRmJhIhw4duPTSS1mzZk3556KioujQoQOdOnWic+fOvk0u\nIiIVFuJtnr3H4yEuLo5FixYRHh5OcnIys2fPJiEhofwxK1asoE2bNtSvX5+cnBzGjRtHXl4eAC1b\ntuTzzz+nUaNG1f8nERGRU/La2efn5xMTE0NUVBRhYWGkp6czb9684x7TpUsX6tevD0BKSgrbt28/\n7vNasyUiYp/XYl9UVERkZGT5+xERERQVFZ3y8dOnT6dfv37l74eEhNCrVy+SkpKYOnWqD+KKiEhV\nhHr7ZEhISIW/0EcffcSMGTNYtmxZ+ceWLVtGs2bN2LVrF2lpacTHx9OtW7eqpxURkSrxWuzDw8Mp\nLCwsf7+wsJCIiIgTHrdmzRpGjBhBTk4ODRs2LP94s2bNAGjSpAkDBw4kPz//hGIfExPDN998c0Z/\nCBERt4mOjmbTpk0Vv8DxorS01GnVqpWzZcsW5/Dhw05iYqJTUFBw3GO2bdvmREdHOytWrDju4/v3\n73f27NnjOI7j7Nu3z7nkkkuc999//4TvcZoIrvLggw/ajuA39Fwco+fiGD0Xx1S2dnrt7ENDQ8nO\nzqZPnz54PB4yMjJISEhgypQpAGRmZjJhwgR2797NyJEjAQgLCyM/P5+dO3cyaNAgAMrKyhgyZAi9\ne/eu0k8wERE5M16LPUDfvn3p27fvcR/LzMws//20adOYNm3aCde1atWKL774wgcRRUTkTGkFrR9J\nTU21HcFv6Lk4Rs/FMXouqs7roqoaCRASorn4IiKVVNnaqc5eRMQFVOxFRFxAxV5ExAVU7EVEXEDF\nXkTEBVTsRURcQMVeRMQFVOxFRFxAxV5ExAVU7EVEXEDFXuQ3Dh+Gn38Gj8d2EhHfOe2ulyLBrqQE\nPv0UPvrIvOXnm4/v3w/nnQd165q3jh1hyBDo2xfOPttuZpHK0kZo4lpbtsDf/w7vvAMxMdC9u3nr\n1g3q14cjR0zB37sX9uyBjz+GWbOgoACuvdYU/q5doZZeH4sFla2dKvbiOrt3w8MPw0svwejRcMcd\n0KhRxa/ftg1mz4b/+R+oXRtmzIC2basvr8jJaNdLkVMoKYGnnoK4ONOtf/01/OMflSv0ABdeCA88\nAGvWwPDhkJoKEyaYry/ir9TZiysUFsKAAdCsGUya5NtOvLAQbrvN/DpjBiQl+e5ri5yKOnuR38jP\nh4svhhtvhPfe8/2QS2QkvPsujBkDV14JWVmg/kX8jTp7CWpz5sCoUTB9uunsq9uOHdCnD1xxBTz2\nGISEVP/3FHfSDVoRTGf90EOmyM+fD4mJNfe9f/oJ+vWDdu1gyhQ466ya+97iHir24nqOA7fcAl99\nBfPmwQUX1HyGfftg4EBo0MDM2jnnnJrPIMFNY/biemPHmrnwS5bYKfQAdeqYcfwjR8zw0f79dnKI\nHKViL0Hl6adh7lxTaGvXtpvlnHPMPYMLLoBBg6CszG4ecTcVewkar70Gjz8O778PjRvbTmOEhpr7\nBgD33GM3i7ibir0EhcWL4c47YcECs+jJn4SGmg7/ww/h+edtpxG30kZoEvBWr4brr4c33oD27W2n\nObkGDcwePF27Qmws9OplO5G4jTp7CWg//WRmvTz7LFx+ue003sXEmKGmIUNgwwbbacRtNPVSApbj\nmBufF15o9rwJFNOmmQVXK1dCw4a200ig0jx7cY3sbLNz5fLlgTeP/e67YdMms+BLq2ylKlTsxRVW\nr4bevWHFCjM8EmhKSqBLF8jMhFtvtZ1GApGKvQS9vXvhD3+A8ePNjdlAtXYtXHaZeWUSG2s7jQQa\nFXsJao4DQ4eaYZtp02ynOXPPPGNOv/rkEzNFU6SitF2CBLWXX4bPP4fJk20n8Y077jBHID78sO0k\nEuzU2UvAKCoyh34vXgwdOthO4zs7dkCnTuZmbUqK7TQSKNTZS9D685/NiVDBVOgBmjc36wRuukkb\npkn1OW2xz8nJIT4+ntjYWLKysk74/KxZs0hMTKRDhw5ceumlrFmzpsLXilTU//6v2cnyb3+znaR6\nDB5sZuc88IDtJBK0HC/Kysqc6OhoZ8uWLU5JSYmTmJjoFBQUHPeY5cuXO8XFxY7jOM7ChQudlJSU\nCl/7yxCStwgiTnGx44SHO87HH9tOUr1+/NFxmjZ1nM8+s51EAkFla6fXzj4/P5+YmBiioqIICwsj\nPT2defPmHfeYLl26UL9+fQBSUlLYvn17ha8VqYixY83JT5ddZjtJ9WrUyJxfe9tt4PHYTiPBxmux\nLyoqIjIysvz9iIgIioqKTvn46dOn069fvypdK3Iyy5aZ/endMgo4dCj87nfw4ou2k0iw8TqzN6QS\n67g/+ugjZsyYwbJlyyp97bhx48p/n5qaSmpqaoWvleB1+DCMGGEOJHHLHjIhIfDcc9Cjh9n3p2lT\n24nEX+Tm5pKbm1vl670W+/DwcAoLC8vfLywsJCIi4oTHrVmzhhEjRpCTk0PDX/5XVvRaOL7YixyV\nlWW2Qhg82HaSmtWuHfzpT3D//TBzpu004i9+2wiPHz++cl/A24B+aWmp06pVK2fLli3O4cOHT3qT\nddu2bU50dLSzYsWKSl9blZsM4g7btjlOo0bmVzfau9dxWrRwnNxc20nEX1W2dnrt7ENDQ8nOzqZP\nnz54PB4yMjJISEhgypQpAGRmZjJhwgR2797NyJEjAQgLCyM/P/+U14pUxAMPwKhR0KKF7SR21Klj\ntm2+/Xaz6dvZZ9tOJIFOK2jF76xYAdddB+vX2z803CbHgauuMoey3H+/7TTib7QRmgS0I0fgkktM\nRzt0qO009m3caBZbrV0LTZrYTiP+RNslSECbPdvMMb/xRttJ/ENsLNxwA0yYYDuJBDp19uI39u+H\n+HhzTuull9pO4z/+8x9ISDBrDlq3tp1G/IU6ewlYjz9uirwK/fF+/3u47z7tmyNnRp29+IXt2yEx\nEVatMgeIy/EOHjSvembNgq5dbacRf6DOXgLS3/5m9oRRoT+53/3OHHBy331mlo5IZanYi3Vffgk5\nOTBmjO0k/u2GG6C0FN54w3YSCUQaxhHrrrnG7Gh5zz22k/i/JUvMfkEFBeYcXnEvDeNIQFm50pwp\n+8sCbDmNHj3MzJznnrOdRAKNOnuxqmdPSE833apUzFdfQa9esGmT2VZB3EmdvQSMxYvh22/NDo9S\nce3aQffuMHmy7SQSSNTZixWOAxdfDHffbTp7qZz1680UzI0boUED22nEBnX2EhDmz4dDh+CPf7Sd\nJDDFxcGVV8KTT9pOIoFCnb3UOI/HLKB69FGzq6NUzebN0Lmz6fIbN7adRmqaOnvxe7NnQ/36pjOV\nqmvVCq691mwzIXI66uylRpWVmWX/06aBjho+c4WF5lXS2rU6r9Zt1NmLX5s1CyIjVeh9JTLSbAed\nlWU7ifg7dfZSY8rKzIKgF180UwfFN777Dtq2NdtOhIfbTiM1RZ29+K3XXoNmzdTV+1qzZpCRAY88\nYjuJ+DN19lIjPB7TfT77rFk1K771ww/mXshXX0Hz5rbTSE1QZy9+ac4ccwhHjx62kwSn88+HYcNg\n0iTbScRfqbOXaufxmCX+kydDWprtNMFrxw7zPK9bZ4q/BDd19uJ33njDLOnv1ct2kuDWvDlcfz08\n8YTtJOKP1NlLtTpyBNq3NwXoiitspwl+334LnTrBhg1aVRvs1NmLX3nrLbMNb58+tpO4Q4sWMGgQ\nPPWU7STib9TZS7U5cgQ6doSJE7U1Qk06umfOpk3aETOYqbMXv/HeexAaCv362U7iLq1amR+uzzxj\nO4n4E3X2Ui0cB7p0gfvug8GDbadxn6P73W/eDHXr2k4j1UGdvfiF3FwoLoaBA20ncae4ODP7SWfV\nylHq7KVapKXBkCE6ctCmo2fVbtkCv/ud7TTia+rsxbr8fDP1b8gQ20ncrV07c6N2xgzbScQfqLMX\nn7vmGtNRjhplO4msWGEWWm3cCGFhttOIL6mzF6u++gpWrjS7MIp9XbpAVJTZcVTcTcVefOrRR2H0\naI0R+5OxY83fy5EjtpOITSr24jObN0NODowcaTuJ/Frv3nDuufDOO7aTiE2nLfY5OTnEx8cTGxtL\n1knOPlu3bh1dunTh3HPP5Ynf7MAUFRVFhw4d6NSpE507d/ZdavFLjz1mCn29eraTyK+FhJjufuJE\ns/5B3MnrDVqPx0NcXByLFi0iPDyc5ORkZs+eTUJCQvljdu3axbZt25g7dy4NGzbk3nvvLf9cy5Yt\n+fzzz2nUqNGpA+gGbVA4ejTe+vXQpIntNPJbHg+0aQMvvKAjIYOFT2/Q5ufnExMTQ1RUFGFhYaSn\npzNv3rzjHtOkSROSkpIIO8WtfhVyd3j6aXPwtQq9fzrrLBgzxnT34k5ei31RURGRkZHl70dERFBU\nVFThLx4SEkKvXr1ISkpi6tSpVU8pfu3nn2HqVPjVizrxQzfeCGvXwmef2U4iNoR6+2RISMgZffFl\ny5bRrFkzdu3aRVpaGvHx8XTr1u2Mvqb4n+efNxtvXXih7STizdlnmx/IEyearafFXbwW+/Line truncated
"text": [
"<matplotlib.figure.Figure at 0x7cc5978>"
]
},
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 2,
"text": [
"<function __main__.plt_g>"
]
}
],
"prompt_number": 2
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": []
}
],
"metadata": {}
}
]
}
+7 -18
View File
@@ -38,8 +38,9 @@ def multivariate_gaussian(x, mu, cov):
"""
# force all to numpy.array type
x = _to_array(x)
mu = _to_array(mu)
x = np.asarray(x)
mu = np.asarray(mu)
n = mu.size
cov = _to_cov(cov, n)
@@ -128,18 +129,6 @@ def plot_sigma_ellipses(ellipses,title=None,axis_equal=True,x_lim=None,y_lim=Non
if title is not None:
plt.title (title)
def _to_array(x):
""" returns any of a scalar, matrix, or array as a 1D numpy array
Example:
_to_array(3) == array([3])
"""
try:
x.shape
if type(x) != np.ndarray:
x = np.asarray(x)[0]
return x
except:
return np.array(np.mat(x)).reshape(1)
def _to_cov(x,n):
""" If x is a scalar, returns a covariance matrix generated from it
@@ -171,12 +160,12 @@ if __name__ == '__main__':
assert rv.pdf(1.2) == x2
assert abs(x2- x3) < 0.00000001
cov = np.array([\
[1,1],\
[1,1.1]])
cov = np.array([[1,1],
[1,1.1]])
sigma = [1,1]
ev = sigma_ellipses(cov, x=2, y=2, sigma=sigma)
plot_sigma_ellipses([e1, e2, e3, ev], axis_equal=True,x_lim=[0,4],y_lim=[0,15])
plot_sigma_ellipses([ev], axis_equal=True,x_lim=[0,4],y_lim=[0,15])
#isct = plt.Circle((2,2),1,color='b',fill=False)
#plt.figure().gca().add_artist(isct)
plt.show()
+54 -35
View File
@@ -1,6 +1,7 @@
{
"metadata": {
"name": ""
"name": "",
"signature": "sha256:8d7cf224140d3802499c78af56da276f1e1e580fa08934a23e11b1ea2301209a"
},
"nbformat": 3,
"nbformat_minor": 0,
@@ -16,6 +17,22 @@
"The Kalman filter belongs to a family of filters called *bayesian filters*. Without going into"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": []
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {},
@@ -42,7 +59,7 @@
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 4
"prompt_number": 1
},
{
"cell_type": "markdown",
@@ -60,7 +77,7 @@
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 5
"prompt_number": 2
},
{
"cell_type": "markdown",
@@ -73,6 +90,8 @@
"cell_type": "code",
"collapsed": false,
"input": [
"%matplotlib inline\n",
"\n",
"pos = array([0.333, 0.333, 0., 0., 0., 0., 0., 0., 0.333, 0.])\n",
"\n",
"def bar_plot(pos):\n",
@@ -92,11 +111,11 @@
"output_type": "display_data",
"png": "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 truncated
"text": [
"<matplotlib.figure.Figure at 0x3f12b90>"
"<matplotlib.figure.Figure at 0x848df28>"
]
}
],
"prompt_number": 6
"prompt_number": 3
},
{
"cell_type": "markdown",
@@ -125,7 +144,7 @@
]
}
],
"prompt_number": 7
"prompt_number": 4
},
{
"cell_type": "markdown",
@@ -160,7 +179,7 @@
]
}
],
"prompt_number": 8
"prompt_number": 5
},
{
"cell_type": "markdown",
@@ -217,7 +236,7 @@
]
}
],
"prompt_number": 9
"prompt_number": 6
},
{
"cell_type": "markdown",
@@ -267,7 +286,7 @@
]
}
],
"prompt_number": 10
"prompt_number": 7
},
{
"cell_type": "markdown",
@@ -323,7 +342,7 @@
]
}
],
"prompt_number": 11
"prompt_number": 8
},
{
"cell_type": "markdown",
@@ -369,7 +388,7 @@
]
}
],
"prompt_number": 12
"prompt_number": 9
},
{
"cell_type": "markdown",
@@ -397,7 +416,7 @@
]
}
],
"prompt_number": 13
"prompt_number": 10
},
{
"cell_type": "markdown",
@@ -422,11 +441,11 @@
"output_type": "display_data",
"png": "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 truncated
"text": [
"<matplotlib.figure.Figure at 0x3f6f850>"
"<matplotlib.figure.Figure at 0x848dac8>"
]
}
],
"prompt_number": 14
"prompt_number": 11
},
{
"cell_type": "markdown",
@@ -460,11 +479,11 @@
"output_type": "display_data",
"png": "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 truncated
"text": [
"<matplotlib.figure.Figure at 0x3f12590>"
"<matplotlib.figure.Figure at 0x8484f28>"
]
}
],
"prompt_number": 15
"prompt_number": 12
},
{
"cell_type": "markdown",
@@ -499,11 +518,11 @@
"output_type": "display_data",
"png": "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 truncated
"text": [
"<matplotlib.figure.Figure at 0x3f80dd0>"
"<matplotlib.figure.Figure at 0x8639240>"
]
}
],
"prompt_number": 16
"prompt_number": 13
},
{
"cell_type": "markdown",
@@ -551,11 +570,11 @@
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAXYAAAEACAYAAACnJV25AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAHORJREFUeJzt3X9Mk3fiB/B3OXohJyJKUGafLmy02ha04No1muyuLuaY\n3kk25S5MDWarG9nFeCxedtlfB/tD5YyJTO4Ptuy8M7cgyf0QTmtzx+3bG5kjxICeCfOGHt1KGd7u\n9mXAUAvd5/sHrl8r8LQqPH38+H4lTXh4Pk8/7yK8eXza8jEIIQSIiEgaGekOQERE84vFTkQkGRY7\nEZFkWOxERJJhsRMRSYbFTkQkmaTFHggEYLPZYLVa0dDQMGP/5cuXsX79emRlZeHIkSMJ+w4ePIji\n4mKsWbMGO3bswM2bN+cvORERzUq12GOxGPbu3YtAIIC+vj60tLTgo48+ShiTl5eHY8eO4Wc/+1nC\n50OhEN5++2309PTg0qVLiMViOHny5Pw/AiIiSqBa7N3d3bBYLCgsLITRaERVVRXa2toSxuTn58Pl\ncsFoNCZ8PicnB0ajERMTE5iamsLExARMJtP8PwIiIkqgWuyRSARmszm+rSgKIpFISne8bNky7N+/\nH48++ihWrlyJ3NxcbNq06f7SEhFRUqrFbjAY7vmOr169iqNHjyIUCmFoaAjj4+N499137/n+iIgo\nNZlqO00mE8LhcHw7HA5DUZSU7vj8+fPYsGED8vLyAADbtm3DuXPnsHPnzoRxpaWluHjx4t3mJiJ6\nqDmdTly4cGHWfapn7C6XC/39/QiFQohGo2htbUVFRcWsY+/8W2I2mw1dXV24fv06hBDo6OiAw+GY\ncdzFixchhLiv2y9+8Yv7vo/5uOkhhx4y6CUHM+grhx4y6CXHfGRQOyFWPWPPzMxEU1MTysvLEYvF\n4PP5YLfb0dzcDACoqanB8PAw3G43RkdHkZGRgcbGRvT19cHpdKK6uhoulwsZGRlYt24dXn75ZbXp\niIhoHqgWOwBs3rwZmzdvTvhcTU1N/OOCgoKEyzW3e+211/Daa6/dZ0QiIrobUrzz1Ov1pjsCAH3k\n0EMGQB85mOH/6SGHHjIA+six0BkMQoi0LrRhMBiQ5ghERA8cte6U4ox9PuTkLIPBYNDklpOzTLcZ\niOjBxzP223IAWuWY/THrIQMRPRh4xk5E9BBhsRMRSYbFTkQkGRY7EZFkWOxERJJhsRMRSYbFTkQk\nGRY7EZFkWOxERJJhsRMRSYbFTkQkGRY7EZFkkhZ7IBCAzWaD1WpFQ0PDjP2XL1/G+vXrkZWVhSNH\njiTsGxkZQWVlJex2OxwOB7q6uuYvORERzUp1BaVYLIa9e/eio6MDJpMJbrcbFRUVsNvt8TF5eXk4\nduwYTp06NeP4n/70p9iyZQt+//vfY2pqCl999dX8PwIiIo3l5CzD2Nj/Lvg8ixcvxejoF3d9nOoZ\ne3d3NywWCwoLC2E0GlFVVYW2traEMfn5+XC5XDAajQmf//LLL9HZ2YkXX3wRwPT6qUuWLLnrgERE\nejNd6mLBb/f6y0O12CORCMxmc3xbURREIpGU7nhgYAD5+fl44YUXsG7dOrz00kuYmJi4p5BERJQ6\n1Usx0ws/3JupqSn09PSgqakJbrcbtbW1OHToEN54440ZY+vq6uIfe71eXaxJSESkJ8FgEMFgMKWx\nqsVuMpkQDofj2+FwGIqipHTHiqJAURS43W4AQGVlJQ4dOjTr2NuLnYiIZrrzpLe+vn7OsaqXYlwu\nF/r7+xEKhRCNRtHa2oqKiopZx965RFNBQQHMZjM+/vhjAEBHRweKi4tTfQxERHSPkq55evbsWdTW\n1iIWi8Hn8+H1119Hc3MzAKCmpgbDw8Nwu90YHR1FRkYGFi9ejL6+PmRnZ+PixYvYs2cPotEoioqK\ncPz48RlPoHLNU31lIKLktPtZnfvnVK07uZj1bTnSXap6yEBEyem92PnOUyIiybDYiYgkw2InIpIM\ni52ISDIsdiIiybDYiYgkw2InIpIMi52ISDIsdiIiybDYiYgkw2InIpIMi52ISDIsdiIiybDYiYgk\nw2InIpIMi52ISDJJiz0QCMBms8FqtaKhoWHG/suXL2P9+vXIysrCkSNHZuyPxWIoKyvD1q1b5ycx\nERGpUl3MOhaLYe/evejo6IDJZILb7UZFRQXsdnt8TF5eHo4dO4ZTp07Neh+NjY1wOBwYGxub3+RE\nRDQr1TP27u5uWCwWFBYWwmg0oqqqCm1tbQlj8vPz4XK5YDQaZxw/ODgIv9+PPXv2cBk2IiKNqBZ7\nJBKB2WyObyuKgkgkkvKdv/rqqzh8+DAyMngpn4hIK6qXYqYXbL03p0+fxvLly1FWVoZgMKg6tq6u\nLv6x1+uF1+u953mJiGQUDAaTduk3VIvdZDIhHA7Ht8PhMBRFSemOz507h/b2dvj9fty4cQOjo6Oo\n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 truncated
"text": [
"<matplotlib.figure.Figure at 0x3f12c90>"
"<matplotlib.figure.Figure at 0x86506a0>"
]
}
],
"prompt_number": 17
"prompt_number": 14
},
{
"cell_type": "markdown",
@@ -588,11 +607,11 @@
"output_type": "display_data",
"png": "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 truncated
"text": [
"<matplotlib.figure.Figure at 0x3fbf950>"
"<matplotlib.figure.Figure at 0x86394a8>"
]
}
],
"prompt_number": 18
"prompt_number": 15
},
{
"cell_type": "markdown",
@@ -617,11 +636,11 @@
"output_type": "display_data",
"png": "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 truncated
"text": [
"<matplotlib.figure.Figure at 0x3efe410>"
"<matplotlib.figure.Figure at 0x848d898>"
]
}
],
"prompt_number": 19
"prompt_number": 16
},
{
"cell_type": "markdown",
@@ -646,11 +665,11 @@
"output_type": "display_data",
"png": "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 truncated
"text": [
"<matplotlib.figure.Figure at 0x3fbf390>"
"<matplotlib.figure.Figure at 0x849f4e0>"
]
}
],
"prompt_number": 20
"prompt_number": 17
},
{
"cell_type": "markdown",
@@ -692,7 +711,7 @@
"output_type": "display_data",
"png": "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 truncated
"text": [
"<matplotlib.figure.Figure at 0x3f6fc90>"
"<matplotlib.figure.Figure at 0x8642588>"
]
},
{
@@ -704,7 +723,7 @@
]
}
],
"prompt_number": 25
"prompt_number": 18
},
{
"cell_type": "markdown",
@@ -729,11 +748,11 @@
"output_type": "display_data",
"png": "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 truncated
"text": [
"<matplotlib.figure.Figure at 0x3f5b250>"
"<matplotlib.figure.Figure at 0x84960f0>"
]
}
],
"prompt_number": 22
"prompt_number": 19
},
{
"cell_type": "markdown",
@@ -761,11 +780,11 @@
"output_type": "display_data",
"png": "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 truncated
"text": [
"<matplotlib.figure.Figure at 0x3f5c390>"
"<matplotlib.figure.Figure at 0x865fa58>"
]
}
],
"prompt_number": 23
"prompt_number": 20
},
{
"cell_type": "markdown",
@@ -821,14 +840,14 @@
"outputs": [
{
"ename": "SyntaxError",
"evalue": "invalid syntax (<ipython-input-24-5eaa20e350b9>, line 1)",
"evalue": "invalid syntax (<ipython-input-21-5eaa20e350b9>, line 1)",
"output_type": "pyerr",
"traceback": [
"\u001b[1;36m File \u001b[1;32m\"<ipython-input-24-5eaa20e350b9>\"\u001b[1;36m, line \u001b[1;32m1\u001b[0m\n\u001b[1;33m Author notes:\u001b[0m\n\u001b[1;37m ^\u001b[0m\n\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m invalid syntax\n"
"\u001b[1;36m File \u001b[1;32m\"<ipython-input-21-5eaa20e350b9>\"\u001b[1;36m, line \u001b[1;32m1\u001b[0m\n\u001b[1;33m Author notes:\u001b[0m\n\u001b[1;37m ^\u001b[0m\n\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m invalid syntax\n"
]
}
],
"prompt_number": 24
"prompt_number": 21
}
],
"metadata": {}
+1
View File
@@ -0,0 +1 @@
print 'hi'