如何决定在PyMC3中对参数使用什么priors分布?

问题描述 投票:0回答:1

我正在研究PyMC3包,我有兴趣在一个场景中实现该包,我有几个不同的信号,每个信号有不同的振幅。

然而,我卡在什么类型的前值,我需要使用,以实现PyMC3到它和似然分布实现。场景示例如下图所示。

Signal plot

我试着在这里实现它,但是,每次我都会收到错误信息。

pymc3.exceptions.SamplingError: Bad initial energy

我的代码

## Signal 1:
    with pm.Model() as model:
        # Parameters:
        # Prior Distributions:
        # BoundedNormal = pm.Bound(pm.Exponential, lower=0.0, upper=np.inf)
        # c = BoundedNormal('c', lam=10)
        # c = pm.Uniform('c', lower=0, upper=300)
        alpha = pm.Normal('alpha', mu = 0, sd = 10)
        beta = pm.Normal('beta', mu = 0, sd = 1)
        sigma = pm.HalfNormal('sigma', sd = 1)
        mu = pm.Normal('mu', mu=0, sigma=1)
        sd = pm.HalfNormal('sd', sigma=1)

        # Observed data is from a Multinomial distribution:
        # Likelihood distributions:
        # bradford = pm.DensityDist('observed_data', logp=bradford_logp, observed=dict(value=S1, loc=mu, scale=sd, c=c))
        # observed_data = pm.Beta('observed_data', mu=mu, sd=sd, observed=S1)
        observed_data = pm.Beta('observed_data', alpha=alpha, beta=beta, mu=mu, sd=sd, observed=S1)

    with model:
        # obtain starting values via MAP
        startvals = pm.find_MAP(model=model)

        # instantiate sampler
        # step = pm.Metropolis()
        step = pm.HamiltonianMC()
        # step = pm.NUTS()

        # draw 5000 posterior samples
        trace = pm.sample(start=startvals, draws=1000, step=step, tune=500, chains=4, cores=1, discard_tuned_samples=True)

        # Obtaining Posterior Predictive Sampling:
        post_pred = pm.sample_posterior_predictive(trace, samples=500)
        print(post_pred['observed_data'].shape)

    plt.title('Trace Plot of Signal 1')
    pm.traceplot(trace, var_names=['mu', 'sd'], divergences=None, combined=True)
    plt.show(block=False)
    plt.pause(5)  # Pauses the program for 5 seconds
    plt.close('all')

    pm.plot_posterior(trace, var_names=['mu', 'sd'])
    plt.title('Posterior Plot of Signal 1')
    plt.show(block=False)
    plt.pause(5)  # Pauses the program for 5 seconds
    plt.close('all')

侧面问题

我也一直在研究如何在使用高斯分布以外的不同分布的同时,实现对健身测试和卡尔曼滤波的良好性的想法,所以,如果你有时间的话,我会很感激,如果你能看一下它们?这两个问题都可以在这里找到。

拟合度测试链接。拟合度测试

卡尔曼滤波器链接。卡尔曼滤波器


编辑1

假设我有大约5个信号,想实现贝叶斯接口,以便看到信号的PDF差异。我如何处理这个问题?我是否需要创建多个模型并得到它们的后验分布?就像这张图片一样。

Distribution plots

如果我需要得到后验分布,我是否需要使用以下代码?

# Obtaining Posterior Predictive Sampling:
post_pred = pm.sample_posterior_predictive(trace, samples=500)

编辑2

如果我有多个信号,我是否可以这样实现,以便看到在 alphabeta 在所有信号中?

        observed_data_S1 = pm.Beta('observed_data_S1', alpha=alpha[0], beta=beta[0], observed=S1[0])
        observed_data_S2 = pm.Beta('observed_data_S2', alpha=alpha[1], beta=beta[1], observed=S2[0])
        observed_data_S3 = pm.Beta('observed_data_S3', alpha=alpha[2], beta=beta[2], observed=S3[0])
        observed_data_S4 = pm.Beta('observed_data_S4', alpha=alpha[3], beta=beta[3], observed=S4[0])
        observed_data_S5 = pm.Beta('observed_data_S5', alpha=alpha[4], beta=beta[4], observed=S5[0])
        observed_data_S6 = pm.Beta('observed_data_S6', alpha=alpha[5], beta=beta[5], observed=S6[0])

编辑3.如何在一个图中绘制多条痕迹?

我怎么能在一个图中绘制多条轨迹呢,因为我在看多个信号,想把所有的alphas和betas一起梳理在一个图中。

python statistics distribution pymc3 pymc
1个回答
1
投票

第一个错误: Beta分布参数 alphabeta 必须是正值。您在它们身上使用了一个法线前值,这使得RV可以取负值和0。您可以通过使用 pm.Bound 关于 pm.Normal 发行或使用 pm.HalfNormal 分布,而不是。

第二个错误: 另一个不一致的地方是,规定 musigma 与...一起 alphabeta 的参数。测试版要么接受 musigmaalphabeta 但不能同时使用。默认行为是使用 alphabeta 参数过 musigma 的参数。你正在浪费大量的计算能力来推断出... musigma 出。

其他评论: 你不应该使用 sd 参数在3.8版以后的任何发行版中都是不适用的,并将在3.9版中被删除。在3.9版本中使用 sigma 而不是。

更正后的版本:

import numpy as np
import theano
import theano.tensor as tt
import pymc3 as pm
import matplotlib.pyplot as plt

S1 = np.random.rand(10)

## Signal 1:
with pm.Model() as model:
    # Parameters:
    # Prior Distributions:
    # BoundedNormal = pm.Bound(pm.Exponential, lower=0.0, upper=np.inf)
    # c = BoundedNormal('c', lam=10)
    # c = pm.Uniform('c', lower=0, upper=300)
    alpha = pm.HalfNormal('alpha', sigma=10)
    beta = pm.HalfNormal('beta', sigma=1)

    # Observed data is from a Multinomial distribution:
    # Likelihood distributions:
    # bradford = pm.DensityDist('observed_data', logp=bradford_logp, observed=dict(value=S1, loc=mu, scale=sd, c=c))
    # observed_data = pm.Beta('observed_data', mu=mu, sd=sd, observed=S1)
    observed_data = pm.Beta('observed_data', alpha=alpha, beta=beta, observed=S1)

with model:
    # obtain starting values via MAP
    startvals = pm.find_MAP(model=model)

    # instantiate sampler
    # step = pm.Metropolis()
    step = pm.HamiltonianMC()
    # step = pm.NUTS()

    # draw 5000 posterior samples
    trace = pm.sample(start=startvals, draws=1000, step=step, tune=500, chains=4, cores=1, discard_tuned_samples=True)

    # Obtaining Posterior Predictive Sampling:
    post_pred = pm.sample_posterior_predictive(trace, samples=500)
    print(post_pred['observed_data'].shape)

plt.title('Trace Plot of Signal 1')
pm.traceplot(trace, var_names=['alpha', 'beta'], divergences=None, combined=True)
plt.show(block=False)
plt.pause(5)  # Pauses the program for 5 seconds
plt.close('all')

pm.plot_posterior(trace, var_names=['alpha', 'beta'])
plt.title('Posterior Plot of Signal 1')
plt.show(block=False)
plt.pause(5)  # Pauses the program for 5 seconds
plt.close('all')


© www.soinside.com 2019 - 2024. All rights reserved.