#
# Copyright John Reid 2006
#
from kernel import *
import numpy
[docs]class AttributeExtractor( Kernel ):
"""
Changes the type of object a kernel can act on
For example our data might be of type X that aggregate several features:
X.vec: a numpy.array
X.is_true: a boolean
We may have a kernel, Kvec, that acts on arrays and a kernel, Kbool,
that acts on boolean data. We could combine them as follows::
K = SumKernel(
AttributeExtractor( 'vec', Kvec ),
AttributeExtractor( 'is_true', Kbool )
)
The AttributeExtractor will find the vec and is_true attributes of
each x and pass them to the kernels Kvec and Kbool
"""
def __init__( self, attribute_name, sub_kernel ):
"""Creates a kernel that extracts attributes with the given name and pass
them to the sub kernel
"""
Kernel.__init__( self, sub_kernel.params, sub_kernel.param_priors )
self.k = sub_kernel
self.attribute_name = attribute_name
def __str__( self ):
return """AttributeExtractorKernel( %s )""" % self.attribute_name
def __call__( self, x1, x2, identical = False ):
return self.k(
getattr( x1, self.attribute_name ),
getattr( x2, self.attribute_name ),
identical
)
[docs] class Derivative( object ):
def __init__( self, k, i ):
self.k = k
self.i = i
def __call__( self, x1, x2, identical = False ):
return self.k.k.derivative_wrt_param( self.i )(
x1.__dict__[ self.k.attribute_name ],
x2.__dict__[ self.k.attribute_name ],
identical
)