예제 #1
0
파일: test_smc.py 프로젝트: zhuyiche/pymc3
    def test_sample(self):
        with self.SMC_test:
            mtrace = pm.sample(draws=self.samples, step=pm.SMC())

        x = mtrace['X']
        mu1d = np.abs(x).mean(axis=0)
        np.testing.assert_allclose(self.muref, mu1d, rtol=0., atol=0.03)
예제 #2
0
def main():
    n = 4
    mu1 = np.ones(n) * (1. / 2)

    with pm.Model() as ATMIP_test:
        X = pm.Uniform('X',
                       shape=n,
                       lower=-2. * np.ones_like(mu1),
                       upper=2. * np.ones_like(mu1),
                       testval=-1. * np.ones_like(mu1))
        kd4 = pm.Lognormal('kd4', mu=np.log(0.3), sd=1)
        #        k_d4 = pm.Lognormal('k_d4', mu=np.log(6E-3), sd=9)
        #        kSOCSon = pm.Lognormal('kSOCSon', mu=np.log(1E-6), sd = 2)
        #        kpa = pm.Lognormal('kpa', mu=np.log(1E-6), sd = 2)
        #        R1 = pm.Uniform('R1', lower=900, upper=5000)
        #        R2 = pm.Uniform('R2', lower=900, upper=5000)
        #        gamma = pm.Uniform('gamma', lower=2, upper=30)

        llk = pm.Potential('llk', two_gaussians(X, kd4))
    with ATMIP_test:
        trace = pm.sample(100, chains=50, step=pm.SMC())
        plt.figure()
        pm.traceplot(trace)
        plt.savefig("mc_testing.pdf")
        s = pm.stats.summary(trace)
        s.to_csv('mcmc_parameter_summary.csv')
예제 #3
0
 def test_start(self):
     with pm.Model() as model:
         a = pm.Poisson("a", 5)
         b = pm.HalfNormal("b", 10)
         y = pm.Normal("y", a, b, observed=[1, 2, 3, 4])
         start = {
             "a": np.random.poisson(5, size=500),
             "b_log__": np.abs(np.random.normal(0, 10, size=500)),
         }
         trace = pm.sample(500, start=start, step=pm.SMC())
예제 #4
0
    def test_sample_n_core(self, cores, stage):
        step_kwargs = {'homepath': self.test_folder, 'stage': stage}
        with self.ATMIP_test:
            mtrace = pm.sample(draws=self.samples,
                               chains=self.chains,
                               cores=cores,
                               step=pm.SMC(),
                               step_kwargs=step_kwargs)

        x = mtrace.get_values('X')
        mu1d = np.abs(x).mean(axis=0)
        np.testing.assert_allclose(self.muref, mu1d, rtol=0., atol=0.03)
예제 #5
0
파일: test_smc.py 프로젝트: zhuyiche/pymc3
    def test_ml(self):
        data = np.repeat([1, 0], [50, 50])
        marginals = []
        a_prior_0, b_prior_0 = 1., 1.
        a_prior_1, b_prior_1 = 20., 20.

        for alpha, beta in ((a_prior_0, b_prior_0), (a_prior_1, b_prior_1)):
            with pm.Model() as model:
                a = pm.Beta('a', alpha, beta)
                y = pm.Bernoulli('y', a, observed=data)
                trace = pm.sample(2000, step=pm.SMC())
                marginals.append(model.marginal_likelihood)
        # compare to the analytical result
        assert abs((marginals[1] / marginals[0]) - 4.0) <= 1
예제 #6
0
파일: test_smc.py 프로젝트: zhuyiche/pymc3
 def test_discrete_continuous(self):
     with pm.Model() as model:
         a = pm.Poisson('a', 5)
         b = pm.HalfNormal('b', 10)
         y = pm.Normal('y', a, b, observed=[1, 2, 3, 4])
         trace = pm.sample(step=pm.SMC())
예제 #7
0
az.plot_trace(trace_BF)
plt.savefig('B11197_05_11.png', dpi=300)

