more re-enstating of some preiov commits.

This commit is contained in:
James Hensman 2013-04-23 17:13:43 +01:00
parent 43b9eacd8a
commit 29115b0ec1
2 changed files with 49 additions and 27 deletions

View file

@ -2,5 +2,9 @@
# Licensed under the BSD 3-clause license (see LICENSE.txt) # Licensed under the BSD 3-clause license (see LICENSE.txt)
from constructors import rbf, Matern32, Matern52, exponential, linear, white, bias, finite_dimensional, spline, Brownian, rbf_sympy, sympykern, periodic_exponential, periodic_Matern32, periodic_Matern52, prod, prod_orthogonal, symmetric, coregionalise, rational_quadratic, fixed, rbfcos from constructors import rbf, Matern32, Matern52, exponential, linear, white, bias, finite_dimensional, spline, Brownian, periodic_exponential, periodic_Matern32, periodic_Matern52, prod, prod_orthogonal, symmetric, coregionalise, rational_quadratic, fixed, rbfcos, independent_outputs
try:
from constructors import rbf_sympy, sympykern # these depend on sympy
except:
pass
from kern import kern from kern import kern

View file

@ -25,6 +25,7 @@ from symmetric import symmetric as symmetric_part
from coregionalise import coregionalise as coregionalise_part from coregionalise import coregionalise as coregionalise_part
from rational_quadratic import rational_quadratic as rational_quadraticpart from rational_quadratic import rational_quadratic as rational_quadraticpart
from rbfcos import rbfcos as rbfcospart from rbfcos import rbfcos as rbfcospart
from independent_outputs import independent_outputs as independent_output_part
#TODO these s=constructors are not as clean as we'd like. Tidy the code up #TODO these s=constructors are not as clean as we'd like. Tidy the code up
#using meta-classes to make the objects construct properly wthout them. #using meta-classes to make the objects construct properly wthout them.
@ -165,34 +166,40 @@ def Brownian(D,variance=1.):
part = Brownianpart(D,variance) part = Brownianpart(D,variance)
return kern(D, [part]) return kern(D, [part])
import sympy as sp try:
from sympykern import spkern import sympy as sp
from sympy.parsing.sympy_parser import parse_expr from sympykern import spkern
from sympy.parsing.sympy_parser import parse_expr
sympy_available = True
except ImportError:
sympy_available = False
def rbf_sympy(D,ARD=False,variance=1., lengthscale=1.): if sympy_available:
""" def rbf_sympy(D,ARD=False,variance=1., lengthscale=1.):
Radial Basis Function covariance. """
""" Radial Basis Function covariance.
X = [sp.var('x%i'%i) for i in range(D)] """
Z = [sp.var('z%i'%i) for i in range(D)] X = [sp.var('x%i'%i) for i in range(D)]
rbf_variance = sp.var('rbf_variance',positive=True) Z = [sp.var('z%i'%i) for i in range(D)]
if ARD: rbf_variance = sp.var('rbf_variance',positive=True)
rbf_lengthscales = [sp.var('rbf_lengthscale_%i'%i,positive=True) for i in range(D)] if ARD:
dist_string = ' + '.join(['(x%i-z%i)**2/rbf_lengthscale_%i**2'%(i,i,i) for i in range(D)]) rbf_lengthscales = [sp.var('rbf_lengthscale_%i'%i,positive=True) for i in range(D)]
dist = parse_expr(dist_string) dist_string = ' + '.join(['(x%i-z%i)**2/rbf_lengthscale_%i**2'%(i,i,i) for i in range(D)])
f = rbf_variance*sp.exp(-dist/2.) dist = parse_expr(dist_string)
else: f = rbf_variance*sp.exp(-dist/2.)
rbf_lengthscale = sp.var('rbf_lengthscale',positive=True) else:
dist_string = ' + '.join(['(x%i-z%i)**2'%(i,i) for i in range(D)]) rbf_lengthscale = sp.var('rbf_lengthscale',positive=True)
dist = parse_expr(dist_string) dist_string = ' + '.join(['(x%i-z%i)**2'%(i,i) for i in range(D)])
f = rbf_variance*sp.exp(-dist/(2*rbf_lengthscale**2)) dist = parse_expr(dist_string)
return kern(D,[spkern(D,f)]) f = rbf_variance*sp.exp(-dist/(2*rbf_lengthscale**2))
return kern(D,[spkern(D,f)])
def sympykern(D,k): def sympykern(D,k):
""" """
A kernel from a symbolic sympy representation A kernel from a symbolic sympy representation
""" """
return kern(D,[spkern(D,k)]) return kern(D,[spkern(D,k)])
del sympy_available
def periodic_exponential(D=1,variance=1., lengthscale=None, period=2*np.pi,n_freq=10,lower=0.,upper=4*np.pi): def periodic_exponential(D=1,variance=1., lengthscale=None, period=2*np.pi,n_freq=10,lower=0.,upper=4*np.pi):
""" """
@ -318,3 +325,14 @@ def rbfcos(D,variance=1.,frequencies=None,bandwidths=None,ARD=False):
""" """
part = rbfcospart(D,variance,frequencies,bandwidths,ARD) part = rbfcospart(D,variance,frequencies,bandwidths,ARD)
return kern(D,[part]) return kern(D,[part])
def independent_outputs(k):
"""
Construct a kernel with independent outputs from an existing kernel
"""
for sl in k.input_slices:
assert (sl.start is None) and (sl.stop is None), "cannot adjust input slices! (TODO)"
parts = [independent_output_part(p) for p in k.parts]
return kern(k.D+1,parts)