Lots of material on resampling.
Happy 4th of July!
This commit is contained in:
1 parent
afe168c7b3
commit
f8896bbb80
5 files changed
+727
-82
No files matched your search
@@ -3465,6 +3465,31 @@
|
||||
"I show this to reiterate the importance of using Kalman filters to compute velocities, accelerations, and even higher order values. I use a Kalman filter even when my measurements are so accurate that I am willing to use them unfiltered because it allows me accurate estimates for velocities and accelerations."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Discussion and Summary\n",
|
||||
"\n",
|
||||
"We extended Gaussians into multiple dimensions to allow us to simultaneously handle multiple dimensions, both spacial and others (velocity, etc). This led us to use linear algebra. We made a key insight: unobserved variables have the ability to significantly increase the accuracy of the filter. This counterintuitive result is because the unobserved variables are correlated with the observed variables. Intuitively, I think of it as *triangulating* onto the solution - only a small number of states can be true for a given combination of a velocity Gaussian and position Gaussian, roughtly described by their intersection. But of course this works for non-spatial problms as well. \n",
|
||||
"\n",
|
||||
"There is one important caveat about unobserved variables. It is easy to construct a filter that produces estimates for unobserved variables. Heck, I could write a filter that estimates the color of a tracked car. The designer must verify that these variables are being estimated *correctly*. If you do not have a velocity sensor and yet are estimating velocity, you will need to test that the velocity estimates are correct.; do not trust that they are. For example, suppose the velocity has a periodic component to it - it looks like a sine wave. If your sample time is less than 2 times the frequency you will not be able to accurately estimate the velocity (due to Nyquist's Theorem). Imagine that the sample period is equal to the frequency of the velocity. The filter will report that the velocity is constant because each time it will be sampling the system at the same point on the sin wave. \n",
|
||||
"\n",
|
||||
"Initialization poses a particularly difficult problem for unobserved variables. If you start with a bad initialization the filter can usually recover the observed variables, but may struggle and fail with the unobserved one. Estimating unobserved variables is a powerful tool, but a dangerous one. \n",
|
||||
"\n",
|
||||
"I established a series of steps for designing a Kalman filter. These are not a usual part of the Kalman filter literature, and are only meant as a guide, not a prescription. Designing for a hard problem is an iterative process. You make a guess at the state vector, work out what your measurement and state models are, run some tests, and then alter the design as necessary. \n",
|
||||
"\n",
|
||||
"The design of $\\mathbf{R}$ and $\\mathbf{Q}$ is often quite challenging. I've made it appear to be quite scientific. Your sensor has Gaussian noise of $\\mathcal{N}(0, \\sigma^2)$, so set $\\mathbf{R}=\\sigma^2$. Easy! But I told you a dirty lie. Sensors are not Gaussian. We started the book with a bathroom scale. Suppose $\\sigma=1$ kg, and you try to weigh something that weighs 0.5 kg. Theory tells us we will get negative measurements, but of course the scale will never report weights less than zero. Real world sensors typically have *fat tails*, which mean they have more outlying noise than theory predicts. In some cases, such as with the scale, one or both tails are truncated.\n",
|
||||
"\n",
|
||||
"The case with $\\mathbf{Q}$ is more dire. I hope you were skeptical when I blithely assigned a noise matrix to my prediction about the movements of a dog. Who can say what a dog will do next? But this holds true for more other systems. The GPS in my car doesn't know about hills, the outside winds, or my terrible driving skills. Yet the filter in it requires a precise number to encapsulate all of that information, and it need to work while I drive off-road in the desert, and when Formula One champion Michael Schumacher drives on a closed circuit track.\n",
|
||||
"\n",
|
||||
"These problems led some researchers and engineers to derogatorily call the Kalman filter a 'ball of mud'. In other words, it doesn't always hold together so well. Another term to know - Kalman filters can become **smug**. Their estimates are based solely on what you tell it the noises are. Those values can lead to overly confident estimates. $\\mathbf{P}$ gets smaller and smaller while the filter is actually becoming more and more inaccurate! In the worst case the filter diverges. We will see a lot of that when we start studying nonlinear filters. \n",
|
||||
"\n",
|
||||
"The reality is that the Kalman filter is a mathematical model of the world. The output is only as accurate as that model. To make the math tractable we had to make some assumptions. I We assume that the sensors and motion model have Gaussian noise. We assume that everything is linear. If that is true, the Kalman filter is *optimal* in a least squares sense. This means that there is no way to make a better estimate than what the filter gives us. However, these assumption are almost never true, and hence the model is necessarily limited, and a working filter is rarely optimal.\n",
|
||||
"\n",
|
||||
"In later chapters we will deal with the problem of nonlinearity. For now I want you to understand that designing the matrices of a linear filter is an experimental procedure more than a mathematical one. Use math to establish the initial values, but then you need to experiment. If there is a lot of unaccounted noise in the world (wind, etc) you may have to make $\\mathbf{Q}$ larger. If you make it too large the filter fails to respond quickly to changes. In the **Adaptive Filters** chapter you will learn some alternative techniques that allow you to change the filter design in real time in response to the inputs and performance, but for now you need to find one set of values that works for the conditions your filter will encounter. Noise matrices for an acrobatic plane might be different if the pilot is a student than if the pilot is an expert as the dynamics will be quite different."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
|
||||
+505
-42
@@ -271,6 +271,7 @@
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"** author's note: this is being written now. It is not ready to be read.**\n",
|
||||
"** Depends on a development version of FilterPy which you probably don't have.**\n",
|
||||
"\n",
|
||||
"Here is our problem. We have object moving in a space, and we want to track them. Maybe the objects are fighter jets and missiles in the sky, or maybe we are tracking people playing cricket in a field. It doesn't really matter. Which of the filters that we have learned can handle this problem? Well, none of them are ideal. Let's think about the characteristics of this problem. \n",
|
||||
"\n",
|
||||
@@ -317,9 +318,9 @@
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAuoAAAEWCAYAAAAw37JZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsnX9MW/e5/99OA/g3P30w4AQbl/wgQJKlSUuWpl1Ik2Wd\n2lW5Urfqqu1VdfvHze6aVVOkSldLNfV2qr5RVU1b+8ekbr2tdjvpdlq7u96Nu2a3WQoraUjqOISE\ngA0x2NgQwPaxDTT4+wf6fHJ8OP4FBgw8L6kqOT4+53POgefznOfzfp5HFY/H4yAIgiAIgiAIIq/Y\nsNIDIAiCIAiCIAhiPuSoEwRBEARBEEQeQo46QRAEQRAEQeQh5KgTBEEQBEEQRB5CjjpBEARBEARB\n5CHkqBMEQRAEQRBEHkKOOkEQBEEQBEHkIeSoEwRBrGN++tOfYu/evSguLoYgCHjsscdw9erVefu9\n/PLLqKmpgVarxTe+8Q10d3cnfD41NYV//dd/hclkgl6vx+OPP46hoaHlugyCIIg1CTnqBEEQ65hP\nP/0U3//+99HR0YGzZ89i48aNOHz4MMbHx/k+r732Gl5//XX8/Oc/x4ULFyAIAh555BGEw2G+z8mT\nJ/G73/0O77//Pv72t78hGAzi29/+NmZnZ1fisgiCINYEKupMShAEQTBEUURxcTE+/PBDPProo4jH\n46iursYPfvADvPTSSwCAWCwGQRBw5swZPP/885icnIQgCPj1r3+N733vewAAj8eD2tpa/M///A+O\nHDmykpdEEASxaqGIOkEQBMEJBoOYnZ1FaWkpAMDlcmFkZCTB2Var1Th48CDa29sBABcvXsTMzEzC\nPhaLBdu3b+f7EARBENlDjjpBEATBeeGFF7B79260tLQAAHw+HwCgsrIyYT9BEPhnPp8P99xzD8rL\nyxP2qaysxMjIyDKMmiAIYm2ycaUHoMTk5ORKD4EgCGJZKC4uXukhcF588UW0t7fj/PnzUKlUaffP\nZB85ZN8Jglgv5MK+U0SdIAiCwA9/+EP89re/xdmzZ2G1Wvl2s9kMAPMi4yMjI/wzs9mMO3fuYGxs\nLGEfn8/H9yEIgiCyhxx1giCIdc4LL7zAnfQtW7YkfGaz2WA2m9HW1sa3xWIxnD9/Hvv37wcA7Nmz\nBwUFBQn7eDwe9PT08H0IgiCI7MlL6YuUfFoWJgiCyAX5JP84ceIE3nvvPfz+979HcXEx150bDAbo\ndDqoVCqcPHkSr776KrZt24b6+nq88sorMBgMeOqppwDM2ennnnsOp06dgiAIKCsrw4svvoidO3fi\n8OHDSc9N9n11EwwGcenSJQDA7t27YTQaV3hE+U0wGAQAuk9rnFzb97x31AmCIIil46233oJKpUJr\na2vC9pdffhk//vGPAQCnTp1CNBrFiRMnMD4+jgceeABtbW3Q6XR8/zfeeAMbN27Ek08+iWg0isOH\nD+O9995bkI6dINYa9FJDLJS8rKMufRuhiAtBEGuN9Wzj1vO1r0UoSqyM/L6Qo75+yLWNo4g6QRAE\nQRALghzO+Sg55UajEbt37waQ+p7Riw8hhxx1giAIgiCIJSad801Rd0IJctQJgiAIglgS1mOEONPo\nuZxgMAhRFBNyPwiCHHWCIAiCIHLOeo4QZ3utwWAQfX19AAC73b6u7hWRGqqjThAEQRAEkQHBYJCv\nEiwFOp2OnHQiAYqoEwRBEASRcxYqAclXcrFCkEwKtNbuFZE7yFEnCIIgCGJJIKfzLlJHn8lbpPeH\n7hWhBDnqBEEQBEEQachV1FsURTgcDuh0unWn3Seyhxx1giAIgiCIDEjmVGdS3YY5+tLEUYJIBznq\nBEEQBEHkjPVWkjEb7TqTu7B91ss9IhYOOeoEQRAEQeSETJ3W9ebMy1mv101kDznqBEEQBEHknGTO\neDJnfrU671JJC0HkGqqjThA5YKlr6xIEQawGmNMqCAIcDgcuXbqUkW1kznum++cjfX19WY+f5g4i\nHTlz1H/6059i7969KC4uhiAIeOyxx3D16tV5+7388suoqamBVqvFN77xDXR3d+dqCASxIqyFCYYg\nCCKXuFwu9Pb2wu/3z7OLzJlfDxVPUjniNHcQmZAzR/3TTz/F97//fXR0dODs2bPYuHEjDh8+jPHx\ncb7Pa6+9htdffx0///nPceHCBQiCgEceeQThcDhXwyAIgiAIYoVgjqlOp0N1dTWAuUizkrMuryG+\nmp13pfErOeIUQSeyRRWPx+NLcWBRFFFcXIwPP/wQjz76KOLxOKqrq/GDH/wAL730EgAgFotBEASc\nOXMGzz//PP/u5OQk/7m4uHgphkcQOWW1aiuJlWE927j1fO1rHXlDHwC8DGE6B3wt2lC5Fh/APG3+\nWrzu9U6ubdySJZMGg0HMzs6itLQUwNwy2MjICI4cOcL3UavVOHjwINrb2xMcdYJYbZCRJQiCuEs2\nZQizKW+4mpA3SFKKpK+VayWWjiVz1F944QXs3r0bLS0tAACfzwcAqKysTNhPEAQMDw8v1TAIgiAI\nglgGlDp3rndHVH79drt9nuyHIFKxJI76iy++iPb2dpw/fx4qlSrt/pnsQxBEemgZlSCI1YDUVik5\n+GsNJRkMQWRCzssz/vCHP8Rvf/tbnD17FlarlW83m80AgJGRkYT9R0ZG+GcEsRrJl+QgqiBAEMRK\nkqkNUtqPoswEoUxOHfUXXniBO+lbtmxJ+Mxms8FsNqOtrY1vi8ViOH/+PPbv35/LYRDEskHOMUEQ\nRGqUghmiKEIUxRUa0dKQKmiTrqpNvgR8iPwjZ9KXEydO4L333sPvf/97FBcXc026wWCATqeDSqXC\nyZMn8eqrr2Lbtm2or6/HK6+8AoPBgKeeeipXwyCIdctCl49JLkMQRC5QskFrNVFUjsfjgcPhgE6n\nS3qdya59vdwjYmHkzFF/6623oFKp0NramrD95Zdfxo9//GMAwKlTpxCNRnHixAmMj4/jgQceQFtb\nG3Q6Xa6GQRDLSr5pK7MdA00QBEHkkkxtiHTeX+3BgmAwCIfDgd7eXtTX1y/oGGttdYHIHTlz1Gdn\nZzPa7/Tp0zh9+nSuTksQK85qnVwIgiCWmmSVYKQJlZcuXYIoimhubobFYlmRcS4WnU6H+vp6NDc3\n05xA5JQlK89IEET+k28rAgRBrD1SyUCCwSBEUURvby/fvtpskZId9Xg8AJDxiwcpC4hkkKNOEOuc\n1TYpEgSxdjAajWhubgawup1VqR31eDz44IMPAADHjx9P66xTwIRIBTnqBJGC1a6dlLKWroUgiLWD\nxWJJ2rlzvUB2mUgGOeoEkYS1lGiZ7bWQU08QxHLT19cHYPXbW4vFguPHj/OfCWIxkKNOEEQCa+kF\nhSAIIhtyFaQgB53IFeSoE0QS1pJucC1dC0EQa498sFGLCVLQKiSxVJCjThApWEtGN9NryYcJkyCI\ntUkqh3a12ptUDj458MRiIUedIBbIWjbAa/GaCIJYWZhDy2qmS+uq5wO5DlKQjJDIBeSoE0QGyJ1y\nMsAEQax3FhKsYDXTWSdOnU6HAwcO5I0NXcg4aBWSWErIUSeINJBTThAEkchC7KK0Zrooiujv74da\nrV513TyVmhklG7/dbl+VTZyI/IEcdYJQIF2kiCIoBEEQ2SOtmc4aHK0mG5ppMyP5iwxBLBRy1AlC\nhlKkSMkpX02TC0EQRC5ZbLDCaDTiwIEDC/4+QawXyFEniAzIp4lEadmVIAhiuVmIXVyNUkLpCmum\nzYxo1ZXIFeSoE4SMfDawmS67EgRBrCRrpSqW0otFpnZ3tV87kR+Qo04QmD+pLNbArpVJiiAIIhuC\nwSCCwSD6+voAzI+a53MgZCEsha2n+YOQQo46se7J9VLsUi7tZrrsShAEsdxI66QD4MmiclZTQ6BU\nLxZLYetXozSIWFrIUSfygnw31vkAu0fkoBMEkc/odLqUZQmZLQOwKpxSaf8M6b9TQXMakStU8Xg8\nvtKDkDM5Ocl/Li4uXsGREMtBPkQQFmJUU30n10Z6pe9RptezFNedy+PlC+vZxq3na18PpPubldoy\nu93OJTILqTe+nPYhmQ1WGkOm9jrZ+Neq3Vsv5NrGUUSdWPXkwqhl+910hnipDKwoiggGgzk/frqX\njkwnndUiISIIYmnI5u+UyUpSadqTkS/2gdWEl64SZEKq8ZOtI6SQo06sOItJLlqosZYb1eU0jFKn\nON04pPva7XY4HA709fWljDxl++KSLxMeQRBrn2ztfb5El5ONW6rLF0UROp0OBw4cWFMJs8TKQo46\nkRcst6MsT3iSO6hL1ZlU6hQLggCXy8U/k49DyYGWJmcpjfHatWtwOp0QBCFnTnem15rrag5rrToE\nQaxnpPZKaQVS+reeiYY93+yDKIro6+uDRqOBzWaDwWCYN6ew1VD2Xz6Nn8hfyFEnVjVLYewyjTAv\nRpsuiiKcTieGh4dRXV2dtDqC/HzSVtTyMXo8Hnz44YcYGhrCwYMH0x5P6bjZXOti9ssUmsAIYvWS\nTdKoUoDCbrcrHi9XZXSzIdm8IJXv6HS6BNteX1/Pu6+eP38evb29fFu2enxi/UKOOrHqyVYCInd4\nUx0jGzJx8JU0mY2NjaipqZk3DiUHWp7ApERZWRkaGxuz1ormknxZriYy49y5czhz5gy6urowPDyM\nX/3qV3jmmWf4588++yz+4z/+I+E7DzzwANrb2/m/p6am8KMf/Qjvv/8+otEoWltb8eabb/LfbWJ9\nkcrhzpR0wYl8Qep0h0KhhJVSglgs5KgTa5LFJHsuRtbCNIqpkBp1URTh9/tRU1OTMsqUyRiZjh3A\nijpHpHlffYiiiObmZjzzzDN4+umnoVKpEj5XqVR45JFH8O677/JthYWFCfucPHkSHLine truncated
|
||||
"text/plain": [
|
||||
"<matplotlib.figure.Figure at 0x446d208>"
|
||||
"<matplotlib.figure.Figure at 0x447d1d0>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
@@ -366,6 +367,7 @@
|
||||
" Update the weighting of the particles based on a measurement.\n",
|
||||
" \n",
|
||||
"4. **Resample**\n",
|
||||
"\n",
|
||||
" Discard highly improbable particle and replace them with copies of more probable particles\n",
|
||||
" \n",
|
||||
" Optionally, compute mean and covariance of the set of particles to get the most likely current state.\n",
|
||||
@@ -375,7 +377,7 @@
|
||||
" \n",
|
||||
"This naive algorithm runs into some practical difficulties which we will need to overcome, but this is the general idea. To demonstrate this I wrote a particle filter that performs robot localization. This is the same robot localization problem used in the UKF and EKF chapter. In this problem we have a robot that we can control. It has sensors that measure its distance to various landmarks, and we can steer the robot. Both the sensors and control mechanism have noise in them, and we need to estimate the robot's position.\n",
|
||||
"\n",
|
||||
"Here I run the particle filter and plotted the positions of the particles. The plot on the left is after one iteration, and on the right is after 10. The asterisk is the actual position of the robot, and the large circle is the computed weighted mean position."
|
||||
"Here I run a particle filter and plotted the positions of the particles. The plot on the left is after one iteration, and on the right is after 10. The asterisk is the actual position of the robot, and the large circle is the computed weighted mean position."
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -389,7 +391,7 @@
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<matplotlib.figure.Figure at 0x818d9e8>"
|
||||
"<matplotlib.figure.Figure at 0x7dc9048>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
@@ -408,7 +410,7 @@
|
||||
"\n",
|
||||
"Several iterations later you can see that all the particles have clustered around the robot. This is due to the **resampling** step. Resampling discards particles that are very improbable (very low weight) and replaces them with particles with higher probability. There are multiple algorithms for this, and we will discuss them later. \n",
|
||||
"\n",
|
||||
"I haven't fully shown *why* this works nor fully explained the algorithms for particle weighting and resampling, but it should make intuitive sense. Make a bunch of random particles, move them so they follow the robot, weight them according to how well they match the measurements, only let the likely ones live, and continue. It seems like it should work, and it does. "
|
||||
"I haven't fully shown *why* this works nor fully explained the algorithms for particle weighting and resampling, but it should make intuitive sense. Make a bunch of random particles, move them so they 'kind of' follow the robot, weight them according to how well they match the measurements, only let the likely ones live, and continue. It seems like it should work, and it does. "
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -416,7 +418,7 @@
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Probability distributions via MC\n",
|
||||
"Suppose we want to know the area under the curve $y= \\mathrm{e}^{\\sin(x)}$ in the interval [0, $\\pi$]. We can compute the area with the definite integral $\\int_0^\\pi \\mathrm{e}^{\\sin(x)}\\, \\mathrm{d}x$. Go ahead and compute the answer; I'll wait. If you are wise you did not take that challenge; $y= \\mathrm{e}^{\\sin(x)}$ can not be integrated and so you can not find the answer this way.\n",
|
||||
"Suppose we want to know the area under the curve $y= \\mathrm{e}^{\\sin(x)}$ in the interval [0, $\\pi$]. We can compute the area with the definite integral $\\int_0^\\pi \\mathrm{e}^{\\sin(x)}\\, \\mathrm{d}x$. As an exercise, go ahead and compute the answer; I'll wait. If you are wise you did not take that challenge; $y= \\mathrm{e}^{\\sin(x)}$ cannot be integrated and so you can not find the answer this way.\n",
|
||||
"\n",
|
||||
"However, this is trivial to compute using a Monte Carlo technique. Create a bounding box that contains the curve in the desired interval, generate random pairs $(x,y)$, and count how many fall under the curve. Multiply the area of the bounding box by the ratio of points that were under the curve vs the total number of points and you will have computed the are under the curve. As you tend towards infinite points you can achieve any arbitrary precision. In practice, a few thousand points will give you a fairly accurate result.\n",
|
||||
"\n",
|
||||
@@ -464,7 +466,7 @@
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<matplotlib.figure.Figure at 0x81bedd8>"
|
||||
"<matplotlib.figure.Figure at 0x825eac8>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
@@ -500,7 +502,7 @@
|
||||
"\n",
|
||||
"$$A = \\int_0^{2\\pi r} 2\\pi t\\, dt = \\pi r^2 $$\n",
|
||||
"\n",
|
||||
"The Monte Carlo technique does something very similar by summing the infinite number of points inside the circle. Computers can't sum infinities, so we settle for a representative sampling of points and less than infinite precision in the results.\n",
|
||||
"The Monte Carlo technique does something very similar by summing the infinite number of points inside the circle. Computers can't sum infinities, so we settle for a representative sampling of points and less than infinite precision in the results. Using Monte Carlo for this problem is remarkably unnecessary, but imagine instead trying to find the area inside a fractal Mandelbrot set. As far as I know there is no analytic solution to that problem, yet we could use the code above to find the answer. MC is a powerful tool to reach for when analysis fails. \n",
|
||||
"\n",
|
||||
"This insight leads us to the realization that we can use Monte Carlo to compute the probability density of any probability distribution. For example, suppose we have a Gaussian. The Gaussian has a probability distribution as shown below."
|
||||
]
|
||||
@@ -516,7 +518,7 @@
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<matplotlib.figure.Figure at 0x81c2198>"
|
||||
"<matplotlib.figure.Figure at 0x82167b8>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
@@ -550,7 +552,7 @@
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<matplotlib.figure.Figure at 0x872b0f0>"
|
||||
"<matplotlib.figure.Figure at 0x8e8c4e0>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
@@ -576,7 +578,9 @@
|
||||
"\n",
|
||||
"All of this brings us to the particle filter. Consider tracking a robot or a car in an urban environment. For consistency I will use the robot localization problem from the ends of the EKF and UKF chapters. In this problem we tracked a robot that had a sensor that could detect the range and bearing to landmarks. \n",
|
||||
"\n",
|
||||
"Taking insight from the discussion above we start by creating several thousand **particles**. Each particle has a position that represents a possible belief of where the robot is in the scene, and perhaps a heading and velocity. Suppose that when we initialize the filter we have no knowledge of the location of the robot. We would want to scatter the particles uniformly over the entire scene. If there was a large clump of particles near a specific location that would imply that we were more certain that the robot is there. If you think of all of the particles representing a probability distribution, locations where there are more particles represent a higher belief, and locations with fewer particles represents a lower belief.\n",
|
||||
"Before I continue let me point out that the filter I am going to develop next is a specific form of particle filter that is intuitive to grasp and relates to the problems we have studied in this book. In other words, particle filters are a family of algorithms. A more academic approach would give you a better grasp of this family and the interrelationships between the algorithms, but as in previous chapters I choose to develop concepts based on examples and basic reasoning, and only once that is done go back and develop the theory. This will leave a few of the steps seeming a bit 'magical' since I haven't offered full explanation for their use. Full explanations will follow later in the chapter.\n",
|
||||
"\n",
|
||||
"Taking insight from the discussion in the previous section we start by creating several thousand **particles**. Each particle has a position that represents a possible belief of where the robot is in the scene, and perhaps a heading and velocity. Suppose that when we initialize the filter we have no knowledge of the location of the robot. We would want to scatter the particles uniformly over the entire scene. If there was a large clump of particles near a specific location that would imply that we were more certain that the robot is there. If you think of all of the particles representing a probability distribution, locations where there are more particles represent a higher belief, and locations with fewer particles represents a lower belief.\n",
|
||||
"\n",
|
||||
"Think back to the *Discrete Bayes* chapter. In that chapter we modeled positions in a hallway as discrete and uniformly spaced. This is very similar except the particles are randomly distributed.\n",
|
||||
"\n",
|
||||
@@ -671,7 +675,9 @@
|
||||
" self.weights *= scipy.stats.norm(dist, self.R).pdf(z[i])\n",
|
||||
" self.weights /= sum(self.weights) # normalize\n",
|
||||
"\n",
|
||||
"For reference, in the literature this part of the algorithm is called *Sequential Importance Sampling*, or SIS.\n",
|
||||
"\n",
|
||||
"In the literature this part of the algorithm is called **Sequential Importance Sampling**, or SIS, and the equation for the weights is called the **importance density**. I will give it theoretical underpinnings in a following section. For now I hope that this makes intuitive sense. If we weight the particles according to how how they match the measurements they *probably* are a good sample for the probability distribution of the system after incorporating the measurements. Theory changes 'probably are a good sample' to 'are a good sample'. Different problems will need to tackle this step in slightly different ways.\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"And that is the general framework for the particle filter. The particles and their weights represent the probability distribution of our belief. This algorithm works well for multiple objects; clusters of particles will group around each object. We can compute the position of the robot by computing the mean of the point positions multiplied by their weights. If we have multiple objects we have to run some sort of clustering algorithm to determine which particles belong to which object, but that isn't hard. \n",
|
||||
"\n",
|
||||
@@ -679,7 +685,19 @@
|
||||
"\n",
|
||||
"I want to emphasize that as with the other filters we are using Bayes Theorem in the update step. Compare the Bayes equation to `update()` and you will see why I assert this.\n",
|
||||
"\n",
|
||||
"$$P(A|B) = \\frac{P(B|A) P(A)}{P(B)}$$"
|
||||
"$$P(A|B) = \\frac{P(B|A) P(A)}{P(B)}$$\n",
|
||||
"\n",
|
||||
"**author's note - need more than 'look, similar' here!**\n",
|
||||
"\n",
|
||||
"### Computing the Estimate\n",
|
||||
"\n",
|
||||
"In most applications you will want to know the estimated state after each update, but the filter consists of nothing but a collection of particles. Assuming that we are tracking one object (i.e. it is unimodal) we can compute the mean of the estimate as the sum of the weighted values of the particles. \n",
|
||||
"\n",
|
||||
"$$ \\mu = \\frac{1}{N}\\sum\\limits_{i=1}^N w^ix^i$$\n",
|
||||
"\n",
|
||||
"Here I use the notation $x^i$ to indicate the i$^{th}$ particle. A superscript is used because we often need to use subscripts to denote time steps the k$^{th}$ or k+1$^{th}$ particle, yielding the unwieldy $x^i_{k+1}$. I'm not partial to this notation but it is what is used in the literature.\n",
|
||||
"\n",
|
||||
"This equation seems to be reasonable, but is it? I will discuss this in the *Importance Sampling* section below. For now, just know that the answer is yes, it is reasonable. "
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -692,21 +710,20 @@
|
||||
"\n",
|
||||
"This problem is solved by some form of **resampling** of the particles. If most of the particles have a very small weight this means that most particles are not a very good representation of the probability distribution of the robot. The simplest resampling algorithm endevours to discard particles with very low probability (low weights) and replaces them with particles with higher probability. These particles are taken from the current particle set. This means that some of our particles will be duplicated, but this is not a problem because during the predict step we will be adding random noise to each, so they will separate from their twins. \n",
|
||||
"\n",
|
||||
"One way to accomplish this is to sample from the current particle set `N` times, making a new set of particles from the sample. For this to work the probability of selecting any given particle should be proportional to its weight. The easiest way to accomplish this is to use NumPy's `cumsum` function. `cumsum` computes the *cumulative* sum of an array. That is, element one is the sum of elements zero and one, element two is the sum of elements zero and one, etc. Here is my implementation of this algorithm:\n",
|
||||
"One way to accomplish this is to sample from the current particle set `N` times, making a new set of particles from the sample. For this to work the probability of selecting any given particle should be proportional to its weight. The easiest way to accomplish this is to use NumPy's `cumsum` function. `cumsum` computes the *cumulative* sum of an array. That is, element one is the sum of elements zero and one, element two is the sum of elements zero and one, etc. Then we generate random numbers in the range of 0.0 to 1.0 and do a binary search to find the weight that most closely matches that number. This algorithm is variously called **multinomial resampling** or **simple random resampling**. Here is my implementation:\n",
|
||||
"\n",
|
||||
" def resample(self):\n",
|
||||
" p = np.zeros((self.N, 3))\n",
|
||||
" w = np.zeros(self.N)\n",
|
||||
"\n",
|
||||
" cumsum = np.cumsum(self.weights)\n",
|
||||
" for i in range(self.N):\n",
|
||||
" index = np.searchsorted(cumsum, random())\n",
|
||||
" p[i] = self.particles[index]\n",
|
||||
" w[i] = self.weights[index]\n",
|
||||
"\n",
|
||||
" self.particles = p\n",
|
||||
" self.weights = w / np.sum(w)\n",
|
||||
" cumulative_sum = np.cumsum(self.weights)\n",
|
||||
" cumulative_sum[-1] = 1. # avoid round-off error\n",
|
||||
" indexes = np.searchsorted(cumulative_sum, random(self.N))\n",
|
||||
" \n",
|
||||
" # resample according to indexes\n",
|
||||
" self.particles = self.particles[indexes]\n",
|
||||
" self.weights = self.weights[indexes]\n",
|
||||
" self.weights /= np.sum(self.weights) # normalize\n",
|
||||
" \n",
|
||||
"There are many resampling algorithms. Each has different properties with respect to which particles are sampled, execution time, and memory required. I will share a few of them in a later section.\n",
|
||||
"\n",
|
||||
"You will not necessarily want to resample every iteration. For example, if you received no new measurements you have not received any information from which the resample can benefit. We can determine when to resample by using something called the **effective N**, which is meant to approximate the number of particles with have an appreciable weight which meaningfully contributes to the probability distribution. The equation for this is\n",
|
||||
"\n",
|
||||
"$$\\hat{N}_{eff} = \\frac{1}{\\sum w^2}$$\n",
|
||||
@@ -726,7 +743,7 @@
|
||||
"collapsed": true
|
||||
},
|
||||
"source": [
|
||||
"## A Full Example\n",
|
||||
"## SIR Filter - A Complete Example\n",
|
||||
"\n",
|
||||
"There is much more to cover, but we have covered enough to implement a full particle filter. The filter in this form is called the **Sampling Importantance Resampling filter**, or SIR.\n",
|
||||
"\n",
|
||||
@@ -765,7 +782,7 @@
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<matplotlib.figure.Figure at 0x8700400>"
|
||||
"<matplotlib.figure.Figure at 0x8700780>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
@@ -800,8 +817,7 @@
|
||||
" # move diagonally forward to (x+1, x+1)\n",
|
||||
" pf.predict((0.00, 1.414), (.2, .05))\n",
|
||||
" pf.update(z=zs)\n",
|
||||
" if pf.neff() < N/2:\n",
|
||||
" pf.resample()\n",
|
||||
" pf.resample()\n",
|
||||
"\n",
|
||||
" mu, var = pf.estimate()\n",
|
||||
" xs.append(mu)\n",
|
||||
@@ -866,7 +882,7 @@
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<matplotlib.figure.Figure at 0x86ef940>"
|
||||
"<matplotlib.figure.Figure at 0x87179e8>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
@@ -882,7 +898,7 @@
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"From the plot it looks like there are only a few particles at the first two robot positions. This is not true; there are 5,000 particles, but due to resampling most are duplicates of each other. The reason for this is the Gaussian for the sensor is very narrow. I'll address this in detail below. For now, looking at the second step at x=2 we can see that the particles have dispersed a bit. This dispersion is due to the motion model noise. All particles are projected forward according to the control input `u`, but noise is added to each particle proportional to the error in the control mechanism in the robot. By the third step the particles have dispersed enough to make a convincing cloud of particles around the robot. \n",
|
||||
"From the plot it looks like there are only a few particles at the first two robot positions. This is not true; there are 5,000 particles, but due to resampling most are duplicates of each other. The reason for this is the Gaussian for the sensor is very narrow. This is called **sample impoverishment** and can lead to filter divergence. I'll address this in detail below. For now, looking at the second step at x=2 we can see that the particles have dispersed a bit. This dispersion is due to the motion model noise. All particles are projected forward according to the control input `u`, but noise is added to each particle proportional to the error in the control mechanism in the robot. By the third step the particles have dispersed enough to make a convincing cloud of particles around the robot. \n",
|
||||
"\n",
|
||||
"The shape of the particle cloud is an ellipse. This is not a coincidence. The sensors and robot control are both modeled as Gaussian, so the probability distribution of the system is also a Gaussian. The particle filter is a sampling of the probability distribution, so the cloud should be an ellipse.\n",
|
||||
"\n",
|
||||
@@ -904,7 +920,8 @@
|
||||
"cell_type": "code",
|
||||
"execution_count": 11,
|
||||
"metadata": {
|
||||
"collapsed": false
|
||||
"collapsed": false,
|
||||
"scrolled": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -918,7 +935,7 @@
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<matplotlib.figure.Figure at 0x8733e48>"
|
||||
"<matplotlib.figure.Figure at 0x8eca1d0>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
@@ -962,14 +979,14 @@
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"final position error, variance: [ 13.65122791 -15.53457295] [ 57.83174853 37.12102252]\n"
|
||||
"final position error, variance: [ 13.65600711 -15.87383315] [ 51.52147194 34.40736373]\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<matplotlib.figure.Figure at 0x8796fd0>"
|
||||
"<matplotlib.figure.Figure at 0x8efb400>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
@@ -985,7 +1002,7 @@
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Here the initial sample of points did not generate any points near the robot. The particle filter does not create new points during the resample operation, so it ends up duplicating points which are not a representative sample of the probability distribution. The problem quickly spirals out of control. The particles are not a good match for the landscape measurement so they become dispersed in a highly nonlinear, curved distribution, and the particle filter diverges from reality. No particles are available near the robot, so it cannot ever converge.\n",
|
||||
"Here the initial sample of points did not generate any points near the robot. The particle filter does not create new points during the resample operation, so it ends up duplicating points which are not a representative sample of the probability distribution. As mentioned earlier this is called **sample impoverishment**. The problem quickly spirals out of control. The particles are not a good match for the landscape measurement so they become dispersed in a highly nonlinear, curved distribution, and the particle filter diverges from reality. No particles are available near the robot, so it cannot ever converge.\n",
|
||||
"\n",
|
||||
"Let's make use of the `create_gaussian_particles()` method to try to generate more points near the robot. We can do this by using the `initial_x` parameter to specify a location to create the particles."
|
||||
]
|
||||
@@ -1008,7 +1025,7 @@
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<matplotlib.figure.Figure at 0x887ad30>"
|
||||
"<matplotlib.figure.Figure at 0x92072b0>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
@@ -1031,17 +1048,463 @@
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Resampling Methods\n",
|
||||
"##Importance Sampling\n",
|
||||
"\n",
|
||||
"How we resample the particles effects the performance of the filter. For example, suppose we resampled particles by generating a random number from 1 to $N$ and used that as the index of the particle we resample. This would lead us to choosing many particles with a very low weight, and the resulting set of particles would be a terrible representation of the problem's probability distribution. \n",
|
||||
"In the filter above I hand waved a difficulty away. There is some probability distribution that describes the position and movement of our robot. This might be impossible to integrate analytically, so we want to draw a sample of particles from that distribution and compute the integral using MC methods. \n",
|
||||
"\n",
|
||||
"There is plenty of room for research and novel algorithms, but research and industry have settled on handful of algorithms that work well in practice. We desire an algorithm that has several properties. It should preferentially select particles that have a higher probability. It should select a representative population of the higher probability particles. It should include enough lower probability particles to give the filter a chance of detecting strongly nonlinear behavior. "
|
||||
"But our difficulty is that in many problems, including this one, we don't know that distribution. For example, the tracked object might move very differently than we predicted with our state model. How can we draw a sample from a probability distribution that is unknown? \n",
|
||||
"\n",
|
||||
"There is a theorem and associated techniques from statistics called **importance sampling**[1]. It somewhat remarkably gives us a way to draw samples from a *different* and known probability distribution compute the properties of the known one. It's a fantastic theorem that brings joy to my heart. \n",
|
||||
"\n",
|
||||
"The idea is simple, and we already used it. We draw samples from the known probability distribution, but *weight the particles* according to the distribution we are interested in. We can then compute properties such as the mean and variance by computing the weighted mean and weighted variance of the samples.\n",
|
||||
"\n",
|
||||
"For the robot localization problem we drew samples from the probability distribution that we computed from our state model prediction step. In other words, we said 'the robot was there, it is perhaps moving at this direction and speed, hence it might be here'. Of course the robot might have done something completely different than we predicted (fell off a cliff, hit by a mortar round, airlifted away, etc), so that probability distribution is not correct. It seems like we are stymied, but we are not because we can use importance sampling. So we drew particles from that likely incorrect probability distribution, then weighted them according to how well the particles match the measurements. That weighting is based on the true probability distribution, so according to the theory the resulting mean, variance, etc, will be correct. Magic!\n",
|
||||
"\n",
|
||||
"How can that be true? I'll give you the math; you can safely skip this if you don't plan to go beyond the robot localization problem. However, other particle filter problems require different approaches to importance sampling, and a bit of math helps. Also, the literature and much of the content on the web uses the mathematical formulation in favor of my rather imprecise \"imagine that...\" exposition. If you want to understand the literature you will need to now the following equations.\n",
|
||||
"\n",
|
||||
"We have some probability distribution $\\pi(x)$ which we want to take samples from. However, we don't know what $\\pi(x)$ is; instead we only know an alternative probability distribution $q(x)$. In the context of robot localization, $\\pi(x)$ is the probability distribution for the robot, but we don't know it, and $q(x)$ is the probability distribution of our measurements, which we do know.\n",
|
||||
"\n",
|
||||
"We can **blah**\n",
|
||||
"\n",
|
||||
"$$I = \\int f(x)\\pi(x)\\, \\mathsf{d}x$$\n",
|
||||
"\n",
|
||||
"We don't know $\\pi(x)$ so we cannot compute this integral. We do know $q(x)$ so we can add it into the integral without changing the value with\n",
|
||||
"\n",
|
||||
"$$I = \\int f(x)\\pi(x)\\frac{q(x)}{q(x)}\\, \\mathsf{d}x$$\n",
|
||||
"\n",
|
||||
"Now we rearrange and group terms\n",
|
||||
"\n",
|
||||
"$$I = \\int f(x)q(x)\\, \\, \\cdot \\, \\frac{\\pi(x)}{q(x)}\\, \\mathsf{d}x$$\n",
|
||||
"\n",
|
||||
"$q(x)$ is known to us, so we can compute $\\int f(x)q(x)$ using MC integration. That leaves us with $\\frac{\\pi(x)}{q(x)}$. That is just a ratio, and we define it as a *weight*. This gives us\n",
|
||||
"\n",
|
||||
"$$I = \\sum\\limits_{i=1}^N f(x^i)w(x^i)$$\n",
|
||||
"\n",
|
||||
"Maybe that seems a little abstract. If we want to compute the mean of the particles we would compute\n",
|
||||
"\n",
|
||||
"$$\\mu = \\sum\\limits_{i=1}^N x^iw^i$$\n",
|
||||
"\n",
|
||||
"which is the equation I gave you earlier in the chapter.\n",
|
||||
"\n",
|
||||
"It is required that the weights be *proportional* to the ratio $\\frac{\\pi(x)}{q(x)}$. We normally do not know the exact value, so in practice we normalize the weights by dividing them by $\\sum w(x^i)$.\n",
|
||||
"\n",
|
||||
"When you formulate a particle filter algorithm you will have to implement this step depending on the particulars of your situation. For robot localization the best distribution to use for $q(x)$ is the particle distribution from the `predict()` step of the filter. Let's look at the code again:\n",
|
||||
"\n",
|
||||
" def update(self, z):\n",
|
||||
" self.weights.fill(1.)\n",
|
||||
" for i, landmark in enumerate(self.landmarks):\n",
|
||||
" dist = np.linalg.norm(self.particles[:, 0:2] - landmark, axis=1)\n",
|
||||
" self.weights *= scipy.stats.norm(dist, self.R).pdf(z[i])\n",
|
||||
" self.weights /= sum(self.weights) # normalize\n",
|
||||
" \n",
|
||||
"The reason for `self.weights.fill(1.)` might have confused you; it confused me the first time I saw it. In all the Bayesian filters up to this chapter we started with the probability distribution created by the `predict` step, and this appears to discard that information by setting all of the weights to 1. Well, we are discarding the weights, but we do not discard the particles. That is a direct result of applying importance sampling - we draw from the known distribution, but weight by the unknown distribution. \n",
|
||||
"\n",
|
||||
"In other filters you will retain weights in this step. If you can determine the probability distribution directly, for example, it makes no sense to approximate it by sampling from a different probability distribution. The problem you are trying to solve is $I = \\int f(x)\\pi(x)\\, \\mathsf{d}x$, and importance sampling give you the tool to do that when $\\pi(x)$ is unknown. If you can formulate this more exactly, do so!\n",
|
||||
"\n",
|
||||
"**author's note: i don't like this last paragraph; too hand wavey. get specific**"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": []
|
||||
"source": [
|
||||
"## Resampling Methods\n",
|
||||
"\n",
|
||||
"How we resample the particles effects the performance of the filter. For example, suppose we resampled particles by generating a random number from 1 to $N$ and used that as the index of the particle we resample. This would lead us to choosing many particles with a very low weight, and the resulting set of particles would be a terrible representation of the problem's probability distribution. \n",
|
||||
"\n",
|
||||
"There is plenty of room for research and novel algorithms, but research and industry have settled on handful of algorithms that work well in practice across a wide variety of situations. We desire an algorithm that has several properties. It should preferentially select particles that have a higher probability. It should select a representative population of the higher probability particles to avoid sample impoverishment. It should include enough lower probability particles to give the filter a chance of detecting strongly nonlinear behavior. \n",
|
||||
"\n",
|
||||
"I will give you a couple of the most commonly used algorithms; with that information you should be able to search and find alternative should these prove deficient for your application.\n",
|
||||
"\n",
|
||||
"FilterPy implements several of the popular algorithms. FilterPy doesn't know how your particle filter is implemented, so it doesn't make sense to have the resample algorithm generate the new samples. Instead, the algorithms just create an ndarray containing the indexes of the weights and particles that are chosen; your class or code needs to perform the resampling step. For example, the robot localization class implements this with\n",
|
||||
"\n",
|
||||
" def resample_from_index(self, indexes):\n",
|
||||
" assert len(indexes) == self.N\n",
|
||||
"\n",
|
||||
" self.particles = self.particles[indexes]\n",
|
||||
" self.weights = self.weights[indexes]\n",
|
||||
" self.weights /= np.sum(self.weights)\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"### Multinomial Resampling\n",
|
||||
"\n",
|
||||
"Multinomial resampling is the algorithm that I used while developing the robot localization example. The idea is simple. Compute the cumulative sum of the normalized weights. This gives you an array of increasing values from 0 to 1. Here is a plot which illustrates how this spaces out the weights."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 14,
|
||||
"metadata": {
|
||||
"collapsed": false
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"[ 0.1 0.3 0.4 1. ]\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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\nOP8CSdsd9j7kQ7EAAAAASUVORK5CYII=\n",
|
||||
"text/plain": [
|
||||
"<matplotlib.figure.Figure at 0x980edd8>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"from pf_internal import plot_cumsum\n",
|
||||
"print(np.cumsum([.1, .2, .1, .6]))\n",
|
||||
"plot_cumsum([.1, .2, .1, .6])"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"To select a weight we generate a random number uniformly selected between 0 and 1 and use binary search to find its position inside the cumulative sum array. Large weights will be a further distance from its neighbors than low weights, so they will be more likely to be selected. \n",
|
||||
"\n",
|
||||
"\n",
|
||||
"This is very easy to code using NumPy's ufunc support. `searchsorted` is NumPy's binary search algorithm. If you provide is with an array of search values it will return an array of answers; one answer for each search value. \n",
|
||||
"\n",
|
||||
" def multinomal_resample(weights):\n",
|
||||
" cumulative_sum = np.cumsum(weights)\n",
|
||||
" cumulative_sum[-1] = 1. # avoid round-off errors\n",
|
||||
" return np.searchsorted(cumulative_sum, random(len(weights)))\n",
|
||||
" \n",
|
||||
"Here is an example:"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 15,
|
||||
"metadata": {
|
||||
"collapsed": false
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<matplotlib.figure.Figure at 0x98571d0>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"from pf_internal import plot_multinomial_resample\n",
|
||||
"plot_multinomial_resample([.1, .2, .3, .4, .2, .3, .1])"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"This is an O(n log(n)) algorithm. That is not terrible, but there are O(n) resampling algorithms with better properties with respect to the uniformity of the samples. I show it to you first merely because you can understand the other algorithms as variations on this one. There is a faster implementation of this algorithm that uses the inverse of the CDF of the distribution, but since we will not be using this much, if ever, I won't cover it. You can search on the internet if you are interested.\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"You may import this from FilterPy using\n",
|
||||
"\n",
|
||||
" from filterpy.monte_carlo import multinomal_resample"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Residual Resampling\n",
|
||||
"\n",
|
||||
"Residual resampling both improves the run time of multinomial resampling, and ensures that the sampling is uniform across the population of particles. It's fairly ingenious: the normalized weights are multiplied by *N*, and then the integer value of each weight is used to define how many samples of that particle will be taken. For example, if the weight of a particle is 0.0012 and $N$=3000, the scaled weight is 3.6, so 3 samples will be taken of that particle. This ensures that all higher weight particles are chosen at least once, and has O(N) running time.\n",
|
||||
"\n",
|
||||
"However, this does not make *N* selections. To select the rest, we take the *residual*: the weights minus the integer part, which leaves the fractional part of the number. We then use a simpler sampling scheme such as multinomial, to select the rest of the particles based on the residual. In the example above the scaled weight was 3.6, so the residual will be 0.6 (3.6 - int(3.6)). This residual is very large so the particle will be likely to be sampled again. This is reasonable because the larger the residual the larger the error in the round off, and thus the particle was relatively under sampled in the integer step.\n",
|
||||
"\n",
|
||||
"\n",
|
||||
" def residual_resample(weights):\n",
|
||||
" N = len(weights)\n",
|
||||
" indexes = np.zeros(N, 'i')\n",
|
||||
"\n",
|
||||
" # take int(N*w) copies of each weight\n",
|
||||
" num_copies = (N*np.asarray(weights)).astype(int)\n",
|
||||
" k = 0\n",
|
||||
" for i in range(N):\n",
|
||||
" for _ in range(num_copies[i]): # make n copies\n",
|
||||
" indexes[k] = i\n",
|
||||
" k += 1\n",
|
||||
"\n",
|
||||
"\n",
|
||||
" # use multinormial resample on the residual to fill up the rest.\n",
|
||||
" residual = w - num_copies # get fractional part\n",
|
||||
" residual /= sum(residual) # normalize\n",
|
||||
" cumulative_sum = np.cumsum(residual)\n",
|
||||
" cumulative_sum[-1] = 1. # avoid round-off errors: ensures sum is exactly one\n",
|
||||
" indexes[k:N] = np.searchsorted(cumulative_sum, random(N-k))\n",
|
||||
"\n",
|
||||
" return indexes\n",
|
||||
"\n",
|
||||
"You may be tempted to replace the inner for loop with a slice `indexes[k:k + num_copies[i]] = i`, but very short slices are comparatively slow, and the for loop usually runs faster.\n",
|
||||
"\n",
|
||||
"Let's look at an example:"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 16,
|
||||
"metadata": {
|
||||
"collapsed": false
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<matplotlib.figure.Figure at 0x91f32e8>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"from pf_internal import plot_residual_resample\n",
|
||||
"plot_residual_resample([.1, .2, .3, .4, .2, .3, .1])"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"You may import this from FilterPy using\n",
|
||||
"\n",
|
||||
" from filterpy.monte_carlo import residual_resample"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Stratified Resampling\n",
|
||||
"\n",
|
||||
"This scheme aims to make selections relatively uniformly across the particles. It works by dividing the cumulative sum into $N$ equal sections, and then selects one particle randomly from each section. This guarantees that each sample is between 0 and $\\frac{2}{N}$ apart.\n",
|
||||
"\n",
|
||||
"The plot below illustrates this. The colored bars show the cumulative sum of the array, and the black lines show the $N$ equal subdivisions. Particles, shown as black circles, are randomly placed in each subdivision."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 17,
|
||||
"metadata": {
|
||||
"collapsed": false
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<matplotlib.figure.Figure at 0x7dbbe10>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"from pf_internal import plot_stratified_resample\n",
|
||||
"plot_stratified_resample([.1, .2, .3, .4, .2, .3, .1])"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"The code to perform the stratification is quite straightforward. \n",
|
||||
"\n",
|
||||
" def stratified_resample(weights):\n",
|
||||
" N = len(weights)\n",
|
||||
" # make N subdivisions, and chose a random position within each one\n",
|
||||
" positions = (random(N) + range(N)) / N\n",
|
||||
"\n",
|
||||
" indexes = np.zeros(N, 'i')\n",
|
||||
" cumulative_sum = np.cumsum(weights)\n",
|
||||
" i, j = 0, 0\n",
|
||||
" while i < N:\n",
|
||||
" if positions[i] < cumulative_sum[j]:\n",
|
||||
" indexes[i] = j\n",
|
||||
" i += 1\n",
|
||||
" else:\n",
|
||||
" j += 1\n",
|
||||
" return indexes\n",
|
||||
"\n",
|
||||
"Import it from FilterPy with\n",
|
||||
"\n",
|
||||
" from filterpy.monte_carlo import stratified_resample"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Systematic Resampling\n",
|
||||
"\n",
|
||||
"The last algorithm we will look at is systemic resampling. As with stratified resampling the space is divided into $N$ divisions. We then choose a random offset to use for all of the divisions, ensuring that each particle is exactly $\\frac{1}{N}$ apart. It looks like this."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 18,
|
||||
"metadata": {
|
||||
"collapsed": false
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAZMAAABCCAYAAACSCTtfAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAFO9JREFUeJzt3X9UU+UfB/D3MwcbvxyCAlsH2UQsCbH80THQwERNSwop\nrcAfmKUhVgaZmpZoRnZCzd8zS9TKivKEnpRKzV/oKY3KSiwLQUGUA8gi+TF+PN8/5vb1ujudDhib\nn9c5Owfuc++z53nu3f3seZ57dxnnnIMQQgixgcTeBSCEEOL4KJgQQgixGQUTQgghNqNgQgghxGYU\nTAghhNiMggkhhBCbUTAhTkutVkOj0di7GLe9oqIiSCQSJCUlCZZPnjwZEokEZ8+etVPJSGuiYHKb\nyMrKgkQiQXp6ur2L0mrUajUkEsuHMGMMjLF2LBG5nmv3Be0f50LB5DbjbB/e69Vn37592Lt3bzuW\nhtyMjIwMFBQUQKVS2bsopBVI7V0A0r5upx88oCGuji0gIAABAQH2LgZpJdQzaSc7d+5ETEwMVCoV\n5HI5VCoVBg8ejIyMDNM6Tz31FCQSCQ4ePCiaR25uLiQSCSZOnGhaVlhYiGnTpiEkJATu7u7w8fFB\naGgonnnmGZw7dw6AYWx6ypQpAID09HRIJBLT69r3+vLLLxETEwMfHx/I5XL06tULc+fORU1NjVl5\njMNMTU1NWLRoEYKDg+Hm5obevXvjww8/BGAIXitXrsTdd98Nd3d3BAYGIj09XTSoZWVlIT4+Hj16\n9IC7uzsUCgUGDx6MrVu3CtYzjsGfPXsWnHNBfYYOHSoon6WA8vnnn2P48OHw9fWFXC6HWq3GuHHj\nkJeXJ7r+tSQSCTQaDf7991+89NJLCAoKgouLC9577z3TOvn5+XjyySehUqkgk8mgUqkwceJE/PPP\nP2b5lZeXY/bs2bjrrrvg6ekJhUKBXr16ISEhASdOnLildjKKjo6GRCJBUVERVq9ejdDQULi5uUGj\n0WDp0qWm9T7++GMMGDAAnp6e8Pf3xwsvvICGhgaLddfpdEhOToZKpYKbmxvCwsKwdu1aq9oPEJ8z\nMe7boUOHorKyEs899xyUSiXkcjnCwsKQlZUlmldDQwMWLlyIHj16QC6Xo0ePHliwYAEaGhrMjgvS\nNqhn0g42bNiA6dOnIyAgAI888gj8/PxQUVGBP/74A1qtFnPnzgUAzJgxA5999hm0Wi0eeOABs3y0\nWi0YY5g+fToAoKysDAMHDkRNTQ1GjRqF+Ph46PV6FBcXY/v27UhISEBgYCDi4uKg0+mQk5OD6Oho\nREdHm/IMCgoy/Z2cnIz169cjMDAQ8fHx6NKlC44ePYqlS5di165dyMvLg6enp1m5xo8fj/z8fIwe\nPRotLS3Ytm0bpk6dCqlUiqNHj2L79u0YM2YMYmJikJ2djfT0dLi5uWH27NmCfJKTkxEWFobo6Ggo\nlUpUVFRg165dmDRpEk6dOoUlS5YAALp06YI33ngDK1asgE6nw8KFC015qNVqQZ7XDoNxzpGUlIQt\nW7aga9euiIuLg7+/P0pKSnDw4EF8+eWXiIyMvPFOheEENnToUPz77794+OGHTcESMJyYJ0+eDLlc\njtjYWAQGBuL06dPYtm0bdu7cif3796Nv374AgNraWkRERKCwsBAxMTGIjY0FAJw9exZ79+7FsGHD\nEB4eftPtdK20tDQcOnQIY8aMwfDhw5GdnY25c+eioaEBMpkMS5YsQVxcHKKiorBz506sXr0aTU1N\nogFCr9cjJiYGNTU1SExMRH19PbKzs5GSkoK//voLK1assKoNLQ1TVldXIzIyEjKZDOPGjUNDQwM+\n//xzTJkyxewLFecc8fHx2LVrF0JCQjBz5kzo9XpkZWXh999/v+77kFbESZvr168fl8vlvLy83Cyt\nsrJS8H94eDiXyWS8oqJCsLy0tJRLpVIeHh5uWrZy5UrOGOPvvfeeWb56vZ7/999/pv83bdrEGWM8\nPT1dtIxbt27ljDEeHx/P6+vrBWlvvvkmZ4zx1NRUwfKgoCDOGOORkZGC9zpy5AhnjPHOnTvzXr16\nCepdVFTEXV1debdu3XhTU5Mgv8LCQtF6DBs2jEulUl5SUmL2/hKJRLQ+xnSNRiNYptVqOWOMDxw4\nkFdXVwvSWlpaeGlpqcX8rsYY44wxPmLECF5XVydIO336NJfJZLxnz578/PnzgrT9+/dzqVTK+/fv\nb1q2Y8cOzhjjs2bNMnuflpYWs3LebDtFRUVxxhgPCQkR3Rfu7u7c39+f//3336Y0nU7Hu3XrxmUy\nmdlxa6z7kCFDuF6vNy2vqKjgGo2GM8b4kSNHTMvPnDnDGWM8KSlJkM+kSZM4Y4wXFxebrcsY488+\n+yxvaWkxpZ08eZJLpVIeGhoqyGfLli2cMcYHDx4sKE91dTW/6667OGOMDx061KzNSOuiYa520qlT\nJ0il5h1BHx8fwf/PP/889Ho9Nm3aJFi+ceNGNDc3Y9q0aaZlxm9bcrncLF8XFxd4eHhYXb7ly5dD\nKpVi48aNkMlkgrQ5c+bA19cXH3/8sei2b731luC97r//fmg0GtTU1OC1115Dt27dTGlBQUGIjIxE\nRUUFzp8/L8hHbEjKxcUFycnJaG5uxr59+6yujyWrVq0CYwzr1q2DQqEQpDHGbmoymDGGd99916z9\n161bB71ej+XLl0OpVArSoqKiMGbMGOTn56OgoECQJrYfGWNm5bzVdpo/f77ZvhgyZAjq6uqQnJyM\n4OBgU1rnzp3xyCOPQK/X49SpU6LlysjIgIuLi2mZr6+vqZd97fF7szw8PLBs2TJBj6J3796IiIjA\nqVOnUFtba1q+efNmAMDixYsF5VEoFFiwYIFN5SDWo2GudpCYmIjU1FSEhoZi/PjxGDJkCCIiIsxO\nNAAwYcIEvPrqq9iwYQPS0tIAAM3Nzdi4cSM8PT0xYcIE07qxsbGYN28eUlJSkJubixEjRuD+++9H\neHj4TXXra2tr8fPPP8PX19fi8ISrqyvKyspQVVUlCICMMdx7771m6yuVSpw5c0Y0zXjCLikpMQ0L\nAYZhnaVLl2Lv3r04d+4c6urqBNtdG3xu1uXLl/HHH3+ga9eu6N+/v015AYaTf58+fcyWG+ddDhw4\ngOPHj5ulX7x4EQBQUFCA3r17Izo6GnfccQeWLl2K48ePY/To0YiMjES/fv3QqVMns+1vtZ3E9oVx\nAvxG++laUqkUERERZsujoqIAAL/88otoGawVEhIiOqQaGBgIzjkuXboEd3d3AMDPP/8MiUQiOjxp\n7ZAlsR0Fk3Ywa9Ys+Pn5Yd26dVizZg1WrlwJABg0aBAyMjJMH0DA8I1swoQJWLt2rWm8fNeuXSgp\nKcHUqVPh5eVlWrd79+44duwY0tPTkZubi6+++goA4O/vj5kzZ2LOnDnXvQ/D6NKlSwCAyspKLFq0\nyOJ6jDFcvnzZrDd1dZmMjL2wa79VX53W2NhoWlZYWIj77rsP1dXVeOCBB/DQQw9BoVCgU6dOOHPm\nDDZv3iw6GXwzqqurAQB33HGHTfkY+fn5iS6vrKwEAGRmZlrc1tiWgKH9fvjhB6Snp2PHjh3Ys2cP\nAMDb2xtTpkzB4sWL4ebmBsC2drrevrB2Pxl17dpV9AuLsU10Op3FulvD29tbdLmxTM3NzaZlOp0O\nCoVC0Csx8vf3t6kcxHoUTNpJQkICEhIS8N9//+Ho0aPYsWMH3n//fYwaNQq//vorQkJCTOsmJydj\n7dq10Gq1GDZsGLRaLQCYJt6vduedd+KTTz5BS0sLfvvtN+zbtw9r1qzB/Pnz0dzcbFU333giCQ8P\nt/kb5a1atmwZqqqqkJWVJZhcBYBt27aZhjJsYTxBlZaW2pwXYHlSV6FQgDGGyspKiyfFa6lUKmi1\nWmi1Wvz555/Yv38/1q9fj2XLluHSpUv44IMPALRPO1mjoqICnHOzNjD2usSCU1vp3LkzdDodGhsb\nzQKKsTyk7dGcSTvz9PTE8OHDsWrVKqSmpqK+vh67d+8WrBMaGoqoqCjk5OTg2LFj2L17NwYMGIB+\n/fpZzFcikaBv376YNWuWKT9jTwWAabjk6m90V5cpLCwMBQUFpm/V7e3vv/8GYwzx8fFmaQcOHBDd\nxlgnbuW9Mx4eHggLC0NFRYXo8FNriYiIAOfc4iXeN3LnnXdi2rRpOHToEFxdXQX78VbaqS00NTWJ\nXkZtLIPYsFlb6devH1paWnD48GGzNLFlpG1QMGkHliZEy8rKAEB0ojw5ORmNjY0YO3YsOOeivZL8\n/HzT0I1YvsYxZcAwLAEAxcXFomVJTU1FY2MjkpKSTMNeV6upqcGPP/4ouq0lNzNvo9FowDnH999/\nL1j+zTffYOPGjaLb+Pr6gnNusU5iXnjhBQCGCx2uHYrhnJvazhYpKSlwdXVFamoq/vzzT7P0pqYm\nQT1PnjyJCxcumK1XUVGBxsZGwX68lXYCWv/SWM455s2bB71eLyhvRkYGGGNmv8PVlow9tAULFgjK\no9PpsHjx4nYrx+2OhrnawdixY+Hp6YlBgwYhKCgIjDH8+OOPOHz4MHr27Ilx48aZbRMXFwelUonS\n0lIoFAo89dRTZuts2bIFWq0WkZGRCA4Ohq+vL4qLi5GTkwOpVCq4jyMiIgIeHh749NNP4eLigu7d\nu4MxhokTJ6J79+6YNGkS8vPzsWrVKgQHB2PkyJEICgpCdXU1ioqKcOjQIYwcORLbt2+3ut7W9hgA\nQ/DctGkTnnjiCTz++ONQKpX4/fff8c0332DcuHH47LPPzLYZMWIEjh8/jrFjx2LUqFFwc3ODWq1G\nYmKixfeZOnUqDh8+jC1btqBnz5547LHH0K1bN5SVleHAgQN49NFHsXz5cqvLLaZXrLine truncated
|
||||
"text/plain": [
|
||||
"<matplotlib.figure.Figure at 0x7d1c208>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"from pf_internal import plot_systematic_resample\n",
|
||||
"plot_systematic_resample([.1, .2, .3, .4, .2, .3, .1])"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"The code couldn't be simpler.\n",
|
||||
"\n",
|
||||
" def systematic_resample(weights):\n",
|
||||
" N = len(weights)\n",
|
||||
"\n",
|
||||
" # make N subdivisions, choose positions with a consistent random offset\n",
|
||||
" positions = (np.arange(N) + random()) / N\n",
|
||||
"\n",
|
||||
" indexes = np.zeros(N, 'i')\n",
|
||||
" cumulative_sum = np.cumsum(weights)\n",
|
||||
" i, j = 0, 0\n",
|
||||
" while i < N:\n",
|
||||
" if positions[i] < cumulative_sum[j]:\n",
|
||||
" indexes[i] = j\n",
|
||||
" i += 1\n",
|
||||
" else:\n",
|
||||
" j += 1\n",
|
||||
" return indexes\n",
|
||||
" \n",
|
||||
"Import from FilterPy with\n",
|
||||
"\n",
|
||||
" from filterpy.monte_carlo import systematic_resample"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Choosing a Resampling Algorithm\n",
|
||||
"\n",
|
||||
"Let's look at the four algorithms at once so they are easier to compare."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 19,
|
||||
"metadata": {
|
||||
"collapsed": false,
|
||||
"scrolled": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<matplotlib.figure.Figure at 0x873a908>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<matplotlib.figure.Figure at 0x8e83cc0>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<matplotlib.figure.Figure at 0x920d2b0>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<matplotlib.figure.Figure at 0x8e895f8>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"a = [.1, .2, .3, .4, .2, .3, .1]\n",
|
||||
"np.random.seed(4)\n",
|
||||
"plot_multinomial_resample(a)\n",
|
||||
"plot_residual_resample(a)\n",
|
||||
"plot_systematic_resample(a)\n",
|
||||
"plot_stratified_resample(a)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"The performance of the multinomial resampling is quite bad. There is a very large weight that was not sampled at all. The largest weight only got one resample, yet the smallest weight was sample was sampled twice. Most tutorials on the net that I have read use multinomial resampling, and I am not sure why. Multinomial rarely used in the literature or for real problems. I recommend not using it unless you have a very good reason to do so.\n",
|
||||
"\n",
|
||||
"The residual resampling algorithm does excellently at what it tries to do: ensure all the largest weights are resampled multiple times. It does do well at evenly distributing the samples across the particles - many reasonably large weights are not resampled at all. \n",
|
||||
"\n",
|
||||
"Both systematic and stratified perform very well. Systematic sampling does an excellent job of ensuring we sample from all parts of the particle space while ensuring larger weights are proportionality resampled more often. Stratified resampling is not quite as uniform as systematic resampling, but it is a bit better at ensuring the higher weights get resampled more.\n",
|
||||
"\n",
|
||||
"Plenty has been written on the theoretical performance of these algorithms, and feel free to read it. In practice I apply particle filters to problems that resist analytic efforts, and so I feel a bit dubious about the validity of a specific analysis to these problems. In practice both the stratified and systematic algorithms perform well and very similarly across a variety of problems. I say try one, and if it works stick with it. If performance of the filter is critical try both, and perhaps see if there is literature published on your specific problem that will give you better guidance. "
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### SIR Filter Discussion and Summary\n",
|
||||
"\n",
|
||||
"The SIR filter was one of the earlier particle filters invented, and it has various strengths and weaknesses. On the plus side it places very few restrictions on the problem. You need to know the behavior of the state model so that the particles can be propagated forward. You need to know the measurement functions so that measurements can be converted into state space. Finally, you need to be able to specify the likelyhood function so that the resulting probability is at least proportional to the "
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## References\n",
|
||||
"\n",
|
||||
"[1] *Importance Sampling*, Wikipedia.\n",
|
||||
"https://en.wikipedia.org/wiki/Importance_sampling\n",
|
||||
"\n",
|
||||
"\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
|
||||
+32
-10
@@ -1603,16 +1603,37 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 76,
|
||||
"execution_count": 86,
|
||||
"metadata": {
|
||||
"collapsed": false
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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\n1fLzeDyoq6vL1IQCgJGRUZ3O6+fnB0D0U2VVUVFRiIiIgIeHB6ytraXK5P2NXuWcYvPnz4ednR23\nrK+vD19fXwiFQowaNQq9e/fmytTU1DBhwgQA4JpZAcCJEycQFxeHOXPmYMCAAVLHNzc3x2effYaS\nkhKpJijipjovs7Kywrhx4xATE4O0tDSZcnnPu1WrVq/wjGs2c+ZMdOnSRWrd61wXYnZ2dli0aJHU\nuvfffx+AqKnMunXrpMree+89AMC9e/e4dUKhEFu2bIGZmRk2b94sVTvG4/EQGBgIHo+HX3/9Veb8\nPB4P33//PTQ0NLh1JiYm8PX1RWFhIWJjY7n1tb2n6+NaJ6S50tDQQFBQkNQvg1u2bAEA7NixA/r6\n+lLbv/fee+jWrRuOHDmCFy9eSJXJu8+pqalBR0enxhiuXLmC2NhYuLu7Y8yYMVJls2fPhr29fb31\ngZH32aumpoY5c+ZAIBDIbVL5MrqnkJpQ0xoAly9fBgCcP38eERERMuXi9nnR0dHo0KEDPD09YWVl\nhcDAQERERGDYsGHo168fevToIfeN9iZeboIDiJK+6sosLS0BQCa5y8vLw4YNG3DixAkkJiaiuLhY\nqjw9Pb3OMYlfr8LCQgQEBMiU5+bmAoDUF58pU6YgODgYHTp0wPjx49G/f3+4u7u/0k1o9OjRMDQ0\nxN69exEUFARVVdHlK26bLE70AaBjx47o1q0b9u/fj+TkZIwaNQr9+vVDr169qk3ua/KqfwfxF8Kq\nfwfx65aSkiL3dYuLiwMAmS+Mly9fxpYtW3D16lXk5uZyzVjE0tPT0aZNGwCiD71Dhw7Bzc0NEyZM\ngKenJ/r27QsbG5s6PtO6qfrFpWqcwKtdF2LiZmtViV9fcV+CquS9vrGxscjLy0P79u2xevVquXFr\nampy7e6rMjAwkPqiJib+eb66/g7y1Me1TkhzZWNjIzOCzOXLl6GqqooDBw7I7UtTVlYGgUCAmJgY\n9OjRA6NGjcKXX36JTz75BKdOncLgwYPRt29fdOnSpU6jSd2+fRsA5Dav5PF46NevH+Lj41/zGUpL\nTU1FYGAgzp49i8ePH6OkpESqPCMjo9Zj0D2F1IQSeYiSXAD47rvvqt2Gx+NxtQF6enq4fv06Vq1a\nhaNHj+LMmTMARG3Ip0+fjq+//lom8XhdVWv3xcQJbE1lVTv1FRQUwNXVFcnJyXBzcLine truncated
|
||||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAvIAAAE6CAYAAAB0yLYIAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xd4U9UbB/Bv0pF0l5YOOuigpVCm0DJa2bZMyx4CQgVE\nBVFQRNEKBRUoIIqAyE9QKggupjKs7CUIUkYptJTuSfeeyfn9EXPTS5IOaJu0fT/P06e5955782bd\nvDn3DAFjjIEQQgghhBDSrAg1HQAhhBBCCCGk/iiRJ4QQQgghpBmiRJ4QQgghhJBmiBJ5QgghhBBC\nmiFK5AkhhBBCCGmGKJEnhBBCCCGkGaJEXsPOnTsHoVCIVatWaToUQgghpEV5mu/Y4OBgCIVCXLhw\noREjU23w4MEQCik1I3VH75ZGJj+JvPLKKzWWEwgETRRR3chPJomJiZoOhRCtUtfPNCFEe2jbd2xN\nmlOsRPN0NR1Aa6Hug9m3b188ePAAbdu2beKIakcnE0LUo88HIdpPm79jCWkIlMg3EXUT6BoYGKBj\nx45NHE3dMMbUxk1Ia0efDUK0nzZ/xxLSEKhpTTU3b97EtGnTYGdnB5FIBDs7O8yaNQuPHj1SKvv4\n8WMsW7YMnTp1grGxMczMzNCxY0fMmDEDd+7cASBrZzd06FAAQGhoKIRCIfcXGhoKQH37PXnTlvj4\neGzduhWenp4wMDCAi4sLQkJCuHI//vgjvLy8YGxsDBsbG7z11lsoLy9Xivfw4cOYOXMmOnbsCGNj\nYxgbG6N3797YvHkzpFIpr2z1toEuLi5czC4uLrxy+fn5WLFiBbp27QojIyOYmppiwIAB+O2331Q+\nvz/88AN8fX1hbW0NAwMDODo6YtiwYdi5c2eNrwsArFu3DkKhEJs2bVK5PScnByKRCB06dODWFRYW\n4tNPP0W3bt1gbm4OExMTuLq6YuLEiTh//nyt9wkAgYGBEAqFOH/+PPbv34/evXvDyMgI9vb2eO+9\n91BZWQkAOHnyJAYMGABTU1NYWFhg9uzZyM3NVXnM9PR0LF68GO7u7jAwMICFhQWGDx+OM2fOKJUt\nKCjAhg0bMHToUDg4OEAkEsHa2hoBAQH4+++/VR7/4sWLCAgIgKOjI8RiMWxsbODt7Y2lS5eqfGyq\nmk/Fx8erbD5S/fnYs2cPvL29YWxsjOeee44rU5/3RfVmKo8ePcKkSZNgaWkJU1NTjBgxApGRkdxz\nNmfOHNja2sLAwAB9+vRR+xpKpVLs3LkTvr6+MDMzg4GBAbp164Z169Zxr1d18vd2SUkJ3nvvPbRv\n3x5isRju7u5Yv349r2xdPtPAs73XCWmJ5OeUIUOGIDU1FXPmzEG7du2gq6uLI0eOAADOnj2LgIAA\nWFlZQSQSwdnZGQsXLkRGRobS8WJjY/Haa6/B3d0dhoaGsLCwgKenJ+bOnYukpCSuXE1t5P/991+M\nGDECJiYmMDMzg5+fH65evVpj/Oqa1Kk7n+7evRsTJ06Eq6srDA0NYWZmhueffx579uyp83MH0DmF\nqEc18v/58ccfERgYCLFYzCVBDx8+xP79+/H777/j3Llz6NGjBwCgpKQEPj4+iI2NxQsvvICAgAAA\nQGJiIk6fPo1hw4ahe/fuGDJkCBISEhAaGoqePXti3Lhx3P1VT3wA9Zfply5diosXL+LFF1+En58f\nfv31Vyxfvhzl5eUQiUT47LPPMH78eAwaNAi///47tm7diqqqKnz99de84yxfvhw6Ojro378/7O3t\nkZ+fj9OnT2PJkiX4559/8OOPP3JlV65cid27dyMhIQGLFy+Gubk5AHD/ASAlJQVDhgxBTEwMBg4c\niOHDh6OoqAjHjh3DlClTsHLlSqxcuZIr/+GHH2LdunVwcXHBlClTYG5ujvT0dNy6dQt79uzBvHnz\nanx9Zs2ahaCgIISGhuKdd95R2r5//35UVlZi9uzZAGS1pSNGjMDff/+Nvn37Yu7cudDX10dycjIu\nXbqE06dPY9CgQTXeZ3VbtmxBWFgYxo8fj8GDB+Po0aP4/PPPkZ2dDT8/P8yZMwdjx45Fv379cOrU\nKezZsweZmZk4fvw47zh3796Fn58fMjMzMXz4cIwfPx5ZWVk4fPgw/Pz8sHPnTt4XRWRkJIKCgjBo\n0CC8+OKLaNOmDRISEnD06FGcOHECR48exciRI7nyJ0+exOjRo2FmZoaAgAA4ODggNzcX0dHR2LJl\nC9avX8/rSFVb8xB12zdu3IjTp09j7Nix8PPzQ0VFBYD6vy/k4uPj0a9fP/To0QNz587FvXv3cOLE\nCQwePBgXLlyAv78/2rVrhxkzZiAlJQW//vorRowYgejoaDg6OnLHqaqqwoQJE/DHH3/Aw8MDM2bM\ngFgsxrlz5/Dhhx/i9OnTOHnyJHR0dHj3X1lZCX9/f6SlpWH06NHQ1dXFoUOH8MEHH6CsrAwrVqwA\ngDp9pp/1vU5IS5adnQ0fHx+Ym5tj6tSpkEqlsLCwQEhICJYvXw5LS0uMHj0atra2uH37NrZv346j\nR4/i6tWrsLe3BwCkpaXB29sbhYWFGDlyJCZOnIiKigokJCTg4MGDmDFjBu+8ACify65cuYIXXngB\nlZWVmDBhAtzd3XH79m0MHjyY+7GuSk3nTFXbFixYgK5du2Lw4MFo164dsrKycPz4ccyePRsPHjzA\nZ599VutzRucUUiNG2MOHD5lIJGJubm4sNTWVt+3cuXNMV1eX9e7dm1t39OhRJhAI2JIlS5SOJZVK\nWV5eHm9/gUDAXnnlFZX3ffbsWSYQCNiqVat46wcNGsQEAgFzd3dnjx8/5tbHx8czfX19ZmhoyGxs\nbFhMTAy3LT8/n1lZWTGRSMTbhzHGYmNjVcY6e/ZsJhAI2NWrV1Xef0JCgsq4hw0bxnR0dNhPP/3E\nW19QUMB69erFhEIhu337NrfewsKCOTg4sJKSEqVjZWdnq7yPJ40cOZIJBAIWHh6utM3b25vp6Oiw\n+Ph4xhhjd+7cYQKBgI0fP17lsep6n/Lnx9LSkj169IhbL3+udXR0mIWFBbt27Rq3raKignXt2pUJ\nBAJ269Ytbn1VVRXr2LEjMzAwYBcuXODdT1paGnN0dGSGhoa81y4/P19lrMnJyczOzo516tSJt37C\nhAlMIBDwnnu5nJwclY9N1WscFxen8n0r38fY2FjlfdT3fSF//wsEArZp0ybePvPnz2cCgYCZmZmx\nxYsX87atWbNG5Wfwk08+YQKBgC1atIhJpVJuvVQq5Y63ZcsW3j7y+x89ejQrKyvj1j9+/JiZm5sz\nc3NzVllZya2v7TPdEO91Qloa+TlFIBCw2bNnM4lEwm07f/48EwgEzMfHh+Xn5/P227NnDxMIBGzi\nxIncuq+++ooJBAK2efNmpfupqKhgRUVF3LKq71ipVMo8PDyYUChkBw8e5O2/bds2JhAImFAoZOfP\nn1eKX93nXt35VNV3b0VFBRs2bBjT1dVlycnJvG2DBg1iQqGQt47OKaQm1LQGwPbt21FRUYEvvvgC\n7dq1422T14TevHkT9+/f520Ti8VKxxIIBDAzM+OW2TO2ow0KCoKVlRW37OTkhAEDBqC0tBQLFizg\nNSUxNTXFmDFjUFFRgQcPHvCO82SzGHmsb731FgDgr7/+qnNMd+/exZkzZzBu3DhMnTqVt83ExATB\nwcFgjPFq+QUCAfT19ZVqQgHAwsKiTvcbGBgIQHapsrrIyEjcuHEDAwcOhJOTE2+bqteoPvcp99Zb\nb8HV1ZVbNjU1RUBAAKRSKcaOHYs+ffpw2/T09DBlyhQA4JpZAcDx48fx8OFDLFiwAAMGDOAd39bW\nFu+99x5KS0t5TVDkTXWeZG9vj4kTJyIqKgrJyclK21U97jZt2tTjEdds/vz56N69O2/d07wv5Fxd\nXbFkyRLeupdffhmArKnMmjVreNtmzpwJALh9+za3TiqVYvPmzbCxscGXX37Jqx0TCAQICQmBQCDA\n3r17le5fIBDgq6++gkgk4tZZWVkhICAA+fn5iI6O5tbX9pluiPc6IS2VSCTCxo0beVcGN2/eDADY\nsWMHTE1NeeVnzpyJnj174siRIyguLuZtU3We09PTg5GRUY0xXLlyBdHR0fDx8cH48eN529544w24\nubk1WB8YVd+9enp6WLBgASQSicomlU+icwqpCTWtAXD58mUAwPnz53Hjxg2l7fL2effv30fnzp0x\nePBg2NvbIyQkBDdu3MCoUaPg6+uLXr16qfygPYsnm+AAsqRP3TY7OzsAUErusrOzsWHDBhw/fhyx\nsbEoKSnhbU9JSalzTPLnKz8/H8HBwUrbMzMzAYD3w2fGjBnYsmULOnfujMmTJ+P555+Hj49PvU5C\n48aNg7m5Ofbt24eNGzdCV1f29pW3TZYn+gDQpUsX9OzZEz/99BPi4+MxduxY+Pr6wsvLS21yX5P6\nvg7yH4TVXwf585aQkKDyeXv48CEAKP1gvHz5MjZv3oy///4bmZmZXDMWuZSUFDg4OACQfekdOnQI\nffv2xZQpUzB48GD0798fzs7OdXykdVP9h0v1OIH6vS/k5M3WqpM/v/K+BNWpen6jo6ORnZ2NDh06\nYPXq1SrjFovFXLv76szMzHg/1OTkl+fV9XdQpSHe64S0VM7OzkojyFy+fBm6uro4cOCAyr405eXl\nkEgkiIqKQq9evTB27Fh89NFHePPNN3Hy5En4+/ujf//+6N69e51Gk7p58yYAqGxeKRAI4Ovri5iY\nmKd8hHyJiYkICQnB6dOnkZSUhNLSUt721NTUWo9B5xRSE0rkIUtyAeDzzz9XW0YgEHC1ASYmJrh2\n7RpWrVqFo0eP4tSpUwBkbcjnzJmDTz75RCnxeFrVa/fl5AlsTduqd+rLy8uDt7c34Line truncated
|
||||
"text/plain": [
|
||||
"<matplotlib.figure.Figure at 0x81f2710>"
|
||||
"<matplotlib.figure.Figure at 0x80ea898>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"[<matplotlib.lines.Line2D at 0x744ee10>,\n",
|
||||
" <matplotlib.lines.Line2D at 0x6ed7d68>]"
|
||||
]
|
||||
},
|
||||
"execution_count": 86,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<matplotlib.figure.Figure at 0x80c3c88>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
@@ -1625,27 +1646,28 @@
|
||||
" cvfilter= make_cv_filter(dt)\n",
|
||||
" cafilter = make_ca_filter(dt)\n",
|
||||
"\n",
|
||||
" pos2, zs2 = generate_data(120, noise_factor=0.2)\n",
|
||||
" z_xs2 = zs2[:, 0]\n",
|
||||
" t = np.arange(0, len(z_xs2) * dt, dt)\n",
|
||||
" pos, zs = generate_data(120, noise_factor=0.2)\n",
|
||||
" z_xs = zs[:, 0]\n",
|
||||
" t = np.arange(0, len(z_xs) * dt, dt)\n",
|
||||
" xs, res = [], []\n",
|
||||
"\n",
|
||||
" for z in z_xs2:\n",
|
||||
" for z in z_xs:\n",
|
||||
" cvfilter.predict()\n",
|
||||
" cafilter.predict()\n",
|
||||
" cvfilter.update([z])\n",
|
||||
" cafilter.update([z])\n",
|
||||
" \n",
|
||||
" std = np.sqrt(cvfilter.R[0,0])\n",
|
||||
" if cvfilter.y[0] < 1.4 * std:\n",
|
||||
" if abs(cvfilter.y[0]) < 2 * std:\n",
|
||||
" xs.append(cvfilter.x[0])\n",
|
||||
" else:\n",
|
||||
" xs.append(cafilter.x[0])\n",
|
||||
" res.append(cvfilter.y[0])\n",
|
||||
" xs = np.asarray(xs)\n",
|
||||
" plot_track_and_residuals(t, xs, z_xs2, res)\n",
|
||||
" plot_track_and_residuals(t, xs, z_xs, res)\n",
|
||||
"\n",
|
||||
"run_filter_bank(threshold=1.4)"
|
||||
"run_filter_bank(threshold=1.4)\n",
|
||||
"plt.plot(zs)"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
||||
@@ -70,33 +70,22 @@ class RobotLocalizationParticleFilter(object):
|
||||
|
||||
|
||||
def resample(self):
|
||||
p = np.zeros((self.N, 3))
|
||||
w = np.zeros(self.N)
|
||||
cumulative_sum = np.cumsum(self.weights)
|
||||
cumulative_sum[-1] = 1. # avoid round-off error
|
||||
indexes = np.searchsorted(cumulative_sum, random(self.N))
|
||||
|
||||
cumsum = np.cumsum(self.weights)
|
||||
for i in range(self.N):
|
||||
index = np.searchsorted(cumsum, random())
|
||||
p[i] = self.particles[index]
|
||||
w[i] = self.weights[index]
|
||||
|
||||
self.particles = p
|
||||
assert np.sum(w) != 0
|
||||
assert w[0] is not np.nan
|
||||
self.weights = w / np.sum(w)
|
||||
# resample according to indexes
|
||||
self.particles = self.particles[indexes]
|
||||
self.weights = self.weights[indexes]
|
||||
self.weights /= np.sum(self.weights) # normalize
|
||||
|
||||
|
||||
def resample_from_index(self, indexes):
|
||||
assert len(indexes) == self.N
|
||||
|
||||
p = np.zeros((self.N, 3))
|
||||
w = np.zeros(self.N)
|
||||
for i, index in enumerate(indexes):
|
||||
p[i] = self.particles[index]
|
||||
w[i] = self.weights[index]
|
||||
|
||||
self.particles = p
|
||||
self.weights = w / np.sum(w)
|
||||
|
||||
self.particles = self.particles[indexes]
|
||||
self.weights = self.weights[indexes]
|
||||
self.weights /= np.sum(self.weights)
|
||||
|
||||
|
||||
def estimate(self):
|
||||
|
||||
+155
-9
@@ -1,3 +1,7 @@
|
||||
from filterpy.monte_carlo import stratified_resample
|
||||
import matplotlib as mpl
|
||||
import matplotlib.pyplot as plt
|
||||
|
||||
import numpy as np
|
||||
from numpy.random import randn, random, uniform, multivariate_normal, seed
|
||||
#from nonlinear_plots import plot_monte_carlo_mean
|
||||
@@ -7,7 +11,6 @@ from RobotLocalizationParticleFilter import *
|
||||
|
||||
|
||||
|
||||
|
||||
class ParticleFilter(object):
|
||||
|
||||
def __init__(self, N, x_dim, y_dim):
|
||||
@@ -24,7 +27,6 @@ class ParticleFilter(object):
|
||||
self.particles[:, 2] = uniform(0, 2*np.pi, size=N)
|
||||
|
||||
|
||||
|
||||
def predict(self, u, std):
|
||||
""" move according to control input u with noise std"""
|
||||
|
||||
@@ -81,7 +83,6 @@ class ParticleFilter(object):
|
||||
return mu, var
|
||||
|
||||
|
||||
|
||||
def plot_random_pd():
|
||||
def norm(x, x0, sigma):
|
||||
return np.exp(-0.5 * (x - x0) ** 2 / sigma ** 2)
|
||||
@@ -101,7 +102,6 @@ def plot_random_pd():
|
||||
plt.plot(x, y2)
|
||||
|
||||
|
||||
|
||||
def plot_monte_carlo_ukf():
|
||||
|
||||
def f(x,y):
|
||||
@@ -164,7 +164,6 @@ def plot_pf(pf, xlim=100, ylim=100, weights=True):
|
||||
plt.ylim(0, ylim)
|
||||
|
||||
|
||||
|
||||
def Gaussian(mu, sigma, x):
|
||||
|
||||
# calculates the probability of x for 1-dim Gaussian with mean mu and var. sigma
|
||||
@@ -175,6 +174,7 @@ def Gaussian(mu, sigma, x):
|
||||
|
||||
return g
|
||||
|
||||
|
||||
def test_gaussian(N):
|
||||
for i in range(N):
|
||||
mean, std, x = randn(3)
|
||||
@@ -224,8 +224,6 @@ def show_two_pf_plots():
|
||||
plt.tight_layout()
|
||||
|
||||
|
||||
|
||||
|
||||
def test_pf():
|
||||
|
||||
#seed(1234)
|
||||
@@ -261,7 +259,6 @@ def test_pf():
|
||||
plt.scatter(mu[0], mu[1], color='g', s=100)
|
||||
plt.tight_layout()
|
||||
plt.pause(dt)
|
||||
#print(mu - pos)
|
||||
|
||||
|
||||
def test_pf2():
|
||||
@@ -292,6 +289,155 @@ def test_pf2():
|
||||
plt.plot(xs[:, 0], xs[:, 1])
|
||||
plt.show()
|
||||
|
||||
|
||||
def plot_cumsum(a):
|
||||
|
||||
N = len(a)
|
||||
|
||||
cmap = mpl.colors.ListedColormap([[0., .4, 1.],
|
||||
[0., .8, 1.],
|
||||
[1., .8, 0.],
|
||||
[1., .4, 0.]]*(int(N/4) + 1))
|
||||
cumsum = np.cumsum(np.asarray(a) / np.sum(a))
|
||||
cumsum = np.insert(cumsum, 0, 0)
|
||||
|
||||
fig = plt.figure(figsize=(6,3))
|
||||
ax = fig.add_axes([0.05, 0.475, 0.9, 0.15])
|
||||
norm = mpl.colors.BoundaryNorm(cumsum, cmap.N)
|
||||
bar = mpl.colorbar.ColorbarBase(ax, cmap=cmap,
|
||||
norm=norm,
|
||||
drawedges=False,
|
||||
spacing='proportional',
|
||||
orientation='horizontal')
|
||||
if N > 10:
|
||||
bar.set_ticks([])
|
||||
plt.show()
|
||||
|
||||
|
||||
def plot_stratified_resample(a):
|
||||
N = len(a)
|
||||
|
||||
cmap = mpl.colors.ListedColormap([[0., .4, 1.],
|
||||
[0., .8, 1.],
|
||||
[1., .8, 0.],
|
||||
[1., .4, 0.]]*(int(N/4) + 1))
|
||||
cumsum = np.cumsum(np.asarray(a) / np.sum(a))
|
||||
cumsum = np.insert(cumsum, 0, 0)
|
||||
|
||||
fig = plt.figure(figsize=(6,3))
|
||||
ax = fig.add_axes([0.05, 0.475, 0.9, 0.15])
|
||||
norm = mpl.colors.BoundaryNorm(cumsum, cmap.N)
|
||||
bar = mpl.colorbar.ColorbarBase(ax, cmap=cmap,
|
||||
norm=norm,
|
||||
drawedges=False,
|
||||
spacing='proportional',
|
||||
orientation='horizontal')
|
||||
xs = np.linspace(0., 1.-1./N, N)
|
||||
ax.vlines(xs, 0, 1, lw=2)
|
||||
|
||||
# make N subdivisions, and chose a random position within each one
|
||||
b = (random(N) + range(N)) / N
|
||||
plt.scatter(b, [.5]*len(b), s=60, facecolor='k', edgecolor='k')
|
||||
bar.set_ticks([])
|
||||
plt.title('stratified resampling')
|
||||
plt.show()
|
||||
|
||||
|
||||
def plot_systematic_resample(a):
|
||||
N = len(a)
|
||||
|
||||
cmap = mpl.colors.ListedColormap([[0., .4, 1.],
|
||||
[0., .8, 1.],
|
||||
[1., .8, 0.],
|
||||
[1., .4, 0.]]*(int(N/4) + 1))
|
||||
cumsum = np.cumsum(np.asarray(a) / np.sum(a))
|
||||
cumsum = np.insert(cumsum, 0, 0)
|
||||
|
||||
fig = plt.figure(figsize=(6,3))
|
||||
ax = fig.add_axes([0.05, 0.475, 0.9, 0.15])
|
||||
norm = mpl.colors.BoundaryNorm(cumsum, cmap.N)
|
||||
bar = mpl.colorbar.ColorbarBase(ax, cmap=cmap,
|
||||
norm=norm,
|
||||
drawedges=False,
|
||||
spacing='proportional',
|
||||
orientation='horizontal')
|
||||
xs = np.linspace(0., 1.-1./N, N)
|
||||
ax.vlines(xs, 0, 1, lw=2)
|
||||
|
||||
# make N subdivisions, and chose a random position within each one
|
||||
b = (random() + np.array(range(N))) / N
|
||||
plt.scatter(b, [.5]*len(b), s=60, facecolor='k', edgecolor='k')
|
||||
bar.set_ticks([])
|
||||
plt.title('systematic resampling')
|
||||
plt.show()
|
||||
|
||||
|
||||
def plot_multinomial_resample(a):
|
||||
N = len(a)
|
||||
|
||||
cmap = mpl.colors.ListedColormap([[0., .4, 1.],
|
||||
[0., .8, 1.],
|
||||
[1., .8, 0.],
|
||||
[1., .4, 0.]]*(int(N/4) + 1))
|
||||
cumsum = np.cumsum(np.asarray(a) / np.sum(a))
|
||||
cumsum = np.insert(cumsum, 0, 0)
|
||||
|
||||
fig = plt.figure(figsize=(6,3))
|
||||
ax = fig.add_axes([0.05, 0.475, 0.9, 0.15])
|
||||
norm = mpl.colors.BoundaryNorm(cumsum, cmap.N)
|
||||
bar = mpl.colorbar.ColorbarBase(ax, cmap=cmap,
|
||||
norm=norm,
|
||||
drawedges=False,
|
||||
spacing='proportional',
|
||||
orientation='horizontal')
|
||||
|
||||
# make N subdivisions, and chose a random position within each one
|
||||
b = random(N)
|
||||
plt.scatter(b, [.5]*len(b), s=60, facecolor='k', edgecolor='k')
|
||||
bar.set_ticks([])
|
||||
plt.title('multinomial resampling')
|
||||
plt.show()
|
||||
|
||||
|
||||
def plot_residual_resample(a):
|
||||
N = len(a)
|
||||
|
||||
a_norm = np.asarray(a) / np.sum(a)
|
||||
cumsum = np.cumsum(a_norm)
|
||||
cumsum = np.insert(cumsum, 0, 0)
|
||||
|
||||
cmap = mpl.colors.ListedColormap([[0., .4, 1.],
|
||||
[0., .8, 1.],
|
||||
[1., .8, 0.],
|
||||
[1., .4, 0.]]*(int(N/4) + 1))
|
||||
|
||||
fig = plt.figure(figsize=(6,3))
|
||||
ax = fig.add_axes([0.05, 0.475, 0.9, 0.15])
|
||||
norm = mpl.colors.BoundaryNorm(cumsum, cmap.N)
|
||||
bar = mpl.colorbar.ColorbarBase(ax, cmap=cmap,
|
||||
norm=norm,
|
||||
drawedges=False,
|
||||
spacing='proportional',
|
||||
orientation='horizontal')
|
||||
|
||||
indexes = residual_resample(a_norm)
|
||||
bins = np.bincount(indexes)
|
||||
for i in range(1, N):
|
||||
n = bins[i-1] # number particles in this sample
|
||||
if n > 0:
|
||||
b = np.linspace(cumsum[i-1], cumsum[i], n+2)[1:-1]
|
||||
plt.scatter(b, [.5]*len(b), s=60, facecolor='k', edgecolor='k')
|
||||
bar.set_ticks([])
|
||||
plt.title('residual resampling')
|
||||
plt.show()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
plot_residual_resample([.1, .2, .3, .4, .2, .3, .1])
|
||||
|
||||
#example()
|
||||
#show_two_pf_plots()
|
||||
test_pf()
|
||||
|
||||
a = [.1, .2, .1, .6]
|
||||
#plot_cumsum(a)
|
||||
#test_pf()
|
||||
Reference in new issue
Block a user