Generalized power law using Gaussian processes

I’ve been wrestling with a GP problem for awhile now, and I’ve hit a wall.

I’m trying to fit a generalized power law that has a GP ( f(x)) for the exponent:

y = \log(Y)\\ y = a + f(x) \log(x-c)

Exponentiating would give:

Y = A \exp(x-c)^{f(x)}

but I’ve been unable to fit f(x) properly.

Here’s the model and full notebook

with pm.Model() as model:
    ℓ = pm.Gamma("ℓ", alpha=3, beta=1)
    η = pm.HalfCauchy("η", beta=1)

    cov = η ** 2 *, ℓ)
    #b = pm.Normal("b", mu=2, sigma=0.3)
    #mean =
    mean =
    gp =, cov_func=cov)
    a = pm.Normal("a", mu=0, sigma=10)
    c = pm.TruncatedNormal("c", mu=0, sigma=10, shape=1, upper=x.min()-1e-6)
    f = gp.prior("f", X=x)
    σ = pm.HalfCauchy("σ", beta=1)

    mu = a + f * at.log( x - c)

    y_ = pm.Normal("y", mu=mu, sigma=σ, observed=y)

And here is the result. Ideally, f(x) would fit the slope change around x=11

and here is f(x).