Weights should be reset to 1/N after resampling.
This commit is contained in:
parent
ba61f3a96c
commit
7c5aa45019
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.
Before Width: | Height: | Size: 316 KiB After Width: | Height: | Size: 206 KiB |
@ -57,4 +57,10 @@ def animate(filename, func, frames, interval, fig=None, figsize=(6.5, 6.5)):
|
||||
|
||||
anim = animation.FuncAnimation(fig, func, init_func=init_func,
|
||||
frames=frames, interval=interval)
|
||||
anim.save(filename, writer='imagemagick')
|
||||
|
||||
import os
|
||||
basename = os.path.splitext(filename)[0]
|
||||
anim.save(basename + '.mp4', writer='ffmpeg')
|
||||
|
||||
os.system("ffmpeg -y -i {}.mp4 {}.gif".format(basename, basename))
|
||||
os.remove(basename + '.mp4')
|
@ -17,7 +17,6 @@ from __future__ import (absolute_import, division, print_function,
|
||||
unicode_literals)
|
||||
|
||||
|
||||
from kf_book.book_plots import figsize, end_interactive
|
||||
from filterpy.monte_carlo import stratified_resample, residual_resample
|
||||
import matplotlib as mpl
|
||||
import matplotlib.pyplot as plt
|
||||
@ -88,7 +87,7 @@ class ParticleFilter(object):
|
||||
w[i] = self.weights[index]
|
||||
|
||||
self.particles = p
|
||||
self.weights = w / np.sum(w)
|
||||
self.weights.fill(1.0 / self.N)
|
||||
|
||||
|
||||
def estimate(self):
|
||||
@ -311,29 +310,27 @@ def test_pf2():
|
||||
|
||||
def plot_cumsum(a):
|
||||
|
||||
with figsize(y=2):
|
||||
fig = plt.figure()
|
||||
N = len(a)
|
||||
fig = plt.figure()
|
||||
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)
|
||||
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))
|
||||
fig=plt.gcf()
|
||||
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([])
|
||||
end_interactive(fig)
|
||||
#fig = plt.figure(figsize=(6,3))
|
||||
fig=plt.gcf()
|
||||
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([])
|
||||
|
||||
|
||||
def plot_stratified_resample(a):
|
||||
@ -346,24 +343,22 @@ def plot_stratified_resample(a):
|
||||
cumsum = np.cumsum(np.asarray(a) / np.sum(a))
|
||||
cumsum = np.insert(cumsum, 0, 0)
|
||||
|
||||
with figsize(y=2):
|
||||
fig = plt.figure()
|
||||
ax = plt.gcf().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)
|
||||
fig = plt.figure()
|
||||
ax = plt.gcf().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')
|
||||
end_interactive(fig)
|
||||
# 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')
|
||||
|
||||
|
||||
def plot_systematic_resample(a):
|
||||
@ -376,24 +371,22 @@ def plot_systematic_resample(a):
|
||||
cumsum = np.cumsum(np.asarray(a) / np.sum(a))
|
||||
cumsum = np.insert(cumsum, 0, 0)
|
||||
|
||||
with figsize(y=2):
|
||||
fig = plt.figure()
|
||||
ax = plt.gcf().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)
|
||||
fig = plt.figure()
|
||||
ax = plt.gcf().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')
|
||||
end_interactive(fig)
|
||||
# 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')
|
||||
|
||||
|
||||
def plot_multinomial_resample(a):
|
||||
@ -406,22 +399,20 @@ def plot_multinomial_resample(a):
|
||||
cumsum = np.cumsum(np.asarray(a) / np.sum(a))
|
||||
cumsum = np.insert(cumsum, 0, 0)
|
||||
|
||||
with figsize(y=2):
|
||||
fig = plt.figure()
|
||||
ax = plt.gcf().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')
|
||||
fig = plt.figure()
|
||||
ax = plt.gcf().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')
|
||||
end_interactive(fig)
|
||||
# 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')
|
||||
|
||||
|
||||
def plot_residual_resample(a):
|
||||
@ -436,34 +427,36 @@ def plot_residual_resample(a):
|
||||
[1., .8, 0.],
|
||||
[1., .4, 0.]]*(int(N/4) + 1))
|
||||
|
||||
with figsize(y=2):
|
||||
fig = plt.figure()
|
||||
ax = plt.gcf().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')
|
||||
fig = plt.figure()
|
||||
ax = plt.gcf().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')
|
||||
|
||||
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')
|
||||
end_interactive(fig)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
plot_residual_resample([.1, .2, .3, .4, .2, .3, .1])
|
||||
|
||||
show_two_pf_plots()
|
||||
|
||||
#plot_residual_resample([.1, .2, .3, .4, .2, .3, .1])
|
||||
|
||||
#example()
|
||||
#show_two_pf_plots()
|
||||
|
||||
a = [.1, .2, .1, .6]
|
||||
#a = [.1, .2, .1, .6]
|
||||
#plot_cumsum(a)
|
||||
#test_pf()
|
||||
|
@ -24,7 +24,7 @@ def merge_notebooks(outfile, filenames):
|
||||
for fname in filenames:
|
||||
with io.open(fname, 'r', encoding='utf-8') as f:
|
||||
nb = nbformat.read(f, nbformat.NO_CONVERT)
|
||||
remove_formatting(nb)
|
||||
#remove_formatting(nb)
|
||||
if not added_appendix and fname[0:8] == 'Appendix':
|
||||
remove_links_add_appendix(nb)
|
||||
added_appendix = True
|
||||
|
@ -1,7 +1,7 @@
|
||||
mkdir tmp
|
||||
copy ..\*.ipynb .\tmp
|
||||
copy ..\*.py .\tmp
|
||||
cp -r ..\code\ .\tmp\code\
|
||||
cp -r ..\kf_book\ .\tmp\kf_book\
|
||||
|
||||
cd tmp
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user