# In[17]:

pM1 = trace_BF['model_index'].mean()
pM0 = 1 - pM1
BF = (pM0 / pM1) * (p[1] / p[0])
BF

# In[18]:

with pm.Model() as model_BF_0:
    theta = pm.Beta('theta', 4, 8)
    y = pm.Bernoulli('y', theta, observed=y_d)
    trace_BF_0 = pm.sample(2500, step=pm.SMC())

with pm.Model() as model_BF_1:
    theta = pm.Beta('theta', 8, 4)
    y = pm.Bernoulli('y', theta, observed=y_d)
    trace_BF_1 = pm.sample(2500, step=pm.SMC())

# In[19]:

model_BF_0.marginal_likelihood / model_BF_1.marginal_likelihood

# ## Bayes factors and information criteria

# In[20]:

traces = []
예제 #8
0
az.plot_trace(trace_bf)

# %%
pm1 = trace_bf['model_index'].mean()
pm0 = 1 - pm1
bf = (pm0 / pm1) * (p[1] / p[0])

# %%
bf

# %%
with pm.Model() as model_bf_0:
    theta = pm.Beta('theta', 4, 8)
    y = pm.Bernoulli('y', theta, observed=y_d)
    trace_bf_0 = pm.sample(2500, step=pm.SMC())

with pm.Model() as model_bf_1:
    theta = pm.Beta('theta', 8, 4)
    y = pm.Bernoulli('y', theta, observed=y_d)
    trace_bf_1 = pm.sample(2500, step=pm.SMC())

model_bf_0.marginal_likelihood / model_bf_1.marginal_likelihood

# %%
traces = []
waics = []
for coins, heads in [(30, 9), (300, 90)]:
    y_d = np.repeat([0, 1], [coins - heads, heads])
    for priors in [(4, 8), (8, 4)]:
        with pm.Model() as model:
