Восстановление параметров функции синуса в PyMC3 - PullRequest
2 голосов
/ 13 апреля 2020

Я не могу понять, почему следующий код не может восстановить параметры модели. Этот же метод смог довольно хорошо восстановить параметры в квадратичном c полиноме. Пожалуйста, помогите.

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')

1 Ответ

2 голосов
/ 14 апреля 2020

Ваши приоритеты охватывают несколько одинаково действительных решений. Например, отрицательная амплитуда (b) в равной степени объясняется фазой (d), равной pi / 2.

. При выборке MCM C множественные эквивалентные решения в предыдущем пространстве могут привести к мультимодальные апостериорные распределения (как правило, не очень хорошая вещь). Вы можете проверить это, сгенерировав график трассировки. Вот как выглядит график трассировки после выполнения вашего кода:

enter image description here

, который четко показывает несколько режимов (в данном случае в разных цепочках) в b, c, d скрытые переменные.

Взятие среднего значения выборок из мультимодального распределения часто дает вам невероятные параметризации. На графике трассировки мы увидим средства для b,c,d, которые находятся вне любого из режимов. Вот почему вы видите неспособность генерировать разумные средние параметризации.

Попробуйте ограничить ваши предыдущие распределения так, чтобы указывались только уникальные решения для функционального пространства.

...