def test_expand(self): print 'expand' print '1d' k = ff.SqExpKernel(dimension=0, lengthscale=0, sf=0) expanded = grammar.expand_kernels(1, [k], base_kernels='SE', rules=None) for k in expanded: print '\n', k.pretty_print(), '\n' print '2d' k = ff.SqExpKernel(dimension=0, lengthscale=0, sf=0) expanded = grammar.expand_kernels(2, [k], base_kernels='SE', rules=None) for k in expanded: print '\n', k.pretty_print(), '\n' print '3d' k = ff.SqExpKernel(dimension=0, lengthscale=0, sf=0) expanded = grammar.expand_kernels(3, [k], base_kernels='SE', rules=None) for k in expanded: print '\n', k.pretty_print(), '\n' print '3d with two SEs' k = ff.SqExpKernel(dimension=0, lengthscale=0, sf=0) expanded = grammar.expand_kernels(3, [k + k.copy()], base_kernels='SE', rules=None) for k in expanded: print '\n', k.pretty_print(), '\n'
def test_collapse_mult_idempotent(self): k = ff.SqExpKernel(dimension=0, lengthscale=0, sf=1) k1 = k.copy() k2 = k.copy() k = k1 * k2 print '\n', k.pretty_print(), '\n' k = k.collapse_multiplicative_idempotency() assert (isinstance(k, ff.SqExpKernel)) and (k.dimension == 0) print '\n', k.pretty_print(), '\n' k = ff.SqExpKernel(dimension=0, lengthscale=0, sf=1) k1 = k.copy() k2 = k.copy() k = ff.SqExpKernel(dimension=1, lengthscale=2, sf=2) k3 = k.copy() k4 = k.copy() k5 = ff.NoiseKernel(sf=-1) k6 = ff.ConstKernel(sf=1) k = k1 * k2 * k3 * k4 * k5 * k5.copy() + k6 + k6.copy() print '\n', k.pretty_print(), '\n' k = k.collapse_multiplicative_idempotency() print '\n', k.pretty_print(), '\n' k = k1 * k2 * k3 * k4 * k5 * k5.copy() * k6 * k6.copy() print '\n', k.pretty_print(), '\n' k = k.collapse_multiplicative_idempotency() print '\n', k.pretty_print(), '\n'
def test_distribute_products_k(self): print 'distribute' k = ff.SqExpKernel(dimension=0, lengthscale=0, sf=1) k1 = k.copy() k2 = k.copy() k = ff.SqExpKernel(dimension=1, lengthscale=2, sf=2) k3 = k.copy() k4 = k.copy() k5 = ff.NoiseKernel(sf=-1) k6 = ff.ConstKernel(sf=1) k = (k1 + k2 + k3) * (k4 + k5) print '\n', k.pretty_print(), '\n' components = k.distribute_products().simplified() print components print components.collapse_additive_idempotency() for k in components.operands: print '\n', k.pretty_print(), '\n' k = ff.SqExpKernel(dimension=0, lengthscale=0, sf=1) k1 = k.copy() k2 = k.copy() k = ff.SqExpKernel(dimension=1, lengthscale=2, sf=2) k3 = k.copy() k4 = k.copy() k5 = ff.NoiseKernel(sf=-1) k6 = ff.ConstKernel(sf=1) k = (k1 * (k2 + k3)) + (k4 * k5) print '\n', k.pretty_print(), '\n' components = k.distribute_products().simplified() print components print components.collapse_additive_idempotency() for k in components.operands: print '\n', k.pretty_print(), '\n'
def test_simplify(self): m = ff.GPModel(mean=ff.MeanZero(), kernel=ff.SumKernel(operands=[ ff.ProductKernel(operands=[ ff.ConstKernel(sf=0.170186999131), ff.SqExpKernel(dimension=0, lengthscale=1.02215322228, sf=5.9042619611) ]), ff.ProductKernel(operands=[ ff.NoiseKernel(sf=2.43188502201), ff.ConstKernel(sf=-0.368638271154) ]), ff.ProductKernel(operands=[ ff.NoiseKernel(sf=1.47110516981), ff.PeriodicKernel(dimension=0, lengthscale=-1.19651800365, period=0.550394248167, sf=0.131044872864) ]), ff.ProductKernel(operands=[ ff.SqExpKernel(dimension=0, lengthscale=3.33346140605, sf=3.7579461353), ff.PeriodicKernel(dimension=0, lengthscale=0.669624964607, period=0.00216264543496, sf=2.41995024965) ]) ]), likelihood=ff.LikGauss(sf=-np.inf), nll=599.59757993, ndata=144) assert not m.simplified() == m m = ff.GPModel(mean=ff.MeanZero(), kernel=ff.SumKernel(operands=[ ff.ProductKernel(operands=[ ff.ConstKernel(sf=0.170186999131), ff.SqExpKernel(dimension=0, lengthscale=1.02215322228, sf=5.9042619611) ]), ff.ProductKernel(operands=[ ff.NoiseKernel(sf=2.43188502201), ff.ConstKernel(sf=-0.368638271154) ]) ]), likelihood=ff.LikGauss(sf=-np.inf), nll=599.59757993, ndata=144) assert not m.simplified() == m
def test_canonical_k(self): print 'canonical_k form' k = ff.SqExpKernel(dimension=0, lengthscale=0, sf=1) k1 = k.copy() k2 = k.copy() k = ff.SqExpKernel(dimension=1, lengthscale=2, sf=2) k3 = k.copy() k4 = k.copy() k5 = ff.NoiseKernel(sf=-1) k6 = ff.ConstKernel(sf=1) k = k1 * k2 * k3 * k4 * k5 * k5.copy() + k6 + k6.copy( ) + k1.copy() * k1.copy() * k3.copy() print '\n', k.pretty_print(), '\n' print '\n', k.canonical().pretty_print(), '\n'
def test_additive_form_k(self): print 'additive form' k = ff.SqExpKernel(dimension=0, lengthscale=0, sf=1) k1 = k.copy() k2 = k.copy() k = ff.SqExpKernel(dimension=1, lengthscale=2, sf=2) k3 = k.copy() k4 = k.copy() k5 = ff.NoiseKernel(sf=-1) k6 = ff.ConstKernel(sf=1) k = (k1 * (k2 + k3)) + (k4 * k5) print '\n', k.pretty_print(), '\n' components = k.additive_form().simplified() print components for k in components.operands: print '\n', k.pretty_print(), '\n'
def removeKernelParams(kernel): """ Remove hyperparameters of a GPSS kernel and reset them to None. :returns: a GPSS kernel without parameter initialisation """ assert isinstance( kernel, ff.Kernel), "kernel must be of type flexible_function.Kernel" if isinstance(kernel, ff.SqExpKernel): return ff.SqExpKernel(dimension=kernel.dimension) elif isinstance(kernel, ff.PeriodicKernel): return ff.PeriodicKernel(dimension=kernel.dimension) elif isinstance(kernel, ff.ConstKernel): return ff.ConstKernel() elif isinstance(kernel, ff.SumKernel): return ff.SumKernel(map(removeKernelParams, kernel.operands)) elif isinstance(kernel, ff.ProductKernel): return ff.ProductKernel(map(removeKernelParams, kernel.operands)) elif isinstance(kernel, ff.NoneKernel): return kernel else: raise NotImplementedError("Unrecognised kernel type " + type(kernel).__name__)
def test_nan_score(self): k = ff.SqExpKernel(dimension=0, lengthscale=0, sf=0) m1 = ff.GPModel(kernel=k, nll=np.nan, ndata=100) m2 = ff.GPModel(kernel=k.copy(), nll=0, ndata=100) (not_nan, eq_nan) = experiment.remove_nan_scored_models([m1, m2], score='bic') assert (len(not_nan) == 1) and (len(eq_nan) == 1)
def test_expand_model(self): print 'expand model' print '2d' k = ff.SqExpKernel(dimension=0, lengthscale=0, sf=0) m = ff.GPModel(mean=ff.MeanZero(), kernel=k, likelihood=ff.LikGauss()) expanded = grammar.expand_models(2, [m], base_kernels='SE', rules=None) for k in expanded: print '\n', k.pretty_print(), '\n'
def test_repr(self): m = ff.MeanZero() k = ff.SqExpKernel() l = ff.LikGauss() regression_model = ff.GPModel(mean=m, kernel=k, likelihood=l) print regression_model print ff.repr_to_model(regression_model.__repr__()) assert regression_model == ff.repr_to_model( regression_model.__repr__())
def test_collapse_identity(self): print 'collapse identity' k1 = ff.SqExpKernel(dimension=0, lengthscale=0, sf=1) k2 = ff.ConstKernel(sf=-1) k = k1 * k2 print '\n', k.pretty_print(), '\n' k = k.collapse_multiplicative_identity() assert isinstance(k, ff.SqExpKernel) print '\n', k.pretty_print(), '\n' k1 = ff.SqExpKernel(dimension=0, lengthscale=0, sf=1) k = (k1 + k1.copy() + k1.copy() * k2.copy()) * k2 print(k1 + k1.copy()).sf print(k1.copy() * k2.copy()).sf print(k1 + k1.copy() + k1.copy() * k2.copy()).sf print k.sf print '\n', k.pretty_print(), '\n' k = k.collapse_multiplicative_identity() print '\n', k.pretty_print(), '\n'
def test_simplified_k(self): print 'simplified_k' k = ff.SqExpKernel(dimension=0, lengthscale=0, sf=1) k1 = k.copy() k2 = k.copy() k = k1 * k2 k = ff.SqExpKernel(dimension=0, lengthscale=0, sf=1) k1 = k.copy() k2 = k.copy() k = ff.SqExpKernel(dimension=1, lengthscale=2, sf=2) k3 = k.copy() k4 = k.copy() k5 = ff.NoiseKernel(sf=-1) k6 = ff.ConstKernel(sf=1) k = k1 * k2 * k3 * k4 * k5 * k5.copy() + k6 + k6.copy( ) + k1.copy() * k1.copy() * k3.copy() print '\n', k.pretty_print(), '\n' k = k.simplified() print '\n', k.pretty_print(), '\n'
def test_jitter(self): print 'jitter' k = ff.SqExpKernel(dimension=0, lengthscale=0, sf=1) k1 = k.copy() k2 = k.copy() print[k, k1, k2] assert (k == k1) and (k == k2) and (k1 == k2) ff.add_jitter_k([k1, k2]) assert (not k == k1) and (not k == k2) and (not k1 == k2) print[k, k1, k2]
def test_hash_and_cmp(self): k = ff.SqExpKernel(dimension=0, lengthscale=0, sf=1) k1 = k.copy() k2 = k.copy() k3 = ff.SqExpKernel(dimension=1, lengthscale=0, sf=1) assert sorted(list(set([k1, k2, k3]))) == sorted([k1, k3]) k = ff.SqExpKernel(dimension=0, lengthscale=0, sf=1) k4 = k.copy() k5 = ff.NoneKernel() k6 = ff.ChangePointKernel(operands=[k4, k5]) k7 = ff.ChangePointKernel( operands=[ff.ChangePointKernel(operands=[k4, k5]), k1]) assert sorted([k1, k2, k3, k4, k5, k6, k7]) == sorted([k7, k1, k6, k2, k5, k3, k4]) assert sorted(k.canonical() for k in [k1, k2, k3, k4, k5, k6, k7]) == sorted( k.canonical() for k in [k7, k1, k6, k2, k5, k3, k4]) assert sorted(k.additive_form() for k in [k1, k2, k3, k4, k5, k6, k7]) == sorted( k.additive_form() for k in [k7, k1, k6, k2, k5, k3, k4])
def test_jitter_model(self): print 'jitter model' k = ff.SqExpKernel(dimension=0, lengthscale=0, sf=1) k1 = k.copy() k2 = k.copy() print[k, k1, k2] assert (k == k1) and (k == k2) and (k1 == k2) m1 = ff.GPModel(kernel=k1) m2 = ff.GPModel(kernel=k2) ff.add_jitter([m1, m2]) assert (not k == k1) and (not k == k2) and (not k1 == k2) print[k, k1, k2]
def test_collapse_add_idempotent(self): k = ff.SqExpKernel() k1 = k.copy() k2 = k.copy() k = ff.NoiseKernel(sf=-1) k3 = k.copy() k4 = k.copy() k = ff.ConstKernel(sf=1) k5 = k.copy() k6 = k.copy() k = k1 + k2 + k3 + k4 + k5 + k6 print '\n', k.pretty_print(), '\n' k = k.collapse_additive_idempotency() print '\n', k.pretty_print(), '\n'
def test_prod(self): k = ff.SqExpKernel() k1 = k.copy() k2 = k.copy() k = k1 * k2 print '\n', k.pretty_print(), '\n' print '\n', k.syntax, '\n' print '\n', k, '\n' k.operands[0].dimension = 0 k.operands[1].dimension = 1 print '\n', k.pretty_print(), '\n' print '\n', k.syntax, '\n' print '\n', k, '\n' print '\n', k.get_gpml_expression(dimensions=3), '\n' k.initialise_params(data_shape={ 'y_sd': 0, 'x_sd': [0, 2], 'x_min': [-10, -100], 'x_max': [10, 100] }) print '\n', k, '\n' assert k == k.copy() k = k.copy() print '\n', k, '\n' assert k == k.copy() k.load_param_vector(k.param_vector) print '\n', k, '\n' k = k + k.copy() print '\n', k.pretty_print(), '\n' print '\n', k.syntax, '\n' print '\n', k, '\n' print '\n', k.pretty_print(), '\n' print '\n', k.syntax, '\n' print '\n', k, '\n' print '\n', k.get_gpml_expression(dimensions=3), '\n' k.initialise_params(data_shape={ 'y_sd': 0, 'x_sd': [0, 2], 'x_min': [-10, -100], 'x_max': [10, 100] }) print '\n', k, '\n' assert k == k.copy() k = k.copy() print '\n', k, '\n' assert k == k.copy() k.load_param_vector(k.param_vector) print '\n', k, '\n' k.sf
def test_model(self): print 'model' m = ff.MeanZero() k = ff.SqExpKernel() l = ff.LikGauss() regression_model = ff.GPModel(mean=m, kernel=k, likelihood=l, nll=0, ndata=100) print '\n', regression_model.pretty_print(), '\n' print '\n', regression_model.__repr__(), '\n' print regression_model.bic print regression_model.aic print regression_model.pl2 print ff.GPModel.score(regression_model, criterion='nll')
def test_canonical_k_2(self): print 'canonical_k form 2' k = ff.SqExpKernel(dimension=0, lengthscale=0, sf=1) k1 = k.copy() k2 = ff.NoneKernel() k = ff.ChangePointKernel(operands=[k1, k2]) print '\n', k, '\n' k = k.canonical() print '\n', k, '\n' assert k == k1 k = ff.ChangePointKernel( operands=[ff.ChangePointKernel(operands=[k1, k2]), k2]) print '\n', k, '\n' k = k.canonical() print '\n', k, '\n' assert k == k1
def gpy2gpss(kernel): """ Convert a GPy kernel to a GPSS kernel recursively. Support only: 1) 1-D squared exponential kernels 2) 1-D periodic kernels 3) constant kernels (called `bias` in GPy) 4) sum kernels 5) product kernels :param kernel: a GPSS kernel as defined in flexible_function.py :returns: an object of type GPy.kern.Kern """ assert isinstance(kernel, GPy.kern.Kern), "kernel must be of type GPy.kern.Kern" if isinstance(kernel, GPy.kern.RBF): sf = np.sqrt(kernel.variance)[0] ls = kernel.lengthscale[0] dim = kernel.active_dims[0] return ff.SqExpKernel(dimension=dim, lengthscale=ls, sf=sf) elif isinstance(kernel, GPy.kern.StdPeriodic): sf = np.sqrt(kernel.variance)[0] ls = kernel.lengthscale[0] per = kernel.period[0] dim = kernel.active_dims[0] return ff.PeriodicKernel(dimension=dim, lengthscale=ls, period=per, sf=sf) elif isinstance(kernel, GPy.kern.Bias): sf = np.sqrt(kernel.variance)[0] return ff.ConstKernel(sf=sf) elif isinstance(kernel, GPy.kern.Add): return ff.SumKernel(map(gpy2gpss, kernel.parts)) elif isinstance(kernel, GPy.kern.Prod): return ff.ProductKernel(map(gpy2gpss, kernel.parts)) else: raise NotImplementedError("Cannot translate kernel of type " + type(kernel).__name__)
def test_restarts(self): print 'restart' data_shape = { 'y_sd': 0, 'x_sd': [0, 2], 'x_min': [-10, -100], 'x_max': [10, 100] } k = ff.SqExpKernel(dimension=0) k1 = k.copy() k2 = k.copy() print[k, k1, k2] assert (k == k1) and (k == k2) and (k1 == k2) kernel_list = ff.add_random_restarts_k([k1, k2], data_shape=data_shape, sd=1) k1 = kernel_list[0] k2 = kernel_list[1] assert (not k == k1) and (not k == k2) and (not k1 == k2) print[k, k1, k2]
def test_restarts_model(self): print 'restart model' data_shape = { 'y_sd': 0, 'x_sd': [0, 2], 'x_min': [-10, -100], 'x_max': [10, 100] } k = ff.SqExpKernel(dimension=0) k1 = k.copy() k2 = k.copy() print[k, k1, k2] assert (k == k1) and (k == k2) and (k1 == k2) m1 = ff.GPModel(kernel=k1) m2 = ff.GPModel(kernel=k2) model_list = ff.add_random_restarts([m1, m2], n_rand=1, data_shape=data_shape, sd=1) k1 = model_list[0].kernel k2 = model_list[1].kernel assert (not k == k1) and (not k == k2) and (not k1 == k2) print[k, k1, k2]