Skip to content

pm.Bound'ed priors on lengthscale parameters not working #1858

Closed
@bwengals

Description

@bwengals

Nearly all of the covariance functions in gp/cov.py do not support bounds on priors for lengthscale parameters. l = pm.Normal("l", 1, 5) works as expected, but l = pm.Bound(pm.Normal('l', 1, 5), 0.0, np.inf) fails. Being able to use bounds is important to give lengthscale parameters informative priors while forcing them to have positive support.

Code to reproduce the error is below.

import pymc3 as pm
import numpy as np

X = np.linspace(0,1,10)[:,None]
y = np.random.randn(10)
with pm.Model() as model:
    l = pm.Bound(pm.Normal("l", 1, 5.0), 0.0, np.inf)
    s2 = pm.HalfNormal("s2", sd=5)
    s2_n = pm.HalfNormal("s2_n", sd=5)
    
    cov_f = s2 * pm.gp.cov.ExpQuad(1, l)

    y_obs = pm.gp.GP('y_obs', cov_func=cov_f, sigma=s2_n, observed={'X':X, 'Y':y})
    trace = pm.sample(2000, step=pm.NUTS())

The traceback produced:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-1-5282f575ae01> in <module>()
     11     cov_f = s2 * pm.gp.cov.ExpQuad(1, l)
     12 
---> 13     y_obs = pm.gp.GP('y_obs', cov_func=cov_f, sigma=s2_n, observed={'X':X, 'Y':y})
     14     trace = pm.sample(2000, step=pm.NUTS())

/home/bill/pymc3/pymc3/distributions/distribution.py in __new__(cls, name, *args, **kwargs)
     33             total_size = kwargs.pop('total_size', None)
     34             dist = cls.dist(*args, **kwargs)
---> 35             return model.Var(name, dist, data, total_size)
     36         else:
     37             raise TypeError("Name needs to be a string but got: %s" % name)

/home/bill/pymc3/pymc3/model.py in Var(self, name, dist, data, total_size)
    517         elif isinstance(data, dict):
    518             var = MultiObservedRV(name=name, data=data, distribution=dist,
--> 519                                   total_size=total_size, model=self)
    520             self.observed_RVs.append(var)
    521             if var.missing_values:

/home/bill/pymc3/pymc3/model.py in __init__(self, name, data, distribution, total_size, model)
    895         self.missing_values = [datum.missing_values for datum in self.data.values()
    896                                if datum.missing_values is not None]
--> 897         self.logp_elemwiset = distribution.logp(**self.data)
    898         self.total_size = total_size
    899         self.model = model

/home/bill/pymc3/pymc3/gp/gp.py in logp(self, Y, X)
     72             X = self.X
     73         mu = self.M(X).squeeze()
---> 74         Sigma = self.K(X) + tt.eye(X.shape[0])*self.sigma**2
     75 
     76         return MvNormal.dist(mu, Sigma).logp(Y)

/home/bill/pymc3/pymc3/gp/cov.py in __call__(self, X, Z)
    104     def __call__(self, X, Z=None):
    105         return reduce((lambda x, y: x * y),
--> 106                       [k(X, Z) if isinstance(k, Covariance) else k for k in self.factor_list])
    107 
    108 

/home/bill/pymc3/pymc3/gp/cov.py in <listcomp>(.0)
    104     def __call__(self, X, Z=None):
    105         return reduce((lambda x, y: x * y),
--> 106                       [k(X, Z) if isinstance(k, Covariance) else k for k in self.factor_list])
    107 
    108 

/home/bill/pymc3/pymc3/gp/cov.py in __call__(self, X, Z)
    152     def __call__(self, X, Z=None):
    153         X, Z = self._slice(X, Z)
--> 154         return tt.exp( -0.5 * self.square_dist(X, Z))
    155 
    156 

/home/bill/pymc3/pymc3/gp/cov.py in square_dist(self, X, Z)
    124 
    125     def square_dist(self, X, Z):
--> 126         X = tt.mul(X, 1.0 / self.lengthscales)
    127         Xs = tt.sum(tt.square(X), 1)
    128         if Z is None:

TypeError: unsupported operand type(s) for /: 'float' and 'Bound'

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions