在 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 的唯一解。
我无法理解为什么以下代码无法恢复模型的参数。同样的方法能够很好地恢复二次多项式中的参数。请帮忙。
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 的唯一解。