|
8 | 8 | from pymc3.gp.cov import Covariance, Constant
|
9 | 9 | from pymc3.gp.mean import Zero
|
10 | 10 | from pymc3.gp.util import (conditioned_vars,
|
11 |
| - infer_shape, stabilize, cholesky, solve_lower, solve_upper) |
| 11 | + infer_shape, stabilize, solve_lower, solve_upper) |
12 | 12 | from pymc3.distributions import draw_values
|
13 | 13 | from pymc3.distributions.dist_math import eigh
|
14 | 14 | from ..math import cartesian, kron_dot, kron_diag
|
15 | 15 |
|
16 | 16 | __all__ = ['Latent', 'Marginal', 'TP', 'MarginalSparse', 'MarginalKron']
|
17 | 17 |
|
| 18 | +cholesky = tt.slinalg.cholesky |
18 | 19 |
|
19 | 20 | class Base(object):
|
20 | 21 | R"""
|
@@ -107,13 +108,13 @@ def __init__(self, mean_func=Zero(), cov_func=Constant(0.0)):
|
107 | 108 |
|
108 | 109 | def _build_prior(self, name, X, reparameterize=True, **kwargs):
|
109 | 110 | mu = self.mean_func(X)
|
110 |
| - chol = cholesky(stabilize(self.cov_func(X))) |
| 111 | + cov = stabilize(self.cov_func(X)) |
111 | 112 | shape = infer_shape(X, kwargs.pop("shape", None))
|
112 | 113 | if reparameterize:
|
113 | 114 | v = pm.Normal(name + "_rotated_", mu=0.0, sd=1.0, shape=shape, **kwargs)
|
114 |
| - f = pm.Deterministic(name, mu + tt.dot(chol, v)) |
| 115 | + f = pm.Deterministic(name, mu + cholesky(cov).dot(v)) |
115 | 116 | else:
|
116 |
| - f = pm.MvNormal(name, mu=mu, chol=chol, shape=shape, **kwargs) |
| 117 | + f = pm.MvNormal(name, mu=mu, cov=cov, shape=shape, **kwargs) |
117 | 118 | return f
|
118 | 119 |
|
119 | 120 | def prior(self, name, X, reparameterize=True, **kwargs):
|
@@ -203,9 +204,8 @@ def conditional(self, name, Xnew, given=None, **kwargs):
|
203 | 204 | """
|
204 | 205 | givens = self._get_given_vals(given)
|
205 | 206 | mu, cov = self._build_conditional(Xnew, *givens)
|
206 |
| - chol = cholesky(stabilize(cov)) |
207 | 207 | shape = infer_shape(Xnew, kwargs.pop("shape", None))
|
208 |
| - return pm.MvNormal(name, mu=mu, chol=chol, shape=shape, **kwargs) |
| 208 | + return pm.MvNormal(name, mu=mu, cov=cov, shape=shape, **kwargs) |
209 | 209 |
|
210 | 210 |
|
211 | 211 | @conditioned_vars(["X", "f", "nu"])
|
@@ -249,14 +249,14 @@ def __add__(self, other):
|
249 | 249 |
|
250 | 250 | def _build_prior(self, name, X, reparameterize=True, **kwargs):
|
251 | 251 | mu = self.mean_func(X)
|
252 |
| - chol = cholesky(stabilize(self.cov_func(X))) |
| 252 | + cov = stabilize(self.cov_func(X)) |
253 | 253 | shape = infer_shape(X, kwargs.pop("shape", None))
|
254 | 254 | if reparameterize:
|
255 | 255 | chi2 = pm.ChiSquared("chi2_", self.nu)
|
256 | 256 | v = pm.Normal(name + "_rotated_", mu=0.0, sd=1.0, shape=shape, **kwargs)
|
257 |
| - f = pm.Deterministic(name, (tt.sqrt(self.nu) / chi2) * (mu + tt.dot(chol, v))) |
| 257 | + f = pm.Deterministic(name, (tt.sqrt(self.nu) / chi2) * (mu + cholesky(cov).dot(v))) |
258 | 258 | else:
|
259 |
| - f = pm.MvStudentT(name, nu=self.nu, mu=mu, chol=chol, shape=shape, **kwargs) |
| 259 | + f = pm.MvStudentT(name, nu=self.nu, mu=mu, cov=cov, shape=shape, **kwargs) |
260 | 260 | return f
|
261 | 261 |
|
262 | 262 | def prior(self, name, X, reparameterize=True, **kwargs):
|
@@ -321,10 +321,9 @@ def conditional(self, name, Xnew, **kwargs):
|
321 | 321 |
|
322 | 322 | X = self.X
|
323 | 323 | f = self.f
|
324 |
| - nu2, mu, covT = self._build_conditional(Xnew, X, f) |
325 |
| - chol = cholesky(stabilize(covT)) |
| 324 | + nu2, mu, cov = self._build_conditional(Xnew, X, f) |
326 | 325 | shape = infer_shape(Xnew, kwargs.pop("shape", None))
|
327 |
| - return pm.MvStudentT(name, nu=nu2, mu=mu, chol=chol, shape=shape, **kwargs) |
| 326 | + return pm.MvStudentT(name, nu=nu2, mu=mu, cov=cov, shape=shape, **kwargs) |
328 | 327 |
|
329 | 328 |
|
330 | 329 | @conditioned_vars(["X", "y", "noise"])
|
@@ -418,15 +417,15 @@ def marginal_likelihood(self, name, X, y, noise, is_observed=True, **kwargs):
|
418 | 417 | if not isinstance(noise, Covariance):
|
419 | 418 | noise = pm.gp.cov.WhiteNoise(noise)
|
420 | 419 | mu, cov = self._build_marginal_likelihood(X, noise)
|
421 |
| - chol = cholesky(stabilize(cov)) |
| 420 | + cov = stabilize(cov) |
422 | 421 | self.X = X
|
423 | 422 | self.y = y
|
424 | 423 | self.noise = noise
|
425 | 424 | if is_observed:
|
426 |
| - return pm.MvNormal(name, mu=mu, chol=chol, observed=y, **kwargs) |
| 425 | + return pm.MvNormal(name, mu=mu, cov=cov, observed=y, **kwargs) |
427 | 426 | else:
|
428 | 427 | shape = infer_shape(X, kwargs.pop("shape", None))
|
429 |
| - return pm.MvNormal(name, mu=mu, chol=chol, shape=shape, **kwargs) |
| 428 | + return pm.MvNormal(name, mu=mu, cov=cov, shape=shape, **kwargs) |
430 | 429 |
|
431 | 430 | def _get_given_vals(self, given):
|
432 | 431 | if given is None:
|
@@ -504,9 +503,8 @@ def conditional(self, name, Xnew, pred_noise=False, given=None, **kwargs):
|
504 | 503 |
|
505 | 504 | givens = self._get_given_vals(given)
|
506 | 505 | mu, cov = self._build_conditional(Xnew, pred_noise, False, *givens)
|
507 |
| - chol = cholesky(cov) |
508 | 506 | shape = infer_shape(Xnew, kwargs.pop("shape", None))
|
509 |
| - return pm.MvNormal(name, mu=mu, chol=chol, shape=shape, **kwargs) |
| 507 | + return pm.MvNormal(name, mu=mu, cov=cov, shape=shape, **kwargs) |
510 | 508 |
|
511 | 509 | def predict(self, Xnew, point=None, diag=False, pred_noise=False, given=None):
|
512 | 510 | R"""
|
@@ -797,9 +795,8 @@ def conditional(self, name, Xnew, pred_noise=False, given=None, **kwargs):
|
797 | 795 |
|
798 | 796 | givens = self._get_given_vals(given)
|
799 | 797 | mu, cov = self._build_conditional(Xnew, pred_noise, False, *givens)
|
800 |
| - chol = cholesky(cov) |
801 | 798 | shape = infer_shape(Xnew, kwargs.pop("shape", None))
|
802 |
| - return pm.MvNormal(name, mu=mu, chol=chol, shape=shape, **kwargs) |
| 799 | + return pm.MvNormal(name, mu=mu, cov=cov, shape=shape, **kwargs) |
803 | 800 |
|
804 | 801 |
|
805 | 802 | @conditioned_vars(["Xs", "y", "sigma"])
|
@@ -959,7 +956,7 @@ def _build_conditional(self, Xnew, pred_noise, diag):
|
959 | 956 | cov = Km - Asq
|
960 | 957 | if pred_noise:
|
961 | 958 | cov += sigma * np.eye(cov.shape)
|
962 |
| - return mu, cov |
| 959 | + return mu, stabilize(cov) |
963 | 960 |
|
964 | 961 | def conditional(self, name, Xnew, pred_noise=False, **kwargs):
|
965 | 962 | """
|
@@ -996,9 +993,8 @@ def conditional(self, name, Xnew, pred_noise=False, **kwargs):
|
996 | 993 | constructor.
|
997 | 994 | """
|
998 | 995 | mu, cov = self._build_conditional(Xnew, pred_noise, False)
|
999 |
| - chol = cholesky(stabilize(cov)) |
1000 | 996 | shape = infer_shape(Xnew, kwargs.pop("shape", None))
|
1001 |
| - return pm.MvNormal(name, mu=mu, chol=chol, shape=shape, **kwargs) |
| 997 | + return pm.MvNormal(name, mu=mu, cov=cov, shape=shape, **kwargs) |
1002 | 998 |
|
1003 | 999 | def predict(self, Xnew, point=None, diag=False, pred_noise=False):
|
1004 | 1000 | R"""
|
|
0 commit comments