Example #1
0
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))
Example #2
0
    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