def __init__(self, var, mean=None): var = B.array(var) # Consider all various ranks of `var` and `mean` for convenient # broadcasting behaviour. if mean is not None: mean = B.array(mean) if B.rank(var) == 1: if B.rank(mean) == 0: mean = mean * \ B.ones([B.shape(var)[0], 1], dtype=B.dtype(var)) elif B.rank(mean) == 1: mean = mean[:, None] else: raise ValueError('Invalid rank {} of mean.' ''.format(B.rank(mean))) var = Diagonal(var) elif B.rank(var) == 0: if B.rank(mean) == 0: mean = mean * B.ones([1, 1], dtype=B.dtype(var)) var = UniformlyDiagonal(var, 1) elif B.rank(mean) == 1: mean = mean[:, None] var = UniformlyDiagonal(var, B.shape(mean)[0]) else: raise ValueError('Invalid rank {} of mean.' ''.format(B.rank(mean))) else: raise ValueError('Invalid rank {} of variance.' ''.format(B.rank(var))) else: if B.rank(var) == 0: var = UniformlyDiagonal(var, 1) elif B.rank(var) == 1: var = Diagonal(var) else: raise ValueError('Invalid rank {} of variance.' ''.format(B.rank(var))) Normal.__init__(self, var, mean)
def test_derivative(): B.backend_to_tf() s = B.Session() m = TensorProductMean(lambda x: x**2) m2 = TensorProductMean(lambda x: x**3) x = B.array(np.random.randn(10, 1)) yield assert_allclose, s.run(m.diff(0)(x)), s.run(2 * x) yield assert_allclose, s.run(m2.diff(0)(x)), s.run(3 * x**2) s.close() B.backend_to_np()
def logpdf(self, x): """Compute the log-pdf. Args: x (input): Values to compute the log-pdf of. Returns: list[tensor]: Log-pdf for every input in `x`. If it can be determined that the list contains only a single log-pdf, then the list is flattened to a scalar. """ # Convert to numeric type if necessary. x = B.array(x) if isinstance(x, (list, tuple)) else x logpdfs = -(B.logdet(self.var) + B.cast(self.dim, dtype=self.dtype) * B.cast(B.log_2_pi, dtype=self.dtype) + B.qf_diag(self.var, uprank(x) - self.mean)) / 2 return logpdfs[0] if B.shape_int(logpdfs) == (1, ) else logpdfs
def dense(a): return B.array(a)
def test_derivative(): # First, check properties. k = EQ().diff(0) yield eq, k.stationary, False yield raises, RuntimeError, lambda: k.length_scale yield raises, RuntimeError, lambda: k.var yield raises, RuntimeError, lambda: k.period # Test equality. yield eq, EQ().diff(0), EQ().diff(0) yield neq, EQ().diff(0), EQ().diff(1) yield neq, Matern12().diff(0), EQ().diff(0) yield raises, RuntimeError, lambda: EQ().diff(None, None)(1) # Third, check computation. B.backend_to_tf() s = B.Session() # Test derivative of kernel EQ. k = EQ() x1 = B.array(np.random.randn(10, 1)) x2 = B.array(np.random.randn(5, 1)) # Test derivative with respect to first input. ref = s.run(-dense(k(x1, x2)) * (x1 - B.transpose(x2))) yield assert_allclose, s.run(dense(k.diff(0, None)(x1, x2))), ref ref = s.run(-dense(k(x1)) * (x1 - B.transpose(x1))) yield assert_allclose, s.run(dense(k.diff(0, None)(x1))), ref # Test derivative with respect to second input. ref = s.run(-dense(k(x1, x2)) * (B.transpose(x2) - x1)) yield assert_allclose, s.run(dense(k.diff(None, 0)(x1, x2))), ref ref = s.run(-dense(k(x1)) * (B.transpose(x1) - x1)) yield assert_allclose, s.run(dense(k.diff(None, 0)(x1))), ref # Test derivative with respect to both inputs. ref = s.run(dense(k(x1, x2)) * (1 - (x1 - B.transpose(x2))**2)) yield assert_allclose, s.run(dense(k.diff(0, 0)(x1, x2))), ref yield assert_allclose, s.run(dense(k.diff(0)(x1, x2))), ref ref = s.run(dense(k(x1)) * (1 - (x1 - B.transpose(x1))**2)) yield assert_allclose, s.run(dense(k.diff(0, 0)(x1))), ref yield assert_allclose, s.run(dense(k.diff(0)(x1))), ref # Test derivative of kernel Linear. k = Linear() x1 = B.array(np.random.randn(10, 1)) x2 = B.array(np.random.randn(5, 1)) # Test derivative with respect to first input. ref = s.run(B.ones((10, 5), dtype=np.float64) * B.transpose(x2)) yield assert_allclose, s.run(dense(k.diff(0, None)(x1, x2))), ref ref = s.run(B.ones((10, 10), dtype=np.float64) * B.transpose(x1)) yield assert_allclose, s.run(dense(k.diff(0, None)(x1))), ref # Test derivative with respect to second input. ref = s.run(B.ones((10, 5), dtype=np.float64) * x1) yield assert_allclose, s.run(dense(k.diff(None, 0)(x1, x2))), ref ref = s.run(B.ones((10, 10), dtype=np.float64) * x1) yield assert_allclose, s.run(dense(k.diff(None, 0)(x1))), ref # Test derivative with respect to both inputs. ref = s.run(B.ones((10, 5), dtype=np.float64)) yield assert_allclose, s.run(dense(k.diff(0, 0)(x1, x2))), ref yield assert_allclose, s.run(dense(k.diff(0)(x1, x2))), ref ref = s.run(B.ones((10, 10), dtype=np.float64)) yield assert_allclose, s.run(dense(k.diff(0, 0)(x1))), ref yield assert_allclose, s.run(dense(k.diff(0)(x1))), ref s.close() B.backend_to_np()