def test_single_parameter_linear_adjustment(): """A regression test against values obtained in the notebook.""" seed = 20170616 n_obs = 50 batch_size = 100 mu, sigma = (5, 1) # Hyperparameters mu0, sigma0 = (10, 100) y_obs = gauss.Gauss( mu, sigma, n_obs=n_obs, batch_size=1, random_state=np.random.RandomState(seed)) sim_fn = partial(gauss.Gauss, sigma=sigma, n_obs=n_obs) # Posterior n = y_obs.shape[1] mu1 = (mu0 / sigma0**2 + y_obs.sum() / sigma**2) / (1 / sigma0**2 + n / sigma**2) sigma1 = (1 / sigma0**2 + n / sigma**2)**(-0.5) # Model m = elfi.ElfiModel() elfi.Prior('norm', mu0, sigma0, model=m, name='mu') elfi.Simulator(sim_fn, m['mu'], observed=y_obs, name='Gauss') elfi.Summary(lambda x: x.mean(axis=1), m['Gauss'], name='S1') elfi.Distance('euclidean', m['S1'], name='d') res = elfi.Rejection(m['d'], output_names=['S1'], seed=seed).sample(1000, threshold=1) adj = elfi.adjust_posterior(model=m, sample=res, parameter_names=['mu'], summary_names=['S1']) assert np.allclose(_statistics(adj.outputs['mu']), (4.9772879640569778, 0.02058680115402544))
def Perfrom_ABC(self,save = False): sigma_prior = elfi.Prior('uniform',self.start_prior,self.end_prior) y0 = self.simulator(self.sigma0) sim = elfi.Simulator(self.simulator,sigma_prior,observed=y0) S1 = elfi.Summary(self.var,sim) S2 = elfi.Summary(self.max_min_diff,sim) S3 = elfi.Summary(self.PDP_diff_mean,sim) S4 = elfi.Summary(self.PDP_diff_var,sim) S5 = elfi.Summary(self.mean,sim) sumstats = [] sumstats.append(S1) sumstats.append(S2) sumstats.append(S3) sumstats.append(S4) sumstats.append(S5) output_names = 'S1,S2,S3,S4,S5' output_list = ['S1','S2','S3','S4','S5'] if self.distance == 'euclidean': d = elfi.Distance('euclidean',*sumstats) elif self.distance == 'seuclidean': d = elfi.Distance('seuclidean',*sumstats,V = None) if self.mode == 'SMC': rej_temp = elfi.Rejection(d.model['d'],output_names = output_list) rej = elfi.SMC(d.model['d'],output_names = rej_temp.output_names) quantile_list = list(np.repeat(self.quantile,self.T)) res_sample = rej.sample(self.N,quantile_list) try: adj_res = elfi.adjust_posterior(res_sample.T, d.model, output_list) except: print('Error in calculation of adjustment') adj_res = 'NaN' if self.mode == 'Rejection': rej = elfi.Rejection(d.model['d'],output_names = output_list) res_sample = rej.sample(self.N,self.quantile) try: adj_res = elfi.adjust_posterior(res_sample.T, d.model, output_list) except: print('Error in calculation of adjustment') adj_res = 'NaN' dat = res_sample.samples_array[:,-1] dat_grid = np.linspace(self.start_prior,self.end_prior,self.N) kde = kde_scipy(dat,dat_grid,bandwidth = 1) self.data_dict = {'theta':res_sample.samples_array[:,-1],\ 'summariers':np.array([res_sample.outputs['S1'],res_sample.outputs['S2'],\ res_sample.outputs['S3'],res_sample.outputs['S4'],res_sample.outputs['S5']]),\ 'True sim': y0, 'true summaries' : np.array([self.var(y0),\ self.max_min_diff(y0),self.PDP_diff_mean(y0),self.PDP_diff_var(y0),self.mean(y0),]),\ 'kde' : kde, 'kde_grid':dat_grid,'sigma0': self.sigma0,\ 'elfi adjust' : adj_res,\ 'elfi results' : res_sample} if save == True: try: string = str(self.quantile)[-1] f = open('examples/Pickle_data_%s_q_%s_sig0_%d_summaries_%s_distance_%s'%(self.mode,string,int(self.sigma0),output_names,self.distance),'wb') p.dump(self.data_dict,f) f.close() except: print('Error in saving') return self.data_dict