Я пытаюсь использовать PYMC3 для байесовской модели, где я хотел бы неоднократно обучать свою модель новым невидимым данным. Я думаю, мне нужно будет обновлять априорные значения апостериорной частью ранее обученной модели каждый раз, когда я вижу данные, аналогично тому, как это достигается здесь https://docs.pymc.io/notebooks/updating_priors.html. Они используют следующую функцию, которая находит KDE из примеров и заменяет каждое из исходных определений параметров в модели вызовом from_posterior.
def from_posterior(param, samples):
smin, smax = np.min(samples), np.max(samples)
width = smax - smin
x = np.linspace(smin, smax, 100)
y = stats.gaussian_kde(samples)(x)
# what was never sampled should have a small probability but not 0,
# so we'll extend the domain and use linear approximation of density on it
x = np.concatenate([[x[0] - 3 * width], x, [x[-1] + 3 * width]])
y = np.concatenate([[0], y, [0]])
return Interpolated(param, x, y)
А вот и моя оригинальная модель.
def create_model(batsmen, bowlers, id1, id2, X):
testval = [[-5,0,1,2,3.5,5] for i in range(0, 9)]
l = [i for i in range(9)]
model = pm.Model()
with model:
delta_1 = pm.Uniform("delta_1", lower=0, upper=1)
delta_2 = pm.Uniform("delta_2", lower=0, upper=1)
inv_sigma_sqr = pm.Gamma("sigma^-2", alpha=1.0, beta=1.0)
inv_tau_sqr = pm.Gamma("tau^-2", alpha=1.0, beta=1.0)
mu_1 = pm.Normal("mu_1", mu=0, sigma=1/pm.math.sqrt(inv_tau_sqr), shape=len(batsmen))
mu_2 = pm.Normal("mu_2", mu=0, sigma=1/pm.math.sqrt(inv_tau_sqr), shape=len(bowlers))
delta = pm.math.ge(l, 3) * delta_1 + pm.math.ge(l, 6) * delta_2
eta = [pm.Deterministic("eta_" + str(i), delta[i] + mu_1[id1[i]] - mu_2[id2[i]]) for i in range(9)]
cutpoints = pm.Normal("cutpoints", mu=0, sigma=1/pm.math.sqrt(inv_sigma_sqr), transform=pm.distributions.transforms.ordered, shape=(9,6), testval=testval)
X_ = [pm.OrderedLogistic("X_" + str(i), cutpoints=cutpoints[i], eta=eta[i], observed=X[i]-1) for i in range(9)]
return model
Здесь проблема в том, что некоторые из моих параметров, например mu_1, многомерны. Вот почему я получаю следующую ошибку:
ValueError: points have dimension 1, dataset has dimension 1500
из-за строки y = stats.gaussian_kde(samples)(x).
Может ли кто-нибудь помочь мне сделать эту работу для многомерных параметров? Я не совсем понимаю, что такое KDE и как код его вычисляет.
Заранее спасибо!!
mu_*
являются многомерными по Гауссу, поэтому вы должны использовать сопряженные априорные значения и обновленные априорные значения в закрытой форме для них и их точности. Возможно, этот ответ может быть полезен, хотя в вашем случае вам нужно проконсультироваться с конъюгаты для многомерной нормы. - person merv   schedule 13.10.2020