'Parameters
x : 2d array (N,K)
data array of explanatory variables, columns represent variables
rows represent observations
y : 2d array (N,1) (optional)
endogenous variable that should be fitted or predicted
can alternatively be specified as parameter to fit method
kernel : function, default: kernel_rbf
kernel: (x1,x2)->kernel matrix is a function that takes as parameter
two column arrays and return the kernel or distance matrix
scale : float (optional)
smoothing parameter for the rbf kernel
ridgecoeff : float (optional)
coefficient that is multiplied with the identity matrix in the
ridge regression
Notes
After initialization, kernel matrix is calculated and if y is given
as parameter then also the linear regression parameter and the
fitted or estimated y values, yest, are calculated. yest is available
as an attribute in this case.
Both scale and the ridge coefficient smooth the fitted curve.'

def __init__(self, x, y=None, kernel=kernel_rbf, scale=0.5, ridgecoeff=1e-10, **kwds):

    self.x = x
    self.kernel = kernel
    self.scale = scale
    self.ridgecoeff = ridgecoeff
    self.distxsample = kernel(x, x, scale=scale)
    self.Kinv = np.linalg.inv((self.distxsample + (np.eye(*self.distxsample.shape) * ridgecoeff)))
    if (not (y is None)):
        self.y = y
        self.yest = self.fit(y)
