Closed
Description
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
Labels
No labels