def __init__(self, **kwargs): StateSpaceModel.__init__(self, **kwargs) if self.sigma0 is None: self.sigma0 = self.sigmaX / np.sqrt(1. - self.rho**2) self.kf = kalman.Kalman(F=self.rho, G=1., covX=self.sigmaX**2, covY=self.sigmaY**2, cov0=self.sigma0**2)
def loglik(self, theta, t=None): # Note: for simplicity we ignore argument t here, # and compute the full log-likelihood ll = np.zeros(theta.shape[0]) for n, th in enumerate(theta): mod = ReparamLinGauss(**smc_samplers.rec_to_dict(th)) kf = kalman.Kalman(data=data, ssm=mod) kf.filter() ll[n] = np.sum(kf.logpyt) return ll
from particles import kalman from particles import state_space_models # parameter values sigmaX = 1. sigmaY = .2 rho = 0.9 T = 1000 N = 200 # define ss model, simulate data ssm = kalman.LinearGauss(sigmaX=sigmaX, sigmaY=sigmaY, rho=rho) true_states, data = ssm.simulate(T) # computes true log-likelihood kf = kalman.Kalman(ssm=ssm, data=data) kf.filter() true_loglik = np.sum(kf.logpyt) # FK model fk_model = state_space_models.GuidedPF(ssm=ssm, data=data) # Run SMC algorithm for different values of ESS_min alphas = list(np.linspace(0., .1, 11)) + list(np.linspace(0.15, 1., 18)) results = particles.multiSMC(fk=fk_model, N=N, ESSrmin=alphas, nruns=200, nprocs=1) # PLOTS
def __init__(self, **kwargs): StateSpaceModel.__init__(self, **kwargs) self.kf = kalman.Kalman(F=self.F, G=self.G, covX=self.covX, covY=self.covY, mu0=self.mu0, cov0=self.cov0)
# Define ssm, simulate data T = 100 my_ssm = kalman.LinearGauss(sigmaX=1., sigmaY=.2, rho=.9) true_states, data = my_ssm.simulate(T) # FK models models = OrderedDict() models['bootstrap'] = ssms.Bootstrap(ssm=my_ssm, data=data) models['guided'] = ssms.GuidedPF(ssm=my_ssm, data=data) models['APF'] = ssms.AuxiliaryPF(ssm=my_ssm, data=data) # Uncomment line below if you want to include the "Boostrap APF" # (APF with proposal set to dist. of X_t|X_{t-1}) in the comparison #models['bootAPF'] = ssm.AuxiliaryBootstrap(ssm=my_ssm, data=data) # Compute "truth" kf = kalman.Kalman(ssm=my_ssm, data=data) kf.filter() true_loglik = np.cumsum(kf.logpyt) true_filt_means = [f.mean for f in kf.filt] # Get results N = 10**3 results = particles.multiSMC(fk=models, N=N, nruns=25, moments=True) # PLOTS # ===== plt.style.use('ggplot') savefigs = False # whether you want to save figs as pdfs # black and white sb.set_palette(sb.dark_palette("lightgray", n_colors=len(models),
rho, sigX, sigY, sig0 = 0.9, 1., 0.2, 3. uni_ssm = kalman.LinearGauss(rho=rho, sigmaX=sigX, sigmaY=sigY, sigma0=sig0) univariate = False # test univariate or multivariate model? if univariate: ssm = uni_ssm F, G, mu0 = rho, 1., 0. covX, covY, cov0 = sigX**2, sigY**2, sig0**2 else: ssm = mv_ssm # data x, y = ssm.simulate(T) # Our Kalman filter mykf = kalman.Kalman(ssm=ssm, data=y) mykf.smoother() # this does both filtering and smoothing # Their Kalman filter theirkf = pykalman.KalmanFilter(transition_matrices = F, observation_matrices = G, transition_covariance=covX, observation_covariance=covY, initial_state_mean=mu0, initial_state_covariance=cov0) their_data = np.array(y).squeeze() their_filt_means, their_filt_covs = theirkf.filter(their_data) their_filt_means = their_filt_means.squeeze() # Comparing filtering means and covs