Почему нет выборки NUTS с помощью tt.dot или pm.math.dot? - PullRequest
0 голосов
/ 06 октября 2018

Я пытаюсь реализовать части пророка Facebook с помощью этого примера.

https://github.com/luke14free/pm-prophet/blob/master/pmprophet/model.py

Все идет хорошо :), но у меня возникли некоторые проблемы с точечным продуктом, которого я не понимаю.Обратите внимание, что я реализую линейные тренды.

ds = pd.to_datetime(df['dagindex'], format='%d-%m-%y')


m = pm.Model()
changepoint_prior_scale = 0.05
n_changepoints = 25
changepoints = pd.date_range(
    start=pd.to_datetime(ds.min()),
    end=pd.to_datetime(ds.max()),
    periods=n_changepoints + 2
)[1: -1]

with m:

    # priors
    sigma = pm.HalfCauchy('sigma', 10, testval=1)
    #trend
    growth = pm.Normal('growth', 0, 10)

    prior_changepoints = pm.Laplace('changepoints', 0, changepoint_prior_scale, shape=len(changepoints))

    y = np.zeros(len(df))

    # indexes x_i for the changepoints. 
    s = [np.abs((ds - i).values).argmin() for i in changepoints]

    g = growth
    x = np.arange(len(ds))
    # delta
    d = prior_changepoints

    regression = x * g

    base_piecewise_regression = []

    for i in s:
        local_x = x.copy()[:-i]
        local_x = np.concatenate([np.zeros(i), local_x])
        base_piecewise_regression.append(local_x)

    piecewise_regression = np.array(base_piecewise_regression)

#  this dot product doesn't work?
    piecewise_regression = pm.math.dot(theano.shared(piecewise_regression).T, d)

#  If I comment out this line and use that one as dot product. It works fine
#     piecewise_regression = (piecewise_regression.T * d[None, :]).sum(axis=-1)
    regression += piecewise_regression

    y += regression

    obs = pm.Normal('y',
                   mu=(y - df.gebruikers.mean()) / df.gebruikers.std(),
                   sd=sigma,
                   observed=(df.gebruikers - df.gebruikers.mean()) / df.gebruikers.std())

    start = pm.find_MAP(maxeval=10000)
    trace = pm.sample(500, step=pm.NUTS(), start=start)

Если запустить приведенный выше фрагмент кода с

piecewise_regression = (piecewise_regression.T * d[None, :]).sum(axis=-1)

, модель будет работать, как и ожидалось.Однако я не могу заставить его работать с точечным продуктом.Сэмплер NUTS не производит сэмплирование вообще.

piecewise_regression = pm.math.dot(theano.shared(piecewise_regression).T, d)

РЕДАКТИРОВАТЬ

У меня есть минимальный рабочий пример

Проблема все еще возникает с theano.общий.У меня есть минимальный рабочий пример:

np.random.seed(5)

n_changepoints = 10
t = np.arange(1000)
s = np.sort(np.random.choice(t, size=n_changepoints, replace=False))
a = (t[:, None] > s) * 1

real_delta = np.random.normal(size=n_changepoints)
y = np.dot(a, real_delta) * t

with pm.Model():
    sigma = pm.HalfCauchy('sigma', 10, testval=1)
    delta = pm.Laplace('delta', 0, 0.05, shape=n_changepoints)
    g = tt.dot(a, delta) * t
    obs = pm.Normal('obs',
                   mu=(g - y.mean()) / y.std(),
                   sd=sigma,
                   observed=(y - y.mean()) / y.std())
    trace = pm.sample(500)

Кажется, это как-то связано с размером матрицы a.NUTS не выполняет выборку, если я начинаю с

t = np.arange (1000)

, однако приведенный выше пример выполняет выборку, когда я уменьшаю размер t до:

t = np.arange (100)

...