예제 #9
0
                def beam_model(f):
                    return gaussian_beam(f, beam_gauss_width)

            nsamp = 6000

            # Set whether to use the beam_model
            if fitinfo_dict[gal][name]['use_beam']:
                fit_beam_model = beam_model
            else:
                fit_beam_model = None

            out, summ, trace, fit_model = \
                fit_pspec_model(freqs, ps1D,
                                ps1D_stddev,
                                beam_model=fit_beam_model,
                                step=pm.SMC(),
                                nsamp=nsamp,
                                fixB=fitinfo_dict[gal][name]['fixB'])

            row_names.append("{0}_{1}_{2}".format(gal.lower(), name, res_type))

            fit_results['logA'].append(np.array(summ['mean'])[0])
            fit_results['ind'].append(np.array(summ['mean'])[1])
            # fit_results['logB'].append(np.array(summ['mean'])[2])

            fit_results['logA_std'].append(np.array(summ['sd'])[0])
            fit_results['ind_std'].append(np.array(summ['sd'])[1])
            # fit_results['logB_std'].append(np.array(summ['sd'])[2])

            plt.figure(figsize=(8.4, 2.9))
     'confidence',
 ]
 target_name = 'awareness'
 experiment = 'e1'
 # for some of the variables, we need to rescale them to a more preferable range like 0-1
 name_for_scale = ['awareness']
 # ['ah', 'av', 'bj', 'cm', 'db', 'ddb', 'fcm', 'kf', 'kk', 'ml', 'qa','sk', 'yv']
 # get one of the participants' data
 transition_matrix, sub = [], []
 transition_count = []
 for participant, df_sub in df.groupby('participant'):
     awareness = df_sub['awareness'].values - 1
     with pm.Model() as model:
         a = pm.Beta('a', 0.5, 0.5)
         yl = pm.Bernoulli('yl', a, observed=awareness)
         trace = pm.sample(1000, step=pm.SMC(), random_seed=42)
     # for 1-back
     temp = pd.crosstab(pd.Series(df_sub['awareness'].values[1:], name='N'),
                        pd.Series(df_sub['awareness'].values[:-1],
                                  name='N-1'),
                        normalize=1)
     transition_matrix.append(temp.get_values().flatten())
     temp = pd.crosstab(
         pd.Series(df_sub['awareness'].values[1:], name='N'),
         pd.Series(df_sub['awareness'].values[:-1], name='N-1'),
     )
     transition_count.append(temp.get_values().flatten())
     sub.append(participant)
 df1_transition = pd.DataFrame(transition_matrix,
                               columns=[
                                   'unaware-unaware', 'aware-unaware',
예제 #11
0
def fit_pspec_model(
    freqs,
    ps1D,
    ps1D_stddev,
    beam_model=None,
    ntune=2000,
    nsamp=6000,
    step=pm.SMC(),
    cores=1,
    chains=100,
    fixB=False,
    noise_term=False,
    progressbar=True,
    return_model=False,
):
    def powerlaw_model(f, logA, ind, logB=-20):
        return 10**logA * f**-ind + 10**logB

    if beam_model is not None:
        if noise_term:

            def powerlaw_fit_model(f, logA, ind, logB=-20, logC=-20):
                return powerlaw_model(f, logA, ind,
                                      logB) * beam_model(f) + 10**logC
        else:

            def powerlaw_fit_model(f, logA, ind, logB=-20):
                return powerlaw_model(f, logA, ind, logB) * beam_model(f)
    else:
        if noise_term:

            def powerlaw_fit_model(f, logA, ind, logB=-20, logC=-20):
                return powerlaw_model(f, logA, ind, logB) + 10**logC
        else:
            powerlaw_fit_model = powerlaw_model

    # Try a pymc model to fit

    with pm.Model() as model:

        logA = pm.Uniform('logA', -20., 20.)
        ind = pm.Uniform('index', 0.0, 10.)
        if not fixB:
            logB = pm.Uniform('logB', -20., 20.)
        else:
            logB = -20.

        # Weak Gaussian priors
        # logA = pm.Normal('logA', 0., 10.)
        # ind = pm.Normal('index', 0.0, 3.)
        # if not fixB:
        #     logB = pm.Normal('logB', 0., 10.)
        # else:
        #     logB = -20.

        if noise_term:
            logC = pm.Uniform('logC', -20., 20.)
            # logC = pm.Normal('logC', 0., 10.)
            ps_vals = pm.Normal('obs',
                                powerlaw_fit_model(freqs,
                                                   logA,
                                                   ind,
                                                   logB=logB,
                                                   logC=logC),
                                sd=ps1D_stddev,
                                observed=ps1D)
        else:
            ps_vals = pm.Normal('obs',
                                powerlaw_fit_model(freqs, logA, ind,
                                                   logB=logB),
                                sd=ps1D_stddev,
                                observed=ps1D)

        # step = pm.Slice()
        # step = pm.NUTS()
        # step = pm.SMC()

        trace = pm.sample(nsamp,
                          tune=ntune,
                          step=step,
                          progressbar=progressbar,
                          cores=cores,
                          chains=chains)

    summ = pm.summary(trace)

    out = [np.array(summ['mean']), np.array(summ['sd'])]

    if return_model:
        return out, summ, trace, powerlaw_fit_model, model
    else:
        return out, summ, trace, powerlaw_fit_model
예제 #12
0
def fit_broken_pspec_model(freqs,
                           ps1D,
                           ps1D_stddev,
                           beam_model=None,
                           ntune=2000,
                           nsamp=6000,
                           step=pm.SMC(),
                           cores=1,
                           chains=100,
                           fixB=False,
                           noise_term=False,
                           progressbar=True,
                           return_model=False,
                           trace_name=None):

    # https://docs.astropy.org/en/stable/api/astropy.modeling.powerlaws.SmoothlyBrokenPowerLaw1D.html

    def broken_powerlaw_model(f,
                              logA,
                              ind1,
                              ind2,
                              break_f,
                              logB=-20,
                              delta=0.1):

        A = 10**logA
        B = 10**logB

        return A * (f / break_f)**-ind1 * (0.5 *
                                           (1 + (f / break_f)**(1 / delta)))**(
                                               (ind1 - ind2) * delta) + B

    if beam_model is not None:
        if noise_term:

            def powerlaw_fit_model(f,
                                   logA,
                                   ind1,
                                   ind2,
                                   break_f,
                                   logB=-20,
                                   logC=-20):
                return broken_powerlaw_model(f, logA, ind1, ind2, break_f,
                                             logB) * beam_model(f) + 10**logC
        else:

            def powerlaw_fit_model(f, logA, ind1, ind2, break_f, logB=-20):
                return broken_powerlaw_model(f, logA, ind1, ind2, break_f,
                                             logB) * beam_model(f)
    else:
        if noise_term:

            def powerlaw_fit_model(f,
                                   logA,
                                   ind1,
                                   ind2,
                                   break_f,
                                   logB=-20,
                                   logC=-20):
                return broken_powerlaw_model(f, logA, ind1, ind2, break_f,
                                             logB) + 10**logC
        else:
            powerlaw_fit_model = broken_powerlaw_model

    # Try a pymc model to fit

    with pm.Model() as model:

        logA = pm.Uniform('logA', -20., 20.)
        ind1 = pm.Uniform('index1', 0.0, 10.)

        # logA = pm.Normal('logA', 0., 10.)
        # ind1 = pm.Normal('index1', 0.0, 3.)
        # if not fixB:
        #     logB = pm.Normal('logB', 0., 10.)
        # else:
        #     logB = -20.

        # Second index is a perturbation on the first.
        ind2 = ind1 + pm.Normal('index2', 0.0, 10.)

        break_f = pm.Uniform('break_f', freqs.min(), freqs.max())

        if not fixB:
            logB = pm.Uniform('logB', -20., 20.)
        else:
            logB = -20.

        if noise_term:
            logC = pm.Uniform('logC', -20., 20.)
            # logC = pm.Normal('logC', 0., 10.)
            ps_vals = pm.Normal('obs',
                                powerlaw_fit_model(freqs,
                                                   logA,
                                                   ind1,
                                                   ind2,
                                                   break_f,
                                                   logB=logB,
                                                   logC=logC),
                                sd=ps1D_stddev,
                                observed=ps1D,
                                shape=freqs.shape)
        else:
            ps_vals = pm.Normal('obs',
                                powerlaw_fit_model(freqs,
                                                   logA,
                                                   ind1,
                                                   ind2,
                                                   break_f,
                                                   logB=logB),
                                sd=ps1D_stddev,
                                observed=ps1D,
                                shape=freqs.shape)

        # step = pm.Slice()
        # step = pm.NUTS()
        # step = pm.SMC()

        if trace_name is not None:
            trace = pm.load_trace(trace_name)

        else:
            trace = pm.sample(nsamp,
                              tune=ntune,
                              step=step,
                              progressbar=progressbar,
                              cores=cores,
                              chains=chains)

    summ = pm.summary(trace)

    out = [np.array(summ['mean']), np.array(summ['sd'])]

    if return_model:
        return out, summ, trace, powerlaw_fit_model, model
    else:
        return out, summ, trace, powerlaw_fit_model
예제 #13
0
with mixedEffect:
    tracede = pm.sample(5000, njobs=50, tune=1000, step=pm.DEMetropolis())

pm.traceplot(tracede, lines={
    'w': w0,
    'z': z0
})
#%% SMC
n_chains = 500
samples = 1000
tune_interval = 25

with mixedEffect:
    mtrace = pm.sample(samples,
                       chains=n_chains,
                       step=pm.SMC(tune_interval=tune_interval))
#%%
pm.traceplot(mtrace, lines={
    'w': w0,
    'z': z0
})
#%% plot advi and NUTS (copy from pymc3 example)
burnin = 1000
from scipy import stats
import seaborn as sns

gbij = approx.bij
means = gbij.rmap(approx.mean.eval())
cov = approx.cov.eval()
sds = gbij.rmap(np.diag(cov)**.5)