diff --git a/src/particle_filters/particle_filter_test.jl b/src/particle_filters/particle_filter_test.jl index 3698ee7d3bc268d2f80376e576218626b09e1c42..c20263ed2b574a1996e08fa903d60340d83efe27 100644 --- a/src/particle_filters/particle_filter_test.jl +++ b/src/particle_filters/particle_filter_test.jl @@ -28,7 +28,7 @@ f(xn,x,t::Int64) = begin end end -function f_sample(x::Vector, t::Int64) +function f_sample(x, t::Int64) c = 8*cos(1.2*(t-1)) @inbounds for i = 1:length(x) x[i] = 0.5*x[i] + 25*x[i]./(1+x[i]^2) + c + σw*randn() @@ -45,19 +45,19 @@ function f_density(xb, xp, t) end -const den = 0.5/σv^2 -function g_density(y::Float64, x::Vector{Float64}, w::Vector{Float64}) +const den = -0.5/σv^2 +function g_density(y::Float64, x, w) @inbounds for i = 1:length(w) - w[i] -= (den * (y-0.05x[i]^2)^2 - s2piσv) + w[i] += (den * (y-0.05x[i]^2)^2 - s2piσv) end end ## Parameter estimation -function f_theta_sample(x::Vector, t, theta) +function f_theta_sample(x,x1, t, theta) c = theta[3]*cos(1.2*(t-1)) @inbounds for i = 1:length(x) - x[i] = theta[1]*x[i] + theta[2]*x[i]./(1+x[i]^2) + c + σw*randn() + x[i] = theta[1]*x1[i] + theta[2]*x1[i]./(1+x1[i]^2) + c + σw*randn() end return x end @@ -72,10 +72,10 @@ function f_density_theta(xb, xp, t, theta) end -function g_density_theta(y::Float64,x::Vector{Float64},w, theta) +function g_density_theta(y::Float64,x, w, theta) # w = Array(Float64,size(x)) @inbounds for i = 1:length(w) - w[i] = -(den * (y-0.05x[i]^2)^2) + w[i] = den * (y-0.05x[i]^2)^2 - s2piσv end return w end @@ -133,14 +133,14 @@ function test_pf() return RMSE, RMSE_FFBSi end -using Winston + function test_PMMH() particle_count = [100] time_steps = [200] - R = 5_000 + R = 30_000 for (Ti,T) in enumerate(time_steps) for (Ni, N) in enumerate(particle_count) - montecarlo_runs = 4# maximum(particle_count)*maximum(time_steps) / T / N*10 + montecarlo_runs = 8# maximum(particle_count)*maximum(time_steps) / T / N*10 x = Array(Float64,T) y = Array(Float64,T) theta_PMMH = SharedArray(Float64,(size(theta0,1),R,montecarlo_runs)) @@ -152,13 +152,18 @@ function test_PMMH() y[t+1] = 0.05x[t+1]^2 + σv*randn() end # t theta0i = draw_theta0() - theta_PMMH[:,:,mc_iter] = pf_PMMH(y, N, R, pf_bootstrap_nn, f_theta_sample, draw_theta_random, f_density_theta, g_density_theta, σw0, theta0i) + theta_PMMH[:,:,mc_iter] = pf_PMMH(y, N, R, pf_bootstrap_nn, f_theta_sample, draw_theta_random, f_density_theta, g_density_theta, theta0i) end # MC newplot(theta_PMMH[:,:,1]'); hold(true) for mc_iter = 2:montecarlo_runs plot(theta_PMMH[:,:,mc_iter]') end hold(false); title("PMMH") + th = Array(theta_PMMH) +# pp = Winston.figure(); Winston.plothist(th[1,:,:][:],500); Winston.hold(true) +# Winston.plothist(th[2,:,:][:],500) +# Winston.plothist(th[3,:,:][:],500) +# Winston.hold(false); Winston.display(pp) @show N end # N @show T diff --git a/src/particle_filters/pf_PMMH.jl b/src/particle_filters/pf_PMMH.jl index 6f3dd0e636585a90f8e7aac19a74526b3b880491..f97e3ff96f2b3d86543ce82010416ce632e81f79 100644 --- a/src/particle_filters/pf_PMMH.jl +++ b/src/particle_filters/pf_PMMH.jl @@ -12,7 +12,7 @@ function pf_PMMH(y, N, R, pf, f_theta, draw_theta, f_density_theta, g_density_th theta[:,1] = theta0 g_density(y_t, x_t,w) = g_density_theta(y_t, x_t,w, theta0) - f(x,t) = f_theta(x,t,theta0) + f(x,x1,t) = f_theta(x,x1,t,theta0) pf(xp, w, wnn, y, N, g_density, f) Z[1] = Zf(wnn) @@ -24,7 +24,7 @@ function pf_PMMH(y, N, R, pf, f_theta, draw_theta, f_density_theta, g_density_th breakTime = floor(Int64, R / breakPoints) particleIncrease = 10*N thetaP = draw_theta(theta0) - f(x,t) = f_theta(x,t,thetaP) + f(x,x1,t) = f_theta(x,x1,t,thetaP) g_density(y_t, x_t,w) = g_density_theta(y_t, x_t,w, thetaP) for r = 2:R diff --git a/src/particle_filters/pf_bootstrap.jl b/src/particle_filters/pf_bootstrap.jl index 0cb4a6126ee2fff7f3ae82a67e2da5d9fe70b128..931280d76efed8fb248d68a2f5b190016d27171b 100644 --- a/src/particle_filters/pf_bootstrap.jl +++ b/src/particle_filters/pf_bootstrap.jl @@ -7,7 +7,7 @@ function pf_bootstrap!(xp,w, y, N, g_density, f) wT = slice(w,:,1) xT = slice(xp,:,1) fill!(wT,-log(N)) - g(y[1],xT, wT) + g_density(y[1],xT, wT) wT -= logsumexp(wT) j = Array(Int64,N) # tw = Float64(N) @@ -27,7 +27,7 @@ function pf_bootstrap!(xp,w, y, N, g_density, f) end # Time update - g(y[t],xT, wT) + g_density(y[t],xT, wT) # Normalize weights wT -= logsumexp(wT) @@ -45,7 +45,7 @@ function pf_bootstrap(y, N, g_density, f) wT = slice(w,:,1) xT = slice(xp,:,1) fill!(wT,-log(N)) - g(y[1],xT, wT) + g_density(y[1],xT, wT) wT -= logsumexp(wT) j = Array(Int64,N) # tw = Float64(N) @@ -65,7 +65,7 @@ function pf_bootstrap(y, N, g_density, f) end # Time update - g(y[t],xT, wT) + g_density(y[t],xT, wT) # Normalize weights wT -= logsumexp(wT) @@ -84,8 +84,8 @@ function pf_bootstrap_nn(xp, w, wnn, y, N, g_density, f) wT = slice(w,:,1) xT = slice(xp,:,1) fill!(wT,-log(N)) - g(y[1],xT, wT) - wnn[:,t] = wT + g_density(y[1],xT, wT) + wnn[:,1] = wT wT -= logsumexp(wT) j = Array(Int64,N) # tw = Float64(N) @@ -178,7 +178,7 @@ function pf_CSMC!(xp,w, y, N, g_density, f, xc ) wT = slice(w,:,1) xT = slice(xp,:,1) fill!(wT,-log(N)) - g(y[1],xT, wT) + g_density(y[1],xT, wT) wT -= logsumexp(wT) j = Array(Int64,N) # tw = Float64(N) @@ -198,7 +198,7 @@ function pf_CSMC!(xp,w, y, N, g_density, f, xc ) end xp[N,t] = xc[t] # Time update - g(y[t],xT, wT) + g_density(y[t],xT, wT) # Normalize weights wT -= logsumexp(wT)