Инкрементальные байесовские обновления с многомерными параметрами

Я пытаюсь использовать 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 и как код его вычисляет.

Заранее спасибо!!


person SinByCos    schedule 11.10.2020    source источник
comment
Действительно ли параметр 1500 размерный? Это было бы недопустимо с текущей стратегией в этом коде, поскольку это подразумевает использование образца сетки из приближения KDE для создания нового предшествующего. То есть мы говорим о 100 ^ 1500 сэмплах по 100 сэмплов на измерение. В качестве альтернативы вы можете выделить каждое измерение (всего 100 * 1500 выборок), но это отбросит любую ковариацию. Технически эта стратегия KDE уже ограничивает отдельные параметры для генерации обновленных априорных значений, поэтому она не является полностью байесовской (сохранение информации).   -  person merv    schedule 12.10.2020
comment
Привет! Нет, извините, параметры не 1500 размерные, они около 200 размерных. 1500 из-за количества итераций, которые моя модель выполняла, для которых сгенерирована трассировка   -  person SinByCos    schedule 12.10.2020
comment
Хорошо, но 200 по-прежнему невозможно с этим подходом KDE. Переменные mu_* являются многомерными по Гауссу, поэтому вы должны использовать сопряженные априорные значения и обновленные априорные значения в закрытой форме для них и их точности. Возможно, этот ответ может быть полезен, хотя в вашем случае вам нужно проконсультироваться с конъюгаты для многомерной нормы.   -  person merv    schedule 13.10.2020