在 PyMC3 中恢复正弦函数参数

Recovering sine function paramters in PyMC3

我无法理解为什么以下代码无法恢复模型的参数。同样的方法能够很好地恢复二次多项式中的参数。请帮忙。

def sin(a,b,c,d,x):
return a + b*np.sin(c*x+d)

x = np.linspace(0,10,1000)

y = sin(0,0.5,0.5,4,x) + np.random.normal(0, 0.05, len(x))

with pm.Model() as model_sin:
    a = pm.Uniform('a',-10,10)
    b = pm.Uniform('b',-10,10)
    c = pm.Uniform('c',-10,10)
    d = pm.Uniform('d',-10,10)
    epsilon = pm.Exponential('epsilon', 1/30)
    mu = sin(a,b,c,d,x)

    y_pred = pm.beta('y_pred', mu ,observed=y)
    trace_sin = pm.sample(1000, step = pm.NUTS())
plt.scatter(x,y,c='r')
plt.plot(x,sin(trace_sin['a'].mean(),trace_sin['b'].mean(),trace_sin['c'].mean(),trace_sin['d'].mean(),x), c='b')

您的先验涵盖多个同样有效的解决方案。例如,负振幅 (b) 同样可以用 pi/2.

的相位 (d) 来解释

在 MCMC 采样中,先验中的多个等价解 space 会导致多峰后验分布(通常不是好事)。您可以通过生成跟踪图来检查这一点。这是 运行 您的代码后跟踪图的样子:

这清楚地显示了 b, c, d 潜在变量中的多种模式(在本例中跨越不同的链)。

从多峰分布中取样本的平均值通常会给您带来不太可能的参数化。在这里的轨迹图中,我们将看到 b,c,d 的均值在任何模式之外。这就是为什么您看到无法生成合理的平均参数化。

尝试限制您的先验分布,以便仅指定函数 space 的唯一解。