From 2bdecbeab2b18522c026a8835ee3ac4d106da064 Mon Sep 17 00:00:00 2001 From: Scott Linderman <scott.linderman@gmail.com> Date: Wed, 18 Oct 2017 11:38:32 -0400 Subject: [PATCH] make robustregression _robust_ to nans. har har. --- pybasicbayes/distributions/regression.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/pybasicbayes/distributions/regression.py b/pybasicbayes/distributions/regression.py index 3b5488a..f09b5f2 100644 --- a/pybasicbayes/distributions/regression.py +++ b/pybasicbayes/distributions/regression.py @@ -942,9 +942,9 @@ class RobustRegression(Regression): sigma_inv, L = inv_psd(sigma, return_chol=True) r = y - self.predict(x) - z = solve_triangular(L, r.T, lower=True).T + z = sigma_inv.dot(r.T).T - out = -0.5 * (nu + D) * np.log(1.0 + (z * z).sum(1) / nu) + out = -0.5 * (nu + D) * np.log(1.0 + (r * z).sum(1) / nu) out += gammaln((nu + D) / 2.0) - gammaln(nu / 2.0) - D / 2.0 * np.log(nu) \ - D / 2.0 * np.log(np.pi) - np.log(np.diag(L)).sum() @@ -1054,16 +1054,20 @@ class RobustRegression(Regression): assert y.shape[1] == self.D_out N = x.shape[0] + # Weed out the nan's + bad = np.any(np.isnan(x), axis=1) | np.any(np.isnan(y), axis=1) + # Compute posterior params of gamma distribution a_post = self.nu / 2.0 + self.D_out / 2.0 r = y - self.predict(x) - L = np.linalg.cholesky(self.sigma) - z = solve_triangular(L, r.T, lower=True).T - b_post = self.nu / 2.0 + (z * z).sum(1) / 2.0 + sigma_inv = inv_psd(self.sigma) + z = sigma_inv.dot(r.T).T + b_post = self.nu / 2.0 + (r * z).sum(1) / 2.0 assert np.isscalar(a_post) and b_post.shape == (N,) - tau = np.random.gamma(a_post, 1./b_post) + tau = np.zeros(N) + tau[~bad] = np.random.gamma(a_post, 1./b_post[~bad]) return tau -- GitLab