PKiJjmpygam/.DS_StoreBud1%  @ @ @ @ E%DSDB` @ @ @PK/L/KTpygam/__init__.py""" GAM toolkit """ from __future__ import absolute_import from pygam.pygam import GAM from pygam.pygam import LinearGAM from pygam.pygam import LogisticGAM from pygam.pygam import GammaGAM from pygam.pygam import PoissonGAM from pygam.pygam import InvGaussGAM __all__ = ['GAM', 'LinearGAM', 'LogisticGAM', 'GammaGAM', 'PoissonGAM', 'InvGaussGAM'] __version__ = '0.3.0' PKpK%pygam/callbacks.py""" CallBacks """ from __future__ import absolute_import from functools import wraps import numpy as np from pygam.core import Core def validate_callback_data(method): """ wraps a callback's method to pull the desired arguments from the vars dict also checks to ensure the method's arguments are in the vars dict Parameters ---------- method : callable Returns ------- validated callable """ @wraps(method) def method_wrapper(*args, **kwargs): """ Parameters ---------- *args **kwargs Returns ------- method's output """ expected = method.__code__.co_varnames # rename curret gam object if 'self' in kwargs: gam = kwargs['self'] del(kwargs['self']) kwargs['gam'] = gam # loop once to check any missing missing = [] for e in expected: if e == 'self': continue if e not in kwargs: missing.append(e) assert len(missing) == 0, 'CallBack cannot reference: {}'.\ format(', '.join(missing)) # loop again to extract desired kwargs_subset = {} for e in expected: if e == 'self': continue kwargs_subset[e] = kwargs[e] return method(*args, **kwargs_subset) return method_wrapper def validate_callback(callback): """ validates a callback's on_loop_start and on_loop_end methods Parameters ---------- callback : Callback object Returns ------- validated callback """ if not(hasattr(callback, '_validated')) or callback._validated == False: assert hasattr(callback, 'on_loop_start') \ or hasattr(callback, 'on_loop_end'), \ 'callback must have `on_loop_start` or `on_loop_end` method' if hasattr(callback, 'on_loop_start'): setattr(callback, 'on_loop_start', validate_callback_data(callback.on_loop_start)) if hasattr(callback, 'on_loop_end'): setattr(callback, 'on_loop_end', validate_callback_data(callback.on_loop_end)) setattr(callback, '_validated', True) return callback class CallBack(Core): """CallBack class""" def __init__(self, name=None): """ creates a CallBack instance Parameters ---------- None Returns ------- None """ super(CallBack, self).__init__(name=name) @validate_callback class Deviance(CallBack): """Deviance CallBack class""" def __init__(self): """ creates a Deviance CallBack instance useful for capturing the Deviance of a model on training data at each iteration Parameters ---------- None Returns ------- None """ super(Deviance, self).__init__(name='deviance') def on_loop_start(self, gam, y, mu): """ runs the method at loop start Parameters ---------- gam : GAM instance y : array-like of length n target data mu : array-like of length n expected value data Returns ------- deviance : np.array of length n """ return gam.distribution.deviance(y=y, mu=mu, scaled=False).sum() @validate_callback class Accuracy(CallBack): def __init__(self): """ creates an Accuracy CallBack instance useful for capturing the accuracy of a model on training data at each iteration Parameters ---------- None Returns ------- None """ super(Accuracy, self).__init__(name='accuracy') def on_loop_start(self, y, mu): """ runs the method at start of each optimization loop Parameters ---------- y : array-like of length n target data mu : array-like of length n expected value data Returns ------- accuracy : np.array of length n """ return np.mean(y == (mu>0.5)) @validate_callback class Diffs(CallBack): def __init__(self): """ creates a Diffs CallBack instance useful for capturing the differences in model coefficient norms between iterations Parameters ---------- None Returns ------- None """ super(Diffs, self).__init__(name='diffs') def on_loop_end(self, diff): """ runs the method at end of each optimization loop Parameters ---------- diff : float Returns ------- diff : float """ return diff @validate_callback class Coef(CallBack): def __init__(self): """ creates a Coef CallBack instance useful for capturing the models coefficients at each iteration Parameters ---------- None Returns ------- None """ super(Coef, self).__init__(name='coef') def on_loop_start(self, gam): """ runs the method at start of each optimization loop Parameters ---------- gam : float Returns ------- coef_ : list of floats """ return gam.coef_ PK^JV7,MM pygam/core.py""" Core classes """ from __future__ import absolute_import import numpy as np from pygam.utils import round_to_n_decimal_places def nice_repr(name, param_kvs, line_width=30, line_offset=5, decimals=3): """ tool to do a nice repr of a class. Parameters ---------- name : str class name param_kvs : dict dict containing class parameters names as keys, and the corresponding values as values line_width : int desired maximum line width. default: 30 line_offset : int desired offset for new lines default: 5 decimals : int number of decimal places to keep for float values default: 3 Returns ------- out : str nicely formatted repr of class instance """ if len(param_kvs) == 0: # if the object has no params it's easy return '{}()'.format(name) # sort keys and values ks = list(param_kvs.keys()) vs = list(param_kvs.values()) idxs = np.argsort(ks) param_kvs = [(ks[i],vs[i]) for i in idxs] param_kvs = param_kvs[::-1] out = '' current_line = name + '(' while len(param_kvs) > 0: k, v = param_kvs.pop() if issubclass(v.__class__, (float, np.ndarray)): # round the floats first v = round_to_n_decimal_places(v, n=decimals) param = '{}={},'.format(k, str(v)) else: param = '{}={},'.format(k, repr(v)) if len(current_line + param) <= line_width: current_line += param else: out += current_line + '\n' current_line = ' '*line_offset + param if len(current_line) < line_width and len(param_kvs) > 0: current_line += ' ' out += current_line[:-1] # remove trailing comma out += ')' return out class Core(object): def __init__(self, name=None, line_width=70, line_offset=3): """ creates an instance of the Core class comes loaded with useful methods Parameters ---------- name : str, default: None line_width : int, default: 70 number of characters to print on a line line_offset : int, default: 3 number of characters to indent after the first line Returns ------- self """ self._name = name self._line_width = line_width self._line_offset = line_offset self._exclude = [] def __str__(self): """__str__ method""" if self._name is None: return self.__repr__() return self._name def __repr__(self): """__repr__ method""" name = self.__class__.__name__ return nice_repr(name, self.get_params(), line_width=self._line_width, line_offset=self._line_offset, decimals=4) def get_params(self, deep=False): """ returns a dict of all of the object's user-facing parameters Parameters ---------- deep : boolean, default: False when True, also gets non-user-facing paramters Returns ------- dict """ if deep is True: return self.__dict__ return dict([(k,v) for k,v in list(self.__dict__.items()) \ if (k[0] != '_') \ and (k[-1] != '_') and (k not in self._exclude)]) def set_params(self, deep=False, force=False, **parameters): """ sets an object's paramters Parameters ---------- deep : boolean, default: False when True, also sets non-user-facing paramters force : boolean, default: False when True, also sets parameters that the object does not already have **parameters : paramters to set Returns ------ self """ param_names = self.get_params(deep=deep).keys() for parameter, value in parameters.items(): if (parameter in param_names) or force: setattr(self, parameter, value) return self PKpKVeI4I4pygam/distributions.py""" Distributions """ from __future__ import division, absolute_import from functools import wraps import scipy as sp import numpy as np from pygam.core import Core from pygam.utils import ylogydu def multiply_weights(deviance): @wraps(deviance) def multiplied(self, y, mu, weights=None, **kwargs): if weights is None: weights = np.ones_like(mu) return deviance(self, y, mu, **kwargs) * weights return multiplied def divide_weights(V): @wraps(V) def divided(self, mu, weights=None, **kwargs): if weights is None: weights = np.ones_like(mu) return V(self, mu, **kwargs) / weights return divided class Distribution(Core): """ base distribution class """ def __init__(self, name=None, scale=None): """ creates an instance of the Distribution class Parameters ---------- name : str, default: None scale : float or None, default: None scale/standard deviation of the distribution Returns ------- self """ self.scale = scale self._known_scale = self.scale is not None super(Distribution, self).__init__(name=name) if not self._known_scale: self._exclude += ['scale'] def phi(self, y, mu, edof, weights): """ GLM scale parameter. for Binomial and Poisson families this is unity for Normal family this is variance Parameters ---------- y : array-like of length n target values mu : array-like of length n expected values edof : float estimated degrees of freedom weights : array-like shape (n,) or None, default: None containing sample weights if None, defaults to array of ones Returns ------- scale : estimated model scale """ if self._known_scale: return self.scale else: return np.sum(weights * self.V(mu)**-1 * (y - mu)**2) / (len(mu) - edof) class NormalDist(Distribution): """ Normal Distribution """ def __init__(self, scale=None): """ creates an instance of the NormalDist class Parameters ---------- scale : float or None, default: None scale/standard deviation of the distribution Returns ------- self """ super(NormalDist, self).__init__(name='normal', scale=scale) def pdf(self, y, mu, weights=None): """ computes the pdf or pmf of the values under the current distribution Parameters ---------- y : array-like of length n target values mu : array-like of length n expected values Returns ------- pdf/pmf : np.array of length n """ if weights is None: weights = np.ones_like(mu) scale = self.scale / weights return np.exp(-(y - mu)**2/(2*scale)) / (scale * 2 * np.pi)**0.5 @divide_weights def V(self, mu): """ glm Variance function. if Y ~ ExpFam(theta, scale=phi) such that E[Y] = mu = b'(theta) and Var[Y] = b''(theta) * phi / w then we seek V(mu) s.t we can represent Var[y] as a fn of mu: Var[Y] = V(mu) * phi ie V(mu) = b''(theta) / w Parameters ---------- mu : array-like of length n expected values weights : array-like of length n weights, optional sample weights Returns ------- V(mu) : np.array of length n """ return np.ones_like(mu) @multiply_weights def deviance(self, y, mu, scaled=True): """ model deviance for a gaussian linear model, this is equal to the SSE Parameters ---------- y : array-like of length n target values mu : array-like of length n expected values scaled : boolean, default: True whether to divide the deviance by the distribution scaled Returns ------- deviances : np.array of length n """ dev = (y - mu)**2 if scaled: dev /= self.scale return dev class BinomialDist(Distribution): """ Binomial Distribution """ def __init__(self, levels=1): """ creates an instance of the NormalDist class Parameters ---------- levels : int of None, default: 1 number of levels in the binomial distribution Returns ------- self """ if levels is None: levels = 1 self.levels = levels super(BinomialDist, self).__init__(name='binomial', scale=1.) self._exclude.append('scale') def pdf(self, y, mu, weights=None): """ computes the pdf or pmf of the values under the current distribution Parameters ---------- y : array-like of length n target values mu : array-like of length n expected values weights : array-like shape (n,) or None, default: None containing sample weights if None, defaults to array of ones Returns ------- pdf/pmf : np.array of length n """ if weights is None: weights = np.ones_like(mu) n = self.levels return weights * (sp.misc.comb(n, y) * (mu / n)**y * (1 - (mu / n))**(n - y)) @divide_weights def V(self, mu): """ glm Variance function computes the variance of the distribtion Parameters ---------- mu : array-like of length n expected values Returns ------- variance : np.array of length n """ return mu * (1 - mu/self.levels) @multiply_weights def deviance(self, y, mu, scaled=True): """ model deviance for a bernoulli logistic model, this is equal to the twice the negative loglikelihod. Parameters ---------- y : array-like of length n target values mu : array-like of length n expected values scaled : boolean, default: True whether to divide the deviance by the distribution scaled Returns ------- deviances : np.array of length n """ dev = 2 * (ylogydu(y, mu) + ylogydu(self.levels - y, self.levels-mu)) if scaled: dev /= self.scale return dev class PoissonDist(Distribution): """ Poisson Distribution """ def __init__(self): """ creates an instance of the PoissonDist class Parameters ---------- None Returns ------- self """ super(PoissonDist, self).__init__(name='poisson', scale=1.) self._exclude.append('scale') def pdf(self, y, mu, weights=None): """ computes the pdf or pmf of the values under the current distribution Parameters ---------- y : array-like of length n target values mu : array-like of length n expected values weights : array-like shape (n,) or None, default: None containing sample weights if None, defaults to array of ones Returns ------- pdf/pmf : np.array of length n """ if weights is None: weights = np.ones_like(mu) # in Poisson regression weights are proportional to the exposure # so we want to pump up all our predictions # NOTE: we assume the targets are unchanged mu = mu * weights return (mu**y) * np.exp(-mu) / sp.misc.factorial(y) @divide_weights def V(self, mu): """ glm Variance function computes the variance of the distribtion Parameters ---------- mu : array-like of length n expected values Returns ------- variance : np.array of length n """ return mu @multiply_weights def deviance(self, y, mu, scaled=True): """ model deviance for a bernoulli logistic model, this is equal to the twice the negative loglikelihod. Parameters ---------- y : array-like of length n target values mu : array-like of length n expected values scaled : boolean, default: True whether to divide the deviance by the distribution scaled Returns ------- deviances : np.array of length n """ dev = 2 * (ylogydu(y, mu) - (y - mu)) if scaled: dev /= self.scale return dev class GammaDist(Distribution): """ Gamma Distribution """ def __init__(self, scale=None): """ creates an instance of the GammaDist class Parameters ---------- scale : float or None, default: None scale/standard deviation of the distribution Returns ------- self """ super(GammaDist, self).__init__(name='gamma', scale=scale) def pdf(self, y, mu, weights=None): """ computes the pdf or pmf of the values under the current distribution Parameters ---------- y : array-like of length n target values mu : array-like of length n expected values weights : array-like shape (n,) or None, default: None containing sample weights if None, defaults to array of ones Returns ------- pdf/pmf : np.array of length n """ if weights is None: weights = np.ones_like(mu) nu = weights / self.scale return 1./sp.special.gamma(nu) * (nu/mu)**nu * y**(nu-1) * np.exp(-nu * y / mu) @divide_weights def V(self, mu): """ glm Variance function computes the variance of the distribtion Parameters ---------- mu : array-like of length n expected values Returns ------- variance : np.array of length n """ return mu**2 @multiply_weights def deviance(self, y, mu, scaled=True): """ model deviance for a bernoulli logistic model, this is equal to the twice the negative loglikelihod. Parameters ---------- y : array-like of length n target values mu : array-like of length n expected values scaled : boolean, default: True whether to divide the deviance by the distribution scaled Returns ------- deviances : np.array of length n """ dev = 2 * ((y - mu)/mu - np.log(y/mu)) if scaled: dev /= self.scale return dev class InvGaussDist(Distribution): """ Inverse Gaussian Distribution """ def __init__(self, scale=None): """ creates an instance of the NormalDist class Parameters ---------- scale : float or None, default: None scale/standard deviation of the distribution Returns ------- self """ super(InvGaussDist, self).__init__(name='inv_gauss', scale=scale) def pdf(self, y, mu, weights=None): """ computes the pdf or pmf of the values under the current distribution Parameters ---------- y : array-like of length n target values mu : array-like of length n expected values weights : array-like shape (n,) or None, default: None containing sample weights if None, defaults to array of ones Returns ------- pdf/pmf : np.array of length n """ if weights is None: weights = np.ones_like(mu) gamma = weights / self.scale return (gamma / (2 * np.pi * y**3))**.5 * np.exp(-gamma * (y - mu)**2 / (2 * mu**2 * y)) @divide_weights def V(self, mu): """ glm Variance function computes the variance of the distribtion Parameters ---------- mu : array-like of length n expected values Returns ------- variance : np.array of length n """ return mu**3 @multiply_weights def deviance(self, y, mu, scaled=True): """ model deviance for a bernoulli logistic model, this is equal to the twice the negative loglikelihod. Parameters ---------- y : array-like of length n target values mu : array-like of length n expected values scaled : boolean, default: True whether to divide the deviance by the distribution scaled Returns ------- deviances : np.array of length n """ dev = ((y - mu)**2) / (mu**2 * y) if scaled: dev /= self.scale return dev PK"Jսpygam/links.py""" Link functions """ from __future__ import division, absolute_import import numpy as np from pygam.core import Core class Link(Core): def __init__(self, name=None): """ creates an instance of a Link object Parameters ---------- name : str, default: None Returns ------- self """ super(Link, self).__init__(name=name) class IdentityLink(Link): def __init__(self): """ creates an instance of an IdentityLink object Parameters ---------- None Returns ------- self """ super(IdentityLink, self).__init__(name='identity') def link(self, mu, dist): """ glm link function this is useful for going from mu to the linear prediction Parameters ---------- mu : array-like of legth n dist : Distribution instance Returns ------- lp : np.array of length n """ return mu def mu(self, lp, dist): """ glm mean function, ie inverse of link function this is useful for going from the linear prediction to mu Parameters ---------- lp : array-like of legth n dist : Distribution instance Returns ------- mu : np.array of length n """ return lp def gradient(self, mu, dist): """ derivative of the link function wrt mu Parameters ---------- mu : array-like of legth n dist : Distribution instance Returns ------- grad : np.array of length n """ return np.ones_like(mu) class LogitLink(Link): def __init__(self): """ creates an instance of a LogitLink object Parameters ---------- None Returns ------- self """ super(LogitLink, self).__init__(name='logit') def link(self, mu, dist): """ glm link function this is useful for going from mu to the linear prediction Parameters ---------- mu : array-like of legth n dist : Distribution instance Returns ------- lp : np.array of length n """ return np.log(mu) - np.log(dist.levels - mu) def mu(self, lp, dist): """ glm mean function, ie inverse of link function this is useful for going from the linear prediction to mu Parameters ---------- lp : array-like of legth n dist : Distribution instance Returns ------- mu : np.array of length n """ elp = np.exp(lp) return dist.levels * elp / (elp + 1) def gradient(self, mu, dist): """ derivative of the link function wrt mu Parameters ---------- mu : array-like of legth n dist : Distribution instance Returns ------- grad : np.array of length n """ return dist.levels/(mu*(dist.levels - mu)) class LogLink(Link): def __init__(self): """ creates an instance of a LogitLink object Parameters ---------- None Returns ------- self """ super(LogLink, self).__init__(name='log') def link(self, mu, dist): """ glm link function this is useful for going from mu to the linear prediction Parameters ---------- mu : array-like of legth n dist : Distribution instance Returns ------- lp : np.array of length n """ return np.log(mu) def mu(self, lp, dist): """ glm mean function, ie inverse of link function this is useful for going from the linear prediction to mu Parameters ---------- lp : array-like of legth n dist : Distribution instance Returns ------- mu : np.array of length n """ return np.exp(lp) def gradient(self, mu, dist): """ derivative of the link function wrt mu Parameters ---------- mu : array-like of legth n dist : Distribution instance Returns ------- grad : np.array of length n """ return 1. / mu class InverseLink(Link): def __init__(self): """ creates an instance of a InverseLink object Parameters ---------- None Returns ------- self """ super(InverseLink, self).__init__(name='inverse') def link(self, mu, dist): """ glm link function this is useful for going from mu to the linear prediction Parameters ---------- mu : array-like of legth n dist : Distribution instance Returns ------- lp : np.array of length n """ return mu**-1 def mu(self, lp, dist): """ glm mean function, ie inverse of link function this is useful for going from the linear prediction to mu Parameters ---------- lp : array-like of legth n dist : Distribution instance Returns ------- mu : np.array of length n """ return lp**-1 def gradient(self, mu, dist): """ derivative of the link function wrt mu Parameters ---------- mu : array-like of legth n dist : Distribution instance Returns ------- grad : np.array of length n """ return -1 * mu**-2 class InvSquaredLink(Link): def __init__(self): """ creates an instance of an InverseLink object Parameters ---------- name : str, default: None Returns ------- self """ super(InvSquaredLink, self).__init__(name='inv_squared') def link(self, mu, dist): """ glm link function this is useful for going from mu to the linear prediction Parameters ---------- mu : array-like of legth n dist : Distribution instance Returns ------- lp : np.array of length n """ return mu**-2 def mu(self, lp, dist): """ glm mean function, ie inverse of link function this is useful for going from the linear prediction to mu Parameters ---------- lp : array-like of legth n dist : Distribution instance Returns ------- mu : np.array of length n """ return lp**-0.5 def gradient(self, mu, dist): """ derivative of the link function wrt mu Parameters ---------- mu : array-like of legth n dist : Distribution instance Returns ------- grad : np.array of length n """ return -2 * mu**-3 PKbJϫI!I!pygam/penalties.py""" Penalty matrix generators """ import scipy as sp import numpy as np def derivative(n, coef, derivative=2): """ Builds a penalty matrix for P-Splines with continuous features. Penalizes the squared differences between basis coefficients. Parameters ---------- n : int number of splines coef : unused for compatibility with constraints derivative: int, default: 2 which derivative do we penalize. derivative is 1, we penalize 1st order derivatives, derivative is 2, we penalize 2nd order derivatives, etc Returns ------- penalty matrix : sparse csc matrix of shape (n,n) """ if n==1: # no derivative for constant functions return sp.sparse.csc_matrix(0.) D = sparse_diff(sp.sparse.identity(n).tocsc(), n=derivative) return D.dot(D.T).tocsc() def l2(n, coef): """ Builds a penalty matrix for P-Splines with categorical features. Penalizes the squared value of each basis coefficient. Parameters ---------- n : int number of splines coef : unused for compatibility with constraints Returns ------- penalty matrix : sparse csc matrix of shape (n,n) """ return sp.sparse.eye(n).tocsc() def monotonicity_(n, coef, increasing=True): """ Builds a penalty matrix for P-Splines with continuous features. Penalizes violation of monotonicity in the feature function. Parameters ---------- n : int number of splines coef : array-like coefficients of the feature function increasing : bool, default: True whether to enforce monotic increasing, or decreasing functions Returns ------- penalty matrix : sparse csc matrix of shape (n,n) """ if n != len(coef.ravel()): raise ValueError('dimension mismatch: expected n equals len(coef), '\ 'but found n = {}, coef.shape = {}.'\ .format(n, coef.shape)) if n==1: # no monotonic penalty for constant functions return sp.sparse.csc_matrix(0.) if increasing: # only penalize the case where coef_i-1 > coef_i mask = sp.sparse.diags((np.diff(coef.ravel()) < 0).astype(float)) else: # only penalize the case where coef_i-1 < coef_i mask = sp.sparse.diags((np.diff(coef.ravel()) > 0).astype(float)) derivative = 1 D = sparse_diff(sp.sparse.identity(n).tocsc(), n=derivative) * mask return D.dot(D.T).tocsc() def monotonic_inc(n, coef): """ Builds a penalty matrix for P-Splines with continuous features. Penalizes violation of a monotonic increasing feature function. Parameters ---------- n : int number of splines coef : array-like, coefficients of the feature function Returns ------- penalty matrix : sparse csc matrix of shape (n,n) """ return monotonicity_(n, coef, increasing=True) def monotonic_dec(n, coef): """ Builds a penalty matrix for P-Splines with continuous features. Penalizes violation of a monotonic decreasing feature function. Parameters ---------- n : int number of splines coef : array-like coefficients of the feature function Returns ------- penalty matrix : sparse csc matrix of shape (n,n) """ return monotonicity_(n, coef, increasing=False) def convexity_(n, coef, convex=True): """ Builds a penalty matrix for P-Splines with continuous features. Penalizes violation of convexity in the feature function. Parameters ---------- n : int number of splines coef : array-like coefficients of the feature function convex : bool, default: True whether to enforce convex, or concave functions Returns ------- penalty matrix : sparse csc matrix of shape (n,n) """ if n != len(coef.ravel()): raise ValueError('dimension mismatch: expected n equals len(coef), '\ 'but found n = {}, coef.shape = {}.'\ .format(n, coef.shape)) if n==1: # no convex penalty for constant functions return sp.sparse.csc_matrix(0.) if convex: mask = sp.sparse.diags((np.diff(coef.ravel(), n=2) < 0).astype(float)) else: mask = sp.sparse.diags((np.diff(coef.ravel(), n=2) > 0).astype(float)) derivative = 2 D = sparse_diff(sp.sparse.identity(n).tocsc(), n=derivative) * mask return D.dot(D.T).tocsc() def convex(n, coef): """ Builds a penalty matrix for P-Splines with continuous features. Penalizes violation of a convex feature function. Parameters ---------- n : int number of splines coef : array-like coefficients of the feature function Returns ------- penalty matrix : sparse csc matrix of shape (n,n) """ return convexity_(n, coef, convex=True) def concave(n, coef): """ Builds a penalty matrix for P-Splines with continuous features. Penalizes violation of a concave feature function. Parameters ---------- n : int number of splines coef : array-like coefficients of the feature function Returns ------- penalty matrix : sparse csc matrix of shape (n,n) """ return convexity_(n, coef, convex=False) def circular(n, coef): """ Builds a penalty matrix for P-Splines with continuous features. Penalizes violation of a circular feature function. Parameters ---------- n : int number of splines coef : unused for compatibility with constraints Returns ------- penalty matrix : sparse csc matrix of shape (n,n) """ if n != len(coef.ravel()): raise ValueError('dimension mismatch: expected n equals len(coef), '\ 'but found n = {}, coef.shape = {}.'\ .format(n, coef.shape)) if n==1: # no first circular penalty for constant functions return sp.sparse.csc_matrix(0.) row = np.zeros(n) row[0] = 1 row[-1] = -1 P = sp.sparse.vstack([row, sp.sparse.csc_matrix((n-2, n)), row[::-1]]) return P.tocsc() def none(n, coef): """ Build a matrix of zeros for features that should go unpenalized Parameters ---------- n : int number of splines coef : unused for compatibility with constraints Returns ------- penalty matrix : sparse csc matrix of shape (n,n) """ return sp.sparse.csc_matrix(np.zeros((n, n))) def wrap_penalty(p, fit_linear, linear_penalty=0.): """ tool to account for unity penalty on the linear term of any feature. Parameters ---------- p : callable. penalty-matrix-generating function. fit_linear : boolean. whether the current feature has a linear term or not. linear_penalty : float, default: 0. penalty on the linear term Returns ------- wrapped_p : callable modified penalty-matrix-generating function """ def wrapped_p(n, *args): if fit_linear: if n == 1: return sp.sparse.block_diag([linear_penalty], format='csc') return sp.sparse.block_diag([linear_penalty, p(n-1, *args)], format='csc') else: return p(n, *args) return wrapped_p def sparse_diff(array, n=1, axis=-1): """ A ported sparse version of np.diff. Uses recursion to compute higher order differences Parameters ---------- array : sparse array n : int, default: 1 differencing order axis : int, default: -1 axis along which differences are computed Returns ------- diff_array : sparse array same shape as input array, but 'axis' dimension is smaller by 'n'. """ if (n < 0) or (int(n) != n): raise ValueError('Expected order is non-negative integer, '\ 'but found: {}'.format(n)) if not sp.sparse.issparse(array): warnings.warn('Array is not sparse. Consider using numpy.diff') if n == 0: return array nd = array.ndim slice1 = [slice(None)]*nd slice2 = [slice(None)]*nd slice1[axis] = slice(1, None) slice2[axis] = slice(None, -1) slice1 = tuple(slice1) slice2 = tuple(slice2) A = sparse_diff(array, n-1, axis=axis) return A[slice1] - A[slice2] PK,J.K7lD;;pygam/pygam.py# -*- coding: utf-8 -*- from __future__ import division, absolute_import from collections import defaultdict from collections import OrderedDict from copy import deepcopy from progressbar import ProgressBar import warnings import numpy as np import scipy as sp from scipy import stats from pygam.core import Core from pygam.penalties import derivative from pygam.penalties import l2 from pygam.penalties import monotonic_inc from pygam.penalties import monotonic_dec from pygam.penalties import convex from pygam.penalties import concave from pygam.penalties import circular from pygam.penalties import none from pygam.penalties import wrap_penalty from pygam.distributions import Distribution from pygam.distributions import NormalDist from pygam.distributions import BinomialDist from pygam.distributions import PoissonDist from pygam.distributions import GammaDist from pygam.distributions import InvGaussDist from pygam.links import Link from pygam.links import IdentityLink from pygam.links import LogitLink from pygam.links import LogLink from pygam.links import InverseLink from pygam.links import InvSquaredLink from pygam.callbacks import CallBack from pygam.callbacks import Deviance from pygam.callbacks import Diffs from pygam.callbacks import Accuracy from pygam.callbacks import Coef from pygam.callbacks import validate_callback from pygam.utils import check_dtype from pygam.utils import check_y from pygam.utils import check_X from pygam.utils import check_X_y from pygam.utils import check_lengths from pygam.utils import print_data from pygam.utils import gen_edge_knots from pygam.utils import b_spline_basis from pygam.utils import combine from pygam.utils import cholesky from pygam.utils import check_param from pygam.utils import isiterable from pygam.utils import NotPositiveDefiniteError EPS = np.finfo(np.float64).eps # machine epsilon DISTRIBUTIONS = {'normal': NormalDist, 'poisson': PoissonDist, 'binomial': BinomialDist, 'gamma': GammaDist, 'inv_gauss': InvGaussDist } LINK_FUNCTIONS = {'identity': IdentityLink, 'log': LogLink, 'logit': LogitLink, 'inverse': InverseLink, 'inv_squared': InvSquaredLink } CALLBACKS = {'deviance': Deviance, 'diffs': Diffs, 'accuracy': Accuracy, 'coef': Coef } PENALTIES = {'auto': 'auto', 'derivative': derivative, 'l2': l2, 'none': none, } CONSTRAINTS = {'convex': convex, 'concave': concave, 'monotonic_inc': monotonic_inc, 'monotonic_dec': monotonic_dec, 'circular': circular, 'none': none } class GAM(Core): """Generalized Additive Model Parameters ---------- callbacks : list of strings or list of CallBack objects, default: ['deviance', 'diffs'] Names of callback objects to call during the optimization loop. constraints : str or callable, or iterable of str or callable, default: None Names of constraint functions to call during the optimization loop. Must be in {'convex', 'concave', 'monotonic_inc', 'monotonic_dec', 'circular', 'none'} If None, then the model will apply no constraints. If only one str or callable is specified, then is it copied for all features. distribution : str or Distribution object, default: 'normal' Distribution to use in the model. link : str or Link object, default: 'identity' Link function to use in the model. dtype : str in {'auto', 'numerical', 'categorical'}, or list of str, default: 'auto' String describing the data-type of each feature. 'numerical' is used for continuous-valued data-types, like in regression. 'categorical' is used for discrete-valued data-types, like in classification. If only one str is specified, then is is copied for all features. lam : float or iterable of floats > 0, default: 0.6 Smoothing strength; must be a positive float, or one positive float per feature. Larger values enforce stronger smoothing. If only one float is specified, then it is copied for all features. fit_intercept : bool, default: True Specifies if a constant (a.k.a. bias or intercept) should be added to the decision function. NOTE: the intercept receives no smoothing penalty. fit_linear : bool or iterable of bools, default: False Specifies if a linear term should be added to any of the feature functions. Useful for including pre-defined feature transformations in the model. If only one bool is specified, then it is copied for all features. NOTE: Many constraints are incompatible with an additional linear fit. eg. if a non-zero linear function is added to a periodic spline function, it will cease to be periodic. this is also possible for a monotonic spline function. fit_splines : bool or iterable of bools, default: True Specifies if a smoother should be added to any of the feature functions. Useful for defining feature transformations a-priori that should not have splines fitted to them. If only one bool is specified, then it is copied for all features. NOTE: fit_splines supercedes n_splines. ie. if n_splines > 0 and fit_splines = False, no splines will be fitted. max_iter : int, default: 100 Maximum number of iterations allowed for the solver to converge. penalties : str or callable, or iterable of str or callable, default: 'auto' Type of penalty to use for each feature. penalty should be in {'auto', 'none', 'derivative', 'l2', } If 'auto', then the model will use 2nd derivative smoothing for features of dtype 'numerical', and L2 smoothing for features of dtype 'categorical'. If only one str or callable is specified, then is it copied for all features. n_splines : int, or iterable of ints, default: 25 Number of splines to use in each feature function; must be non-negative. If only one int is specified, then it is copied for all features. Note: this value is set to 0 if fit_splines is False spline_order : int, or iterable of ints, default: 3 Order of spline to use in each feature function; must be non-negative. If only one int is specified, then it is copied for all features Note: if a feature is of type categorical, spline_order will be set to 0. tol : float, default: 1e-4 Tolerance for stopping criteria. Attributes ---------- coef_ : array, shape (n_classes, m_features) Coefficient of the features in the decision function. If fit_intercept is True, then self.coef_[0] will contain the bias. statistics_ : dict Dictionary containing model statistics like GCV/UBRE scores, AIC/c, parameter covariances, estimated degrees of freedom, etc. logs_ : dict Dictionary containing the outputs of any callbacks at each optimization loop. The logs are structured as `{callback: [...]}` References ---------- Simon N. Wood, 2006 Generalized Additive Models: an introduction with R Hastie, Tibshirani, Friedman The Elements of Statistical Learning http://statweb.stanford.edu/~tibs/ElemStatLearn/printings/ESLII_print10.pdf Paul Eilers & Brian Marx, 2015 International Biometric Society: A Crash Course on P-splines http://www.ibschannel2015.nl/project/userfiles/Crash_course_handout.pdf """ def __init__(self, lam=0.6, max_iter=100, n_splines=25, spline_order=3, penalties='auto', tol=1e-4, distribution='normal', link='identity', callbacks=['deviance', 'diffs'], fit_intercept=True, fit_linear=False, fit_splines=True, dtype='auto', constraints=None): self.max_iter = max_iter self.tol = tol self.lam = lam self.n_splines = n_splines self.spline_order = spline_order self.penalties = penalties self.distribution = distribution self.link = link self.callbacks = callbacks self.constraints = constraints self.fit_intercept = fit_intercept self.fit_linear = fit_linear self.fit_splines = fit_splines self.dtype = dtype # created by other methods self._n_coeffs = [] # useful for indexing into model coefficients self._edge_knots = [] self._lam = [] self._n_splines = [] self._spline_order = [] self._penalties = [] self._constraints = [] self._dtype = [] self._fit_linear = [] self._fit_splines = [] self._fit_intercept = None # internal settings self._constraint_lam = 1e9 # regularization intensity for constraints self._constraint_l2 = 1e-3 # diagononal loading to improve conditioning self._constraint_l2_max = 1e-1 # maximum loading self._opt = 0 # use 0 for numerically stable optimizer, 1 for naive # call super and exclude any variables super(GAM, self).__init__() def _expand_attr(self, attr, n, dt_alt=None, msg=None): """ tool to parse and duplicate initialization arguments into model parameters. typically we use this tool to take a single attribute like: self.lam = 0.6 and make one copy per feature, ie: self._lam = [0.6, 0.6, 0.6] for a model with 3 features. if self.attr is an iterable of values of length n, then copy it verbatim to self._attr. otherwise extend the single value to a list of length n, and copy that to self._attr dt_alt is an alternative value for dtypes of type categorical (ie discrete). so if our 3-feature dataset is of types ['numerical', 'numerical', 'categorical'], we could use this method to turn self.lam = 0.6 into self.lam = [0.6, 0.6, 0.3] by calling self._expand_attr('lam', 3, dt_alt=0.3) Parameters ---------- attr : string name of the attribute to expand n : int number of time to repeat the attribute dt_alt : object, deafult: None object to subsitute attribute for categorical features. if dt_alt is None, categorical features are treated the same as numerical features. msg: string, default: None custom error message to report if self.attr is iterable BUT len(self.attr) != n if msg is None, default message is used: 'expected "attr" to have length X.shape[1], but found {}'.format(len(self.attr)) Returns ------- None """ data = deepcopy(getattr(self, attr)) _attr = '_' + attr if isiterable(data): if not (len(data) == n): if msg is None: msg = 'expected {} to have length X.shape[1], '\ 'but found {}'.format(attr, len(data)) raise ValueError(msg) else: data = [data] * n if dt_alt is not None: data = [d if dt != 'categorical' else dt_alt for d,dt in zip(data, self._dtype)] setattr(self, _attr, data) @property def _is_fitted(self): """ simple way to check if the GAM has been fitted Parameters --------- None Returns ------- bool : whether or not the model is fitted """ return hasattr(self, 'coef_') def _validate_params(self): """ method to sanitize model parameters Parameters --------- None Returns ------- None """ # fit_intercep if not isinstance(self.fit_intercept, bool): raise ValueError('fit_intercept must be type bool, but found {}'\ .format(self.fit_intercept.__class__)) # max_iter self.max_iter = check_param(self.max_iter, param_name='max_iter', dtype='int', constraint='>=1', iterable=False) # lam self.lam = check_param(self.lam, param_name='lam', dtype='float', constraint='>0') # n_splines self.n_splines = check_param(self.n_splines, param_name='n_splines', dtype='int', constraint='>=0') # spline_order self.spline_order = check_param(self.spline_order, param_name='spline_order', dtype='int', constraint='>=0') # n_splines + spline_order if not (np.atleast_1d(self.n_splines) > np.atleast_1d(self.spline_order)).all(): raise ValueError('n_splines must be > spline_order. '\ 'found: n_splines = {} and spline_order = {}'\ .format(self.n_splines, self.spline_order)) # distribution if not ((self.distribution in DISTRIBUTIONS) or isinstance(self.distribution, Distribution)): raise ValueError('unsupported distribution {}'.format(self.distribution)) if self.distribution in DISTRIBUTIONS: self.distribution = DISTRIBUTIONS[self.distribution]() # link if not ((self.link in LINK_FUNCTIONS) or isinstance(self.link, Link)): raise ValueError('unsupported link {}'.format(self.link)) if self.link in LINK_FUNCTIONS: self.link = LINK_FUNCTIONS[self.link]() # callbacks if not isiterable(self.callbacks): raise ValueError('Callbacks must be iterable, but found {}'\ .format(self.callbacks)) if not all([c in CALLBACKS or isinstance(c, CallBack) for c in self.callbacks]): raise ValueError('unsupported callback(s) {}'.format(self.callbacks)) callbacks = list(self.callbacks) for i, c in enumerate(self.callbacks): if c in CALLBACKS: callbacks[i] = CALLBACKS[c]() self.callbacks = [validate_callback(c) for c in callbacks] # penalties if not (isiterable(self.penalties) or hasattr(self.penalties, '__call__') or self.penalties in PENALTIES or self.penalties is None): raise ValueError('penalties must be iterable or callable, '\ 'but found {}'.format(self.penalties)) if isiterable(self.penalties): for i, p in enumerate(self.penalties): if not (hasattr(p, '__call__') or (p in PENALTIES) or (p is None)): raise ValueError("penalties must be callable or in "\ "{}, but found {} for {}th penalty"\ .format(list(PENALTIES.keys()), p, i)) # constraints if not (isiterable(self.constraints) or hasattr(self.constraints, '__call__') or self.constraints in CONSTRAINTS or self.constraints is None): raise ValueError('constraints must be iterable or callable, '\ 'but found {}'.format(self.constraints)) if isiterable(self.constraints): for i, c in enumerate(self.constraints): if not (hasattr(c, '__call__') or (c in CONSTRAINTS) or (c is None)): raise ValueError("constraints must be callable or in "\ "{}, but found {} for {}th constraint"\ .format(list(CONSTRAINTS.keys()), c, i)) # dtype if not (self.dtype in ['auto', 'numerical', 'categorical'] or isiterable(self.dtype)): raise ValueError("dtype must be in ['auto', 'numerical', "\ "'categorical'] or iterable of those strings, "\ "but found dtype = {}".format(self.dtype)) if isiterable(self.dtype): for dt in self.dtype: if dt not in ['auto', 'numerical', 'categorical']: raise ValueError("elements of iterable dtype must be in "\ "['auto', 'numerical', 'categorical], "\ "but found dtype = {}".format(self.dtype)) def _validate_data_dep_params(self, X): """ method to validate and prepare data-dependent parameters Parameters --------- X : array-like containing the input dataset Returns ------- None """ n_samples, m_features = X.shape # set up dtypes and check types if 'auto' self._expand_attr('dtype', m_features) for i, (dt, x) in enumerate(zip(self._dtype, X.T)): if dt == 'auto': dt = check_dtype(x)[0] if dt == 'categorical': warnings.warn('detected catergorical data for feature {}'\ .format(i), stacklevel=2) self._dtype[i] = dt assert len(self._dtype) == m_features # sanity check # set up lambdas self._expand_attr('lam', m_features) # add intercept term if self.fit_intercept: self._lam = [0.] + self._lam # set up penalty matrices self._expand_attr('penalties', m_features) # set up constraints self._expand_attr('constraints', m_features, dt_alt=None) # set up fit_linear and fit_splines, copy fit_intercept self._fit_intercept = self.fit_intercept self._expand_attr('fit_linear', m_features, dt_alt=False) self._expand_attr('fit_splines', m_features) for i, (fl, c) in enumerate(zip(self._fit_linear, self._constraints)): if bool(c) and (c is not 'none'): if fl: warnings.warn('cannot do fit_linear with constraints. '\ 'setting fit_linear=False for feature {}'\ .format(i)) self._fit_linear[i] = False line_or_spline = [bool(line + spline) for line, spline in \ zip(self._fit_linear, self._fit_splines)] # problems if not all(line_or_spline): bad = [i for i, l_or_s in enumerate(line_or_spline) if not l_or_s] raise ValueError('a line or a spline must be fit on each feature. '\ 'Neither were found on feature(s): {}' \ .format(bad)) # expand spline_order, n_splines, and prepare edge_knots self._expand_attr('spline_order', X.shape[1], dt_alt=0) self._expand_attr('n_splines', X.shape[1], dt_alt=0) self._edge_knots = [gen_edge_knots(feat, dtype) for feat, dtype in \ zip(X.T, self._dtype)] # update our n_splines correcting for categorical features, no splines for i, (fs, dt, ek) in enumerate(zip(self._fit_splines, self._dtype, self._edge_knots)): if fs: if dt == 'categorical': self._n_splines[i] = len(ek) - 1 if not fs: self._n_splines[i] = 0 # compute number of model coefficients self._n_coeffs = [] for n_splines, fit_linear, fit_splines in zip(self._n_splines, self._fit_linear, self._fit_splines): self._n_coeffs.append(n_splines * fit_splines + fit_linear) if self._fit_intercept: self._n_coeffs = [1] + self._n_coeffs def loglikelihood(self, X, y, weights=None): """ compute the log-likelihood of the dataset using the current model Parameters --------- X : array-like of shape (n_samples, m_features) containing the input dataset y : array-like of shape (n,) containing target values weights : array-like of shape (n,) containing sample weights Returns ------- log-likelihood : np.array of shape (n,) containing log-likelihood scores """ mu = self.predict_mu(X) return self._loglikelihood(y, mu, weights=weights) def _loglikelihood(self, y, mu, weights=None): """ compute the log-likelihood of the dataset using the current model Parameters --------- y : array-like of shape (n,) containing target values mu : array-like of shape (n_samples,) expected value of the targets given the model and inputs weights : array-like of shape (n,) containing sample weights Returns ------- log-likelihood : np.array of shape (n,) containing log-likelihood scores """ return np.log(self.distribution.pdf(y=y, mu=mu, weights=weights)).sum() def _linear_predictor(self, X=None, modelmat=None, b=None, feature=-1): """linear predictor compute the linear predictor portion of the model ie multiply the model matrix by the spline basis coefficients Parameters --------- at least 1 of (X, modelmat) and at least 1 of (b, feature) X : array-like of shape (n_samples, m_features), default: None containing the input dataset if None, will attempt to use modelmat modelmat : array-like, default: None contains the spline basis for each feature evaluated at the input values for each feature, ie model matrix if None, will attempt to construct the model matrix from X b : array-like, default: None contains the spline coefficients if None, will use current model coefficients feature : int, deafult: -1 feature for which to compute the linear prediction if -1, will compute for all features Returns ------- lp : np.array of shape (n_samples,) """ if modelmat is None: modelmat = self._modelmat(X, feature=feature) if b is None: b = self.coef_[self._select_feature(feature)] return modelmat.dot(b).flatten() def predict_mu(self, X): """ preduct expected value of target given model and input X Parameters --------- X : array-like of shape (n_samples, m_features), default: None containing the input dataset Returns ------- y : np.array of shape (n_samples,) containing expected values under the model """ if not self._is_fitted: raise AttributeError('GAM has not been fitted. Call fit first.') X = check_X(X, n_feats=len(self._n_coeffs) - self._fit_intercept, edge_knots=self._edge_knots, dtypes=self._dtype) lp = self._linear_predictor(X) return self.link.mu(lp, self.distribution) def predict(self, X): """ preduct expected value of target given model and input X often this is done via expected value of GAM given input X Parameters --------- X : array-like of shape (n_samples, m_features), default: None containing the input dataset Returns ------- y : np.array of shape (n_samples,) containing predicted values under the model """ if not self._is_fitted: raise AttributeError('GAM has not been fitted. Call fit first.') X = check_X(X, n_feats=len(self._n_coeffs) - self._fit_intercept, edge_knots=self._edge_knots, dtypes=self._dtype) return self.predict_mu(X) def _modelmat(self, X, feature=-1): """ Builds a model matrix, B, out of the spline basis for each feature B = [B_0, B_1, ..., B_p] Parameters --------- X : array-like of shape (n_samples, m_features), default: None containing the input dataset feature : int, default: -1 feature index for which to compute the model matrix if -1, will create the model matrix for all features Returns ------- modelmat : np.array of len n_samples containing model matrix of the spline basis for selected features """ X = check_X(X, n_feats=len(self._n_coeffs) - self._fit_intercept, edge_knots=self._edge_knots, dtypes=self._dtype) if feature >= len(self._n_coeffs) or feature < -1: raise ValueError('feature {} out of range for X with shape {}'\ .format(feature, X.shape)) # for all features, build matrix recursively if feature == -1: modelmat = [] for feat in range(X.shape[1] + self._fit_intercept): modelmat.append(self._modelmat(X, feature=feat)) return sp.sparse.hstack(modelmat, format='csc') # intercept if (feature == 0) and self._fit_intercept: return sp.sparse.csc_matrix(np.ones((X.shape[0], 1))) # return only the basis functions for 1 feature feature = feature - self._fit_intercept featuremat = [] if self._fit_linear[feature]: featuremat.append(sp.sparse.csc_matrix(X[:, feature][:,None])) if self._fit_splines[feature]: featuremat.append(b_spline_basis(X[:,feature], edge_knots=self._edge_knots[feature], spline_order=self._spline_order[feature], n_splines=self._n_splines[feature], sparse=True)) return sp.sparse.hstack(featuremat, format='csc') def _cholesky(self, A, **kwargs): """ method to handle potential problems with the cholesky decomposition. will try to increase L2 regularization of the penalty matrix to do away with non-positive-definite errors Parameters ---------- A : np.array Returns ------- np.array """ # create appropriate-size diagonal matrix if sp.sparse.issparse(A): diag = sp.sparse.eye(A.shape[0]) else: diag = np.eye(A.shape[0]) constraint_l2 = self._constraint_l2 while constraint_l2 <= self._constraint_l2_max: try: L = cholesky(A, **kwargs) self._constraint_l2 = constraint_l2 return L except NotPositiveDefiniteError: warnings.warn('Matrix is not positive definite. \n'\ 'Increasing l2 reg by factor of 10.', stacklevel=2) A -= constraint_l2 * diag constraint_l2 *= 10 A += constraint_l2 * diag raise NotPositiveDefiniteError('Matrix is not positive \n' 'definite.') def _C(self): """ builds the GAM block-diagonal constraint matrix in quadratic form out of constraint matrices specified for each feature. behaves like a penalty, but with a very large lambda value, ie 1e6. Parameters --------- None Returns ------- C : sparse CSC matrix containing the model constraints in quadratic form """ Cs = [] if self._fit_intercept: Cs.append(np.array(0.)) for i, c in enumerate(self._constraints): fit_linear = self._fit_linear[i] dtype = self._dtype[i] n = self._n_coeffs[i + self._fit_intercept] coef = self.coef_[self._select_feature(i + self._fit_intercept)] coef = coef[fit_linear:] if c is None: c = 'none' if c in CONSTRAINTS: c = CONSTRAINTS[c] c = wrap_penalty(c, fit_linear)(n, coef) * self._constraint_lam Cs.append(c) Cs = sp.sparse.block_diag(Cs) # improve condition if Cs.nnz > 0: Cs += sp.sparse.diags(self._constraint_l2 * np.ones(Cs.shape[0])) return Cs def _P(self): """ builds the GAM block-diagonal penalty matrix in quadratic form out of penalty matrices specified for each feature. each feature penalty matrix is multiplied by a lambda for that feature. the first feature is the intercept. so for m features: P = block_diag[lam0 * P0, lam1 * P1, lam2 * P2, ... , lamm * Pm] Parameters --------- None Returns ------- P : sparse CSC matrix containing the model penalties in quadratic form """ Ps = [] if self._fit_intercept: Ps.append(np.array(0.)) for i, p in enumerate(self._penalties): fit_linear = self._fit_linear[i] dtype = self._dtype[i] n = self._n_coeffs[i + self._fit_intercept] coef = self.coef_[self._select_feature(i + self._fit_intercept)] coef = coef[fit_linear:] if p == 'auto': if dtype == 'numerical': p = derivative if dtype == 'categorical': p = l2 if p is None: p = 'none' if p in PENALTIES: p = PENALTIES[p] p = wrap_penalty(p, fit_linear)(n, coef) Ps.append(p) P_matrix = tuple([np.multiply(P, lam) for lam, P in zip(self._lam, Ps)]) P_matrix = sp.sparse.block_diag(P_matrix) return P_matrix def _pseudo_data(self, y, lp, mu): """ compute the pseudo data for a PIRLS iterations Parameters --------- y : array-like of shape (n,) containing target data lp : array-like of shape (n,) containing linear predictions by the model mu : array-like of shape (n_samples,) expected value of the targets given the model and inputs Returns ------- pseudo_data : np.array of shape (n,) """ return lp + (y - mu) * self.link.gradient(mu, self.distribution) def _W(self, mu, weights): """ compute the PIRLS weights for model predictions. TODO lets verify the formula for this. if we use the square root of the mu with the stable opt, we get the same results as when we use non-sqrt mu with naive opt. this makes me think that they are equivalent. also, using non-sqrt mu with stable opt gives very small edofs for even lam=0.001 and the parameter variance is huge. this seems strange to me. computed [V * d(link)/d(mu)] ^(-1/2) by hand and the math checks out as hoped. ive since moved the square to the naive pirls method to make the code modular. Parameters --------- mu : array-like of shape (n_samples,) expected value of the targets given the model and inputs weights : array-like of shape (n_samples,) containing sample weights Returns ------- weights : sp..sparse array of shape (n_samples, n_samples) """ return sp.sparse.diags((self.link.gradient(mu, self.distribution)**2 * self.distribution.V(mu=mu) * weights ** -1)**-0.5) def _mask(self, weights): """ identifies the mask at which the weights are greater than sqrt(machine epsilon) and not NaN and not Inf Parameters --------- weights : array-like of shape (n,) containing weights in [0,1] Returns ------- mask : boolean np.array of shape (n,) of good weight values """ mask = (np.abs(weights) >= np.sqrt(EPS)) * np.isfinite(weights) assert mask.sum() != 0, 'increase regularization' return mask def _pirls(self, X, Y, weights): """ Performs stable PIRLS iterations to estimate GAM coefficients Parameters --------- X : array-like of shape (n_samples, m_features) containing input data Y : array-like of shape (n,) containing target data weights : array-like of shape (n,) containing sample weights Returns ------- None """ modelmat = self._modelmat(X) # build a basis matrix for the GLM n, m = modelmat.shape min_n_m = np.min([m,n]) # initialize GLM coefficients if not self._is_fitted or len(self.coef_) != sum(self._n_coeffs): self.coef_ = np.ones(m) * np.sqrt(EPS) # allow more training # do our penalties require recomputing cholesky? chol_pen = np.ravel([np.ravel(p) for p in self._penalties]) chol_pen = any([cp in ['convex', 'concave', 'monotonic_inc', 'monotonic_dec', 'circular']for cp in chol_pen]) P = self._P() # create penalty matrix # base penalty S = sp.sparse.diags(np.ones(m) * np.sqrt(EPS)) # improve condition # S += self._H # add any user-chosen minumum penalty to the diagonal # if we dont have any constraints, then do cholesky now if not any(self._constraints) and not chol_pen: E = self._cholesky(S + P, sparse=False) Dinv = np.zeros((min_n_m + m, m)).T for _ in range(self.max_iter): # recompute cholesky if needed if any(self._constraints) or chol_pen: P = self._P() C = self._C() E = self._cholesky(S + P + C, sparse=False) # forward pass y = deepcopy(Y) # for simplicity lp = self._linear_predictor(modelmat=modelmat) mu = self.link.mu(lp, self.distribution) W = self._W(mu, weights) # create pirls weight matrix # check for weghts == 0, nan, and update mask = self._mask(W.diagonal()) y = y[mask] # update lp = lp[mask] # update mu = mu[mask] # update W = sp.sparse.diags(W.diagonal()[mask]) # update # PIRLS Wood pg 183 pseudo_data = W.dot(self._pseudo_data(y, lp, mu)) # log on-loop-start stats self._on_loop_start(vars()) WB = W.dot(modelmat[mask,:]) # common matrix product Q, R = np.linalg.qr(WB.todense()) if not np.isfinite(Q).all() or not np.isfinite(R).all(): raise ValueError('QR decomposition produced NaN or Inf. '\ 'Check X data.') U, d, Vt = np.linalg.svd(np.vstack([R, E.T])) svd_mask = d <= (d.max() * np.sqrt(EPS)) # mask out small singular values np.fill_diagonal(Dinv, d**-1) # invert the singular values U1 = U[:min_n_m,:] # keep only top portion of U B = Vt.T.dot(Dinv).dot(U1.T).dot(Q.T) coef_new = B.dot(pseudo_data).A.flatten() diff = np.linalg.norm(self.coef_ - coef_new)/np.linalg.norm(coef_new) self.coef_ = coef_new # update # log on-loop-end stats self._on_loop_end(vars()) # check convergence if diff < self.tol: break # estimate statistics even if not converged self._estimate_model_statistics(Y, modelmat, inner=None, BW=WB.T, B=B, weights=weights) if diff < self.tol: return print('did not converge') return def _pirls_naive(self, X, y): """ Performs naive PIRLS iterations to estimate GAM coefficients Parameters --------- X : array-like of shape (n_samples, m_features) containing input data y : array-like of shape (n,) containing target data Returns ------- None """ modelmat = self._modelmat(X) # build a basis matrix for the GLM m = modelmat.shape[1] # initialize GLM coefficients if not self._is_fitted or len(self.coef_) != sum(self._n_coeffs): self.coef_ = np.ones(m) * np.sqrt(EPS) # allow more training P = self._P() # create penalty matrix P += sp.sparse.diags(np.ones(m) * np.sqrt(EPS)) # improve condition for _ in range(self.max_iter): lp = self._linear_predictor(modelmat=modelmat) mu = self.link.mu(lp, self.distribution) mask = self._mask(mu) mu = mu[mask] # update lp = lp[mask] # update if self.family == 'binomial': self.acc.append(self.accuracy(y=y[mask], mu=mu)) # log the training accuracy self.dev.append(self.deviance_(y=y[mask], mu=mu, scaled=False)) # log the training deviance weights = self._W(mu)**2 # PIRLS, added square for modularity pseudo_data = self._pseudo_data(y, lp, mu) # PIRLS BW = modelmat.T.dot(weights).tocsc() # common matrix product inner = sp.sparse.linalg.inv(BW.dot(modelmat) + P) # keep for edof coef_new = inner.dot(BW).dot(pseudo_data).flatten() diff = np.linalg.norm(self.coef_ - coef_new)/np.linalg.norm(coef_new) self.diffs.append(diff) self.coef_ = coef_new # update # check convergence if diff < self.tol: self.edof_ = self._estimate_edof(modelmat, inner, BW) self.aic_ = self._estimate_AIC(X, y, mu) self.aicc_ = self._estimate_AICc(X, y, mu) return print('did not converge') def _on_loop_start(self, variables): """ performs on-loop-start actions like callbacks variables contains local namespace variables. Parameters --------- variables : dict of available variables Returns ------- None """ for callback in self.callbacks: if hasattr(callback, 'on_loop_start'): self.logs_[str(callback)].append(callback.on_loop_start(**variables)) def _on_loop_end(self, variables): """ performs on-loop-end actions like callbacks variables contains local namespace variables. Parameters --------- variables : dict of available variables Returns ------- None """ for callback in self.callbacks: if hasattr(callback, 'on_loop_end'): self.logs_[str(callback)].append(callback.on_loop_end(**variables)) def fit(self, X, y, weights=None): """Fit the generalized additive model. Parameters ---------- X : array-like, shape (n_samples, m_features) Training vectors, where n_samples is the number of samples and m_features is the number of features. y : array-like, shape (n_samples,) Target values (integers in classification, real numbers in regression) For classification, labels must correspond to classes. weights : array-like shape (n_samples,) or None, default: None containing sample weights if None, defaults to array of ones Returns ------- self : object Returns fitted GAM object """ # validate parameters self._validate_params() # validate data y = check_y(y, self.link, self.distribution) X = check_X(X) check_X_y(X, y) if weights is not None: weights = np.array(weights).astype('f') check_lengths(y, weights) else: weights = np.ones_like(y).astype('f') # validate data-dependent parameters self._validate_data_dep_params(X) # set up logging if not hasattr(self, 'logs_'): self.logs_ = defaultdict(list) # optimize if self._opt == 0: self._pirls(X, y, weights) if self._opt == 1: self._pirls_naive(X, y) return self def deviance_residuals(self, X, y, weights=None, scaled=False): """ method to compute the deviance residuals of the model these are analogous to the residuals of an OLS. Parameters ---------- X : array-like input data array of shape (n_saples, m_features) y : array-like output data vector of shape (n_samples,) weights : array-like shape (n_samples,) or None, default: None containing sample weights if None, defaults to array of ones scaled : bool, default: False whether to scale the deviance by the (estimated) distribution scale Returns ------- deviance_residuals : np.array with shape (n_samples,) """ if not self._is_fitted: raise AttributeError('GAM has not been fitted. Call fit first.') y = check_y(y, self.link, self.distribution) X = check_X(X, n_feats=len(self._n_coeffs) - self._fit_intercept, edge_knots=self._edge_knots, dtypes=self._dtype) check_X_y(X, y) if weights is not None: weights = np.array(weights).astype('f') check_lengths(y, weights) else: weights = np.ones_like(y).astype('f') mu = self.predict_mu(X) sign = np.sign(y-mu) return sign * self.distribution.deviance(y, mu, weights=weights, scaled=scaled) ** 0.5 def _estimate_model_statistics(self, y, modelmat, inner=None, BW=None, B=None, weights=None): """ method to compute all of the model statistics results are stored in the 'statistics_' attribute of the model, as a dictionary keyed by: - edof: estimated degrees freedom - scale: distribution scale, if applicable - cov: coefficient covariances - AIC: Akaike Information Criterion - AICc: corrected Akaike Information Criterion - r2: explained_deviance Pseudo R-squared - GCV: generailized cross-validation or - UBRE: Un-Biased Risk Estimator Parameters ---------- y : array-like output data vector of shape (n_samples,) modelmat : array-like, default: None contains the spline basis for each feature evaluated at the input inner : array of intermediate computations from naive optimization BW : array of intermediate computations from either optimization B : array of intermediate computations from stable optimization weights : array-like shape (n_samples,) or None, default: None containing sample weights Returns ------- None """ self.statistics_ = {} lp = self._linear_predictor(modelmat=modelmat) mu = self.link.mu(lp, self.distribution) self.statistics_['edof'] = self._estimate_edof(BW=BW, B=B) # self.edof_ = np.dot(U1, U1.T).trace().A.flatten() # this is wrong? if not self.distribution._known_scale: self.distribution.scale = self.distribution.phi(y=y, mu=mu, edof=self.statistics_['edof'], weights=weights) self.statistics_['scale'] = self.distribution.scale self.statistics_['cov'] = (B.dot(B.T)).A * self.distribution.scale # parameter covariances. no need to remove a W because we are using W^2. Wood pg 184 self.statistics_['se'] = self.statistics_['cov'].diagonal()**0.5 self.statistics_['AIC']= self._estimate_AIC(y=y, mu=mu, weights=weights) self.statistics_['AICc'] = self._estimate_AICc(y=y, mu=mu, weights=weights) self.statistics_['pseudo_r2'] = self._estimate_r2(y=y, mu=mu, weights=weights) self.statistics_['GCV'], self.statistics_['UBRE'] = self._estimate_GCV_UBRE(modelmat=modelmat, y=y, weights=weights) self.statistics_['loglikelihood'] = self._loglikelihood(y, mu, weights=weights) self.statistics_['deviance'] = self.distribution.deviance(y=y, mu=mu, weights=weights).sum() def _estimate_edof(self, modelmat=None, inner=None, BW=None, B=None, limit=50000): """ estimate effective degrees of freedom. computes the only diagonal of the influence matrix and sums. allows for subsampling when the number of samples is very large. Parameters ---------- modelmat : array-like, default: None contains the spline basis for each feature evaluated at the input inner : array of intermediate computations from naive optimization BW : array of intermediate computations from either optimization B : array of intermediate computations from stable optimization limit : int, default: 50000 number of samples required before subsampling the model matrix. this requires less computation. Returns ------- None """ size = BW.shape[1] # number of samples max_ = np.min([limit, size]) # since we only compute the diagonal, we can afford larger matrices if max_ == limit: # subsampling scale = np.float(size)/max_ idxs = list(range(size)) np.random.shuffle(idxs) if B is None: return scale * modelmat.dot(inner).tocsr()[idxs[:max_]].T.multiply(BW[:,idxs[:max_]]).sum() else: return scale * BW[:,idxs[:max_]].multiply(B[:,idxs[:max_]]).sum() else: # no subsampling if B is None: return modelmat.dot(inner).T.multiply(BW).sum() else: return BW.multiply(B).sum() def _estimate_AIC(self, y, mu, weights=None): """ estimate the Akaike Information Criterion Parameters ---------- y : array-like of shape (n_samples,) output data vector mu : array-like of shape (n_samples,) expected value of the targets given the model and inputs Returns ------- None """ estimated_scale = not(self.distribution._known_scale) # if we estimate the scale, that adds 2 dof return -2*self._loglikelihood(y=y, mu=mu, weights=weights) + \ 2*self.statistics_['edof'] + 2*estimated_scale def _estimate_AICc(self, y, mu, weights=None): """ estimate the corrected Akaike Information Criterion relies on the estimated degrees of freedom, which must be computed before. Parameters ---------- y : array-like of shape (n_samples,) output data vector mu : array-like of shape (n_samples,) expected value of the targets given the model and inputs Returns ------- None """ edof = self.statistics_['edof'] if self.statistics_['AIC'] is None: self.statistics_['AIC'] = self._estimate_AIC(y, mu, weights) return self.statistics_['AIC'] + 2*(edof + 1)*(edof + 2)/(y.shape[0] - edof -2) def _estimate_r2(self, X=None, y=None, mu=None, weights=None): """ estimate some pseudo R^2 values currently only computes explained deviance. results are stored Parameters ---------- y : array-like of shape (n_samples,) output data vector mu : array-like of shape (n_samples,) expected value of the targets given the model and inputs weights : array-like shape (n_samples,) or None, default: None containing sample weights if None, defaults to array of ones Returns ------- None """ if mu is None: mu = self.predict_mu_(X=X) if weights is None: weights = np.ones_like(y) null_mu = y.mean() * np.ones_like(y) null_d = self.distribution.deviance(y=y, mu=null_mu, weights=weights) full_d = self.distribution.deviance(y=y, mu=mu, weights=weights) null_ll = self._loglikelihood(y=y, mu=null_mu, weights=weights) full_ll = self._loglikelihood(y=y, mu=mu, weights=weights) r2 = OrderedDict() r2['explained_deviance'] = 1. - full_d.sum()/null_d.sum() r2['McFadden'] = 1. - full_ll/null_ll r2['McFadden_adj'] = 1. - (full_ll - self.statistics_['edof'])/null_ll null_ll = self._loglikelihood(y, mu, weights) return r2 def _estimate_GCV_UBRE(self, X=None, y=None, modelmat=None, gamma=1.4, add_scale=True, weights=None): """ Generalized Cross Validation and Un-Biased Risk Estimator. UBRE is used when the scale parameter is known, like Poisson and Binomial families. Parameters ---------- y : array-like of shape (n_samples,) output data vector modelmat : array-like, default: None contains the spline basis for each feature evaluated at the input gamma : float, default: 1.4 serves as a weighting to increase the impact of the influence matrix on the score add_scale : boolean, default: True UBRE score can be negative because the distribution scale is subtracted. to keep things positive we can add the scale back. weights : array-like shape (n_samples,) or None, default: None containing sample weights if None, defaults to array of ones Returns ------- score : float Either GCV or UBRE, depending on if the scale parameter is known. Notes ----- Sometimes the GCV or UBRE selected model is deemed to be too wiggly, and a smoother model is desired. One way to achieve this, in a systematic way, is to increase the amount that each model effective degree of freedom counts, in the GCV or UBRE score, by a factor γ ≥ 1 see Wood 2006 pg. 177-182, 220 for more details. """ if gamma < 1: raise ValueError('gamma scaling should be greater than 1, '\ 'but found gamma = {}',format(gamma)) if modelmat is None: modelmat = self._modelmat(X) if weights is None: weights = np.ones_like(y) lp = self._linear_predictor(modelmat=modelmat) mu = self.link.mu(lp, self.distribution) n = y.shape[0] edof = self.statistics_['edof'] GCV = None UBRE = None dev = self.distribution.deviance(mu=mu, y=y, scaled=False, weights=weights).sum() if self.distribution._known_scale: # scale is known, use UBRE scale = self.distribution.scale UBRE = 1./n * dev - (~add_scale)*(scale) + 2.*gamma/n * edof * scale else: # scale unkown, use GCV GCV = (n * dev) / (n - gamma * edof)**2 return (GCV, UBRE) def confidence_intervals(self, X, width=.95, quantiles=None): """ estimate confidence intervals for the model. Parameters ---------- X : array-like of shape (n_samples, m_features) input data matrix width : float on [0,1], default: 0.95 quantiles : array-like of floats in [0, 1], default: None instead of specifying the prediciton width, one can specify the quantiles. so width=.95 is equivalent to quantiles=[.025, .975] Returns ------- intervals: np.array of shape (n_samples, 2 or len(quantiles)) """ if not self._is_fitted: raise AttributeError('GAM has not been fitted. Call fit first.') X = check_X(X, n_feats=len(self._n_coeffs) - self._fit_intercept, edge_knots=self._edge_knots, dtypes=self._dtype) return self._get_quantiles(X, width, quantiles, prediction=False) def _get_quantiles(self, X, width, quantiles, modelmat=None, lp=None, prediction=False, xform=True, feature=-1): """ estimate prediction intervals for LinearGAM Parameters ---------- X : array input data of shape (n_samples, m_features) y : array label data of shape (n_samples,) width : float on [0,1] quantiles : array-like of floats in [0, 1] instead of specifying the prediciton width, one can specify the quantiles. so width=.95 is equivalent to quantiles=[.025, .975] modelmat : array of shape Returns ------- intervals: np.array of shape (n_samples, 2 or len(quantiles)) """ if quantiles is not None: quantiles = np.atleast_1d(quantiles) else: alpha = (1 - width)/2. quantiles = [alpha, 1 - alpha] for quantile in quantiles: if (quantile > 1) or (quantile < 0): raise ValueError('quantiles must be in [0, 1], but found {}'\ .format(quantiles)) if modelmat is None: modelmat = self._modelmat(X, feature=feature) if lp is None: lp = self._linear_predictor(modelmat=modelmat, feature=feature) idxs = self._select_feature(feature) cov = self.statistics_['cov'][idxs][:,idxs] var = (modelmat.dot(cov) * modelmat.todense().A).sum(axis=1) if prediction: var += self.distribution.scale lines = [] for quantile in quantiles: t = sp.stats.t.ppf(quantile, df=self.statistics_['edof']) lines.append(lp + t * var**0.5) lines = np.vstack(lines).T if xform: lines = self.link.mu(lines, self.distribution) return lines def _select_feature(self, feature): """ tool for indexing by feature function. many coefficients and parameters are organized by feature. this tool returns all of the indices for a given feature. GAM intercept is considered the 0th feature. Parameters ---------- feature : int feature to select from the data. when fit_intercept=True, 0 corresponds to the intercept when feature=-1, all features are selected Returns ------- np.array indices into self.coef_ corresponding to the chosen feature """ if feature >= len(self._n_coeffs) or feature < -1: raise ValueError('feature {} out of range for X with shape {}'\ .format(feature, X.shape)) if feature == -1: # special case for selecting all features return np.arange(np.sum(self._n_coeffs), dtype=int) a = np.sum(self._n_coeffs[:feature]) b = np.sum(self._n_coeffs[feature]) return np.arange(a, a+b, dtype=int) def partial_dependence(self, X, feature=-1, width=None, quantiles=None): """ Computes the feature functions for the GAM and possibly their confidence intervals. if both width=None and quantiles=None, then no confidence intervals are computed Parameters ---------- X : array input data of shape (n_samples, m_features) feature : array-like of ints, default: -1 feature for which to compute the partial dependence functions if feature == -1, then all features are selected, excluding the intercept if feature == 0 and gam.fit_intercept is True, then the intercept's patial dependence is returned width : float in [0, 1], default: None width of the confidence interval if None, defaults to 0.95 quantiles : array-like of floats in [0, 1], default: None instead of specifying the prediciton width, one can specify the quantiles. so width=.95 is equivalent to quantiles=[.025, .975] if None, defaults to width Returns ------- pdeps : np.array of shape (n_samples, len(feature)) conf_intervals : list of length len(feature) containing np.arrays of shape (n_samples, 2 or len(quantiles)) """ if not self._is_fitted: raise AttributeError('GAM has not been fitted. Call fit first.') m = len(self._n_coeffs) - self._fit_intercept X = check_X(X, n_feats=m, edge_knots=self._edge_knots, dtypes=self._dtype) p_deps = [] compute_quantiles = (width is not None) or (quantiles is not None) conf_intervals = [] if feature == -1: feature = np.arange(m) + self._fit_intercept # convert to array feature = np.atleast_1d(feature) # ensure feature exists if (feature >= len(self._n_coeffs)).any() or (feature < -1).any(): raise ValueError('feature {} out of range for X with shape {}'\ .format(feature, X.shape)) for i in feature: modelmat = self._modelmat(X, feature=i) lp = self._linear_predictor(modelmat=modelmat, feature=i) p_deps.append(lp) if compute_quantiles: conf_intervals.append(self._get_quantiles(X, width=width, quantiles=quantiles, modelmat=modelmat, lp=lp, feature=i, xform=False)) pdeps = np.vstack(p_deps).T if compute_quantiles: return (pdeps, conf_intervals) return pdeps def summary(self): """ produce a summary of the model statistics #TODO including feature significance via F-Test Parameters ---------- None Returns ------- None """ if not self._is_fitted: raise AttributeError('GAM has not been fitted. Call fit first.') keys = ['edof', 'AIC', 'AICc'] if self.distribution._known_scale: keys.append('UBRE') else: keys.append('GCV') keys.append('loglikelihood') keys.append('deviance') keys.append('scale') sub_data = OrderedDict([[k, self.statistics_[k]] for k in keys]) print_data(sub_data, title='Model Statistics') print('') print_data(self.statistics_['pseudo_r2'], title='Pseudo-R^2') def gridsearch(self, X, y, weights=None, return_scores=False, keep_best=True, objective='auto', **param_grids): """ performs a grid search over a space of parameters for a given objective NOTE: gridsearch method is lazy and will not remove useless combinations from the search space, eg. n_splines=np.arange(5,10), fit_splines=[True, False] will result in 10 loops, of which 5 are equivalent because even though fit_splines==False it is not recommended to search over a grid that alternates between known scales and unknown scales, as the scores of the cadidate models will not be comparable. Parameters ---------- X : array input data of shape (n_samples, m_features) y : array label data of shape (n_samples,) weights : array-like shape (n_samples,) or None, default: None containing sample weights if None, defaults to array of ones return_scores : boolean, default False whether to return the hyperpamaters and score for each element in the grid keep_best : boolean whether to keep the best GAM as self. default: True objective : string, default: 'auto' metric to optimize. must be in ['AIC', 'AICc', 'GCV', 'UBRE', 'auto'] if 'auto', then grid search will optimize GCV for models with unknown scale and UBRE for models with known scale. **kwargs : dict, default {'lam': np.logspace(-3, 3, 11)} pairs of parameters and iterables of floats, or parameters and iterables of iterables of floats. if iterable of iterables of floats, the outer iterable must have length m_features. the method will make a grid of all the combinations of the parameters and fit a GAM to each combination. Returns ------- if return_scores == True: model_scores : dict Contains each fitted model as keys and corresponding objective scores as values else: self, ie possibly the newly fitted model """ # validate objective if objective not in ['auto', 'GCV', 'UBRE', 'AIC', 'AICc']: raise ValueError("objective mut be in "\ "['auto', 'GCV', 'UBRE', 'AIC', 'AICc'], '\ 'but found objective = {}".format(objective)) # check if model fitted if not self._is_fitted: self._validate_params() # check objective if self.distribution._known_scale: if objective == 'GCV': raise ValueError('GCV should be used for models with'\ 'unknown scale') if objective == 'auto': objective = 'UBRE' else: if objective == 'UBRE': raise ValueError('UBRE should be used for models with '\ 'known scale') if objective == 'auto': objective = 'GCV' # if no params, then set up default gridsearch if not bool(param_grids): param_grids['lam'] = np.logspace(-3, 3, 11) # validate params admissible_params = self.get_params() params = [] grids = [] for param, grid in list(param_grids.items()): if param not in (admissible_params): raise ValueError('unknown parameter: {}'.format(param)) if not (isiterable(grid) and (len(grid) > 1)): \ raise ValueError('{} grid must either be iterable of ' 'iterables, or an iterable of lengnth > 1, '\ 'but found {}'.format(param, grid)) # prepare grid if any(isiterable(g) for g in grid): # cast to np.array grid = [np.atleast_1d(g) for g in grid] # set grid to combination of all grids grid = combine(*grid) # save param name and grid params.append(param) grids.append(grid) # build a list of dicts of candidate model params param_grid_list = [] for candidate in combine(*grids): param_grid_list.append(dict(zip(params,candidate))) # set up data collection best_model = None # keep the best model best_score = np.inf scores = [] models = [] # check if our model has been fitted already and store it if self._is_fitted: models.append(self) scores.append(self.statistics_[objective]) # our model is currently the best best_model = models[-1] best_score = scores[-1] # loop through candidate model params pbar = ProgressBar() for param_grid in pbar(param_grid_list): # define new model gam = deepcopy(self) gam.set_params(self.get_params()) gam.set_params(**param_grid) # warm start with parameters from previous build if models: coef = models[-1].coef_ gam.set_params(coef_=coef, force=True) try: # try fitting gam.fit(X, y, weights) except ValueError as error: msg = str(error) + '\non model:\n' + str(gam) msg += '\nskipping...\n' warnings.warn(msg) continue # record results models.append(gam) scores.append(gam.statistics_[objective]) # track best if scores[-1] < best_score: best_model = models[-1] best_score = scores[-1] # problems if len(models) == 0: msg = 'No models were fitted.' warnings.warn(msg) return self # copy over the best if keep_best: self.set_params(deep=True, force=True, **best_model.get_params(deep=True)) if return_scores: return OrderedDict(zip(models, scores)) else: return self class LinearGAM(GAM): """Linear GAM Parameters ---------- callbacks : list of strings or list of CallBack objects, default: ['deviance', 'diffs'] Names of callback objects to call during the optimization loop. constraints : str or callable, or iterable of str or callable, default: None Names of constraint functions to call during the optimization loop. Must be in {'convex', 'concave', 'monotonic_inc', 'monotonic_dec', 'circular', 'none'} If None, then the model will apply no constraints. If only one str or callable is specified, then is it copied for all features. dtype : str in {'auto', 'numerical', 'categorical'}, or list of str, default: 'auto' String describing the data-type of each feature. 'numerical' is used for continuous-valued data-types, like in regression. 'categorical' is used for discrete-valued data-types, like in classification. If only one str is specified, then is is copied for all features. lam : float or iterable of floats > 0, default: 0.6 Smoothing strength; must be a positive float, or one positive float per feature. Larger values enforce stronger smoothing. If only one float is specified, then it is copied for all features. fit_intercept : bool, default: True Specifies if a constant (a.k.a. bias or intercept) should be added to the decision function. NOTE: the intercept receives no smoothing penalty. fit_linear : bool or iterable of bools, default: False Specifies if a linear term should be added to any of the feature functions. Useful for including pre-defined feature transformations in the model. If only one bool is specified, then it is copied for all features. NOTE: Many constraints are incompatible with an additional linear fit. eg. if a non-zero linear function is added to a periodic spline function, it will cease to be periodic. this is also possible for a monotonic spline function. fit_splines : bool or iterable of bools, default: True Specifies if a smoother should be added to any of the feature functions. Useful for defining feature transformations a-priori that should not have splines fitted to them. If only one bool is specified, then it is copied for all features. NOTE: fit_splines supercedes n_splines. ie. if n_splines > 0 and fit_splines = False, no splines will be fitted. max_iter : int, default: 100 Maximum number of iterations allowed for the solver to converge. penalties : str or callable, or iterable of str or callable, default: 'auto' Type of penalty to use for each feature. penalty should be in {'auto', 'none', 'derivative', 'l2', } If 'auto', then the model will use 2nd derivative smoothing for features of dtype 'numerical', and L2 smoothing for features of dtype 'categorical'. If only one str or callable is specified, then is it copied for all features. n_splines : int, or iterable of ints, default: 25 Number of splines to use in each feature function; must be non-negative. If only one int is specified, then it is copied for all features. Note: this value is set to 0 if fit_splines is False scale : float or None, default: None scale of the distribution, if known a-priori. if None, scale is estimated. spline_order : int, or iterable of ints, default: 3 Order of spline to use in each feature function; must be non-negative. If only one int is specified, then it is copied for all features Note: if a feature is of type categorical, spline_order will be set to 0. tol : float, default: 1e-4 Tolerance for stopping criteria. Attributes ---------- coef_ : array, shape (n_classes, m_features) Coefficient of the features in the decision function. If fit_intercept is True, then self.coef_[0] will contain the bias. statistics_ : dict Dictionary containing model statistics like GCV/UBRE scores, AIC/c, parameter covariances, estimated degrees of freedom, etc. logs_ : dict Dictionary containing the outputs of any callbacks at each optimization loop. The logs are structured as `{callback: [...]}` References ---------- Simon N. Wood, 2006 Generalized Additive Models: an introduction with R Hastie, Tibshirani, Friedman The Elements of Statistical Learning http://statweb.stanford.edu/~tibs/ElemStatLearn/printings/ESLII_print10.pdf Paul Eilers & Brian Marx, 2015 International Biometric Society: A Crash Course on P-splines http://www.ibschannel2015.nl/project/userfiles/Crash_course_handout.pdf """ def __init__(self, lam=0.6, max_iter=100, n_splines=25, spline_order=3, penalties='auto', dtype='auto', tol=1e-4, scale=None, callbacks=['deviance', 'diffs'], fit_intercept=True, fit_linear=False, fit_splines=True, constraints=None): self.scale = scale super(LinearGAM, self).__init__(distribution=NormalDist(scale=self.scale), link='identity', lam=lam, dtype=dtype, max_iter=max_iter, n_splines=n_splines, spline_order=spline_order, penalties=penalties, tol=tol, callbacks=callbacks, fit_intercept=fit_intercept, fit_linear=fit_linear, fit_splines=fit_splines, constraints=constraints) self._exclude += ['distribution', 'link'] def _validate_params(self): """ method to sanitize model parameters Parameters --------- None Returns ------- None """ self.distribution = NormalDist(scale=self.scale) super(LinearGAM, self)._validate_params() def prediction_intervals(self, X, width=.95, quantiles=None): """ estimate prediction intervals for LinearGAM Parameters ---------- X : array-like of shape (n_samples, m_features) input data matrix width : float on [0,1], default: 0.95 quantiles : array-like of floats in [0, 1], default: None instead of specifying the prediciton width, one can specify the quantiles. so width=.95 is equivalent to quantiles=[.025, .975] Returns ------- intervals: np.array of shape (n_samples, 2 or len(quantiles)) """ if not self._is_fitted: raise AttributeError('GAM has not been fitted. Call fit first.') X = check_X(X, n_feats=len(self._n_coeffs) - self._fit_intercept, edge_knots=self._edge_knots, dtypes=self._dtype) return self._get_quantiles(X, width, quantiles, prediction=True) class LogisticGAM(GAM): """Logistic GAM Parameters ---------- callbacks : list of strings or list of CallBack objects, default: ['deviance', 'diffs'] Names of callback objects to call during the optimization loop. constraints : str or callable, or iterable of str or callable, default: None Names of constraint functions to call during the optimization loop. Must be in {'convex', 'concave', 'monotonic_inc', 'monotonic_dec', 'circular', 'none'} If None, then the model will apply no constraints. If only one str or callable is specified, then is it copied for all features. dtype : str in {'auto', 'numerical', 'categorical'}, or list of str, default: 'auto' String describing the data-type of each feature. 'numerical' is used for continuous-valued data-types, like in regression. 'categorical' is used for discrete-valued data-types, like in classification. If only one str is specified, then is is copied for all features. lam : float or iterable of floats > 0, default: 0.6 Smoothing strength; must be a positive float, or one positive float per feature. Larger values enforce stronger smoothing. If only one float is specified, then it is copied for all features. fit_intercept : bool, default: True Specifies if a constant (a.k.a. bias or intercept) should be added to the decision function. NOTE: the intercept receives no smoothing penalty. fit_linear : bool or iterable of bools, default: False Specifies if a linear term should be added to any of the feature functions. Useful for including pre-defined feature transformations in the model. If only one bool is specified, then it is copied for all features. NOTE: Many constraints are incompatible with an additional linear fit. eg. if a non-zero linear function is added to a periodic spline function, it will cease to be periodic. this is also possible for a monotonic spline function. fit_splines : bool or iterable of bools, default: True Specifies if a smoother should be added to any of the feature functions. Useful for defining feature transformations a-priori that should not have splines fitted to them. If only one bool is specified, then it is copied for all features. NOTE: fit_splines supercedes n_splines. ie. if n_splines > 0 and fit_splines = False, no splines will be fitted. max_iter : int, default: 100 Maximum number of iterations allowed for the solver to converge. penalties : str or callable, or iterable of str or callable, default: 'auto' Type of penalty to use for each feature. penalty should be in {'auto', 'none', 'derivative', 'l2', } If 'auto', then the model will use 2nd derivative smoothing for features of dtype 'numerical', and L2 smoothing for features of dtype 'categorical'. If only one str or callable is specified, then is it copied for all features. n_splines : int, or iterable of ints, default: 25 Number of splines to use in each feature function; must be non-negative. If only one int is specified, then it is copied for all features. Note: this value is set to 0 if fit_splines is False spline_order : int, or iterable of ints, default: 3 Order of spline to use in each feature function; must be non-negative. If only one int is specified, then it is copied for all features Note: if a feature is of type categorical, spline_order will be set to 0. tol : float, default: 1e-4 Tolerance for stopping criteria. Attributes ---------- coef_ : array, shape (n_classes, m_features) Coefficient of the features in the decision function. If fit_intercept is True, then self.coef_[0] will contain the bias. statistics_ : dict Dictionary containing model statistics like GCV/UBRE scores, AIC/c, parameter covariances, estimated degrees of freedom, etc. logs_ : dict Dictionary containing the outputs of any callbacks at each optimization loop. The logs are structured as `{callback: [...]}` References ---------- Simon N. Wood, 2006 Generalized Additive Models: an introduction with R Hastie, Tibshirani, Friedman The Elements of Statistical Learning http://statweb.stanford.edu/~tibs/ElemStatLearn/printings/ESLII_print10.pdf Paul Eilers & Brian Marx, 2015 International Biometric Society: A Crash Course on P-splines http://www.ibschannel2015.nl/project/userfiles/Crash_course_handout.pdf """ def __init__(self, lam=0.6, max_iter=100, n_splines=25, spline_order=3, penalties='auto', dtype='auto', tol=1e-4, callbacks=['deviance', 'diffs', 'accuracy'], fit_intercept=True, fit_linear=False, fit_splines=True, constraints=None): # call super super(LogisticGAM, self).__init__(distribution='binomial', link='logit', lam=lam, dtype=dtype, max_iter=max_iter, n_splines=n_splines, spline_order=spline_order, penalties=penalties, tol=tol, callbacks=callbacks, fit_intercept=fit_intercept, fit_linear=fit_linear, fit_splines=fit_splines, constraints=constraints) # ignore any variables self._exclude += ['distribution', 'link'] def accuracy(self, X=None, y=None, mu=None): """ computes the accuracy of the LogisticGAM Parameters ---------- note: X or mu must be defined. defaults to mu X : array-like of shape (n_samples, m_features), default: None containing input data y : array-like of shape (n,) containing target data mu : array-like of shape (n_samples,), default: None expected value of the targets given the model and inputs Returns ------- float in [0, 1] """ if not self._is_fitted: raise AttributeError('GAM has not been fitted. Call fit first.') y = check_y(y, self.link, self.distribution) if X is not None: X = check_X(X, n_feats=len(self._n_coeffs) - self._fit_intercept, edge_knots=self._edge_knots, dtypes=self._dtype) if mu is None: mu = self.predict_mu(X) check_X_y(mu, y) return ((mu > 0.5).astype(int) == y).mean() def predict(self, X): """ preduct binary targets given model and input X Parameters --------- X : array-like of shape (n_samples, m_features), default: None containing the input dataset Returns ------- y : np.array of shape (n_samples,) containing binary targets under the model """ return self.predict_mu(X) > 0.5 def predict_proba(self, X): """ preduct targets given model and input X Parameters --------- X : array-like of shape (n_samples, m_features), default: None containing the input dataset Returns ------- y : np.array of shape (n_samples,) containing expected values under the model """ return self.predict_mu(X) class PoissonGAM(GAM): """Poisson GAM Parameters ---------- callbacks : list of strings or list of CallBack objects, default: ['deviance', 'diffs'] Names of callback objects to call during the optimization loop. constraints : str or callable, or iterable of str or callable, default: None Names of constraint functions to call during the optimization loop. Must be in {'convex', 'concave', 'monotonic_inc', 'monotonic_dec', 'circular', 'none'} If None, then the model will apply no constraints. If only one str or callable is specified, then is it copied for all features. dtype : str in {'auto', 'numerical', 'categorical'}, or list of str, default: 'auto' String describing the data-type of each feature. 'numerical' is used for continuous-valued data-types, like in regression. 'categorical' is used for discrete-valued data-types, like in classification. If only one str is specified, then is is copied for all features. lam : float or iterable of floats > 0, default: 0.6 Smoothing strength; must be a positive float, or one positive float per feature. Larger values enforce stronger smoothing. If only one float is specified, then it is copied for all features. fit_intercept : bool, default: True Specifies if a constant (a.k.a. bias or intercept) should be added to the decision function. NOTE: the intercept receives no smoothing penalty. fit_linear : bool or iterable of bools, default: False Specifies if a linear term should be added to any of the feature functions. Useful for including pre-defined feature transformations in the model. If only one bool is specified, then it is copied for all features. NOTE: Many constraints are incompatible with an additional linear fit. eg. if a non-zero linear function is added to a periodic spline function, it will cease to be periodic. this is also possible for a monotonic spline function. fit_splines : bool or iterable of bools, default: True Specifies if a smoother should be added to any of the feature functions. Useful for defining feature transformations a-priori that should not have splines fitted to them. If only one bool is specified, then it is copied for all features. NOTE: fit_splines supercedes n_splines. ie. if n_splines > 0 and fit_splines = False, no splines will be fitted. max_iter : int, default: 100 Maximum number of iterations allowed for the solver to converge. penalties : str or callable, or iterable of str or callable, default: 'auto' Type of penalty to use for each feature. penalty should be in {'auto', 'none', 'derivative', 'l2', } If 'auto', then the model will use 2nd derivative smoothing for features of dtype 'numerical', and L2 smoothing for features of dtype 'categorical'. If only one str or callable is specified, then is it copied for all features. n_splines : int, or iterable of ints, default: 25 Number of splines to use in each feature function; must be non-negative. If only one int is specified, then it is copied for all features. Note: this value is set to 0 if fit_splines is False spline_order : int, or iterable of ints, default: 3 Order of spline to use in each feature function; must be non-negative. If only one int is specified, then it is copied for all features Note: if a feature is of type categorical, spline_order will be set to 0. tol : float, default: 1e-4 Tolerance for stopping criteria. Attributes ---------- coef_ : array, shape (n_classes, m_features) Coefficient of the features in the decision function. If fit_intercept is True, then self.coef_[0] will contain the bias. statistics_ : dict Dictionary containing model statistics like GCV/UBRE scores, AIC/c, parameter covariances, estimated degrees of freedom, etc. logs_ : dict Dictionary containing the outputs of any callbacks at each optimization loop. The logs are structured as `{callback: [...]}` References ---------- Simon N. Wood, 2006 Generalized Additive Models: an introduction with R Hastie, Tibshirani, Friedman The Elements of Statistical Learning http://statweb.stanford.edu/~tibs/ElemStatLearn/printings/ESLII_print10.pdf Paul Eilers & Brian Marx, 2015 International Biometric Society: A Crash Course on P-splines http://www.ibschannel2015.nl/project/userfiles/Crash_course_handout.pdf """ def __init__(self, lam=0.6, max_iter=100, n_splines=25, spline_order=3, penalties='auto', dtype='auto', tol=1e-4, callbacks=['deviance', 'diffs', 'accuracy'], fit_intercept=True, fit_linear=False, fit_splines=True, constraints=None): # call super super(PoissonGAM, self).__init__(distribution='poisson', link='log', lam=lam, dtype=dtype, max_iter=max_iter, n_splines=n_splines, spline_order=spline_order, penalties=penalties, tol=tol, callbacks=callbacks, fit_intercept=fit_intercept, fit_linear=fit_linear, fit_splines=fit_splines, constraints=constraints) # ignore any variables self._exclude += ['distribution', 'link'] def _loglikelihood(self, y, mu, weights=None, rescale_y=True): """ compute the log-likelihood of the dataset using the current model Parameters --------- y : array-like of shape (n,) containing target values mu : array-like of shape (n_samples,) expected value of the targets given the model and inputs weights : array-like of shape (n,) containing sample weights rescale_y : boolean, defaul: True whether to scale the targets back up by Returns ------- log-likelihood : np.array of shape (n,) containing log-likelihood scores """ if weights is not None: weights = np.array(weights).astype('f') else: weights = np.ones_like(y).astype('f') if rescale_y: y = y * weights return np.log(self.distribution.pdf(y=y, mu=mu, weights=weights)).sum() def loglikelihood(self, X, y, exposure=None, weights=None): """ compute the log-likelihood of the dataset using the current model Parameters --------- X : array-like of shape (n_samples, m_features) containing the input dataset y : array-like of shape (n,) containing target values exposure : array-like shape (n_samples,) or None, default: None containing exposures if None, defaults to array of ones weights : array-like of shape (n,) containing sample weights Returns ------- log-likelihood : np.array of shape (n,) containing log-likelihood scores """ mu = self.predict_mu(X) y, weights = self._exposure_to_weights(y, exposure, weights) return self._loglikelihood(y, mu, weights=weights, rescale_y=True) def _exposure_to_weights(self, y, exposure=None, weights=None): """simple tool to create a common API Parameters ---------- y : array-like, shape (n_samples,) Target values (integers in classification, real numbers in regression) For classification, labels must correspond to classes. exposure : array-like shape (n_samples,) or None, default: None containing exposures if None, defaults to array of ones weights : array-like shape (n_samples,) or None, default: None containing sample weights if None, defaults to array of ones Returns ------- y : y normalized by exposure weights : array-like shape (n_samples,) """ if exposure is not None: exposure = np.array(exposure).astype('f') else: exposure = np.ones_like(y).astype('f') check_lengths(y, exposure) # normalize response y = y / exposure if weights is not None: weights = np.array(weights).astype('f') else: weights = np.ones_like(y).astype('f') check_lengths(weights, exposure) # set exposure as the weight weights = weights * exposure return y, weights def fit(self, X, y, exposure=None, weights=None): """Fit the generalized additive model. Parameters ---------- X : array-like, shape (n_samples, m_features) Training vectors, where n_samples is the number of samples and m_features is the number of features. y : array-like, shape (n_samples,) Target values (integers in classification, real numbers in regression) For classification, labels must correspond to classes. exposure : array-like shape (n_samples,) or None, default: None containing exposures if None, defaults to array of ones weights : array-like shape (n_samples,) or None, default: None containing sample weights if None, defaults to array of ones Returns ------- self : object Returns fitted GAM object """ y, weights = self._exposure_to_weights(y, exposure, weights) return super(PoissonGAM, self).fit(X, y, weights) def predict(self, X, exposure=None): """ preduct expected value of target given model and input X often this is done via expected value of GAM given input X Parameters --------- X : array-like of shape (n_samples, m_features), default: None containing the input dataset exposure : array-like shape (n_samples,) or None, default: None containing exposures if None, defaults to array of ones Returns ------- y : np.array of shape (n_samples,) containing predicted values under the model """ if not self._is_fitted: raise AttributeError('GAM has not been fitted. Call fit first.') X = check_X(X, n_feats=len(self._n_coeffs) - self._fit_intercept, edge_knots=self._edge_knots, dtypes=self._dtype) if exposure is not None: exposure = np.array(exposure).astype('f') else: exposure = np.ones(X.shape[0]).astype('f') check_lengths(X, exposure) return self.predict_mu(X) * exposure def gridsearch(self, X, y, exposure=None, weights=None, return_scores=False, keep_best=True, objective='auto', **param_grids): """ performs a grid search over a space of parameters for a given objective NOTE: gridsearch method is lazy and will not remove useless combinations from the search space, eg. n_splines=np.arange(5,10), fit_splines=[True, False] will result in 10 loops, of which 5 are equivalent because even though fit_splines==False it is not recommended to search over a grid that alternates between known scales and unknown scales, as the scores of the cadidate models will not be comparable. Parameters ---------- X : array input data of shape (n_samples, m_features) y : array label data of shape (n_samples,) exposure : array-like shape (n_samples,) or None, default: None containing exposures if None, defaults to array of ones weights : array-like shape (n_samples,) or None, default: None containing sample weights if None, defaults to array of ones return_scores : boolean, default False whether to return the hyperpamaters and score for each element in the grid keep_best : boolean whether to keep the best GAM as self. default: True objective : string, default: 'auto' metric to optimize. must be in ['AIC', 'AICc', 'GCV', 'UBRE', 'auto'] if 'auto', then grid search will optimize GCV for models with unknown scale and UBRE for models with known scale. **kwargs : dict, default {'lam': np.logspace(-3, 3, 11)} pairs of parameters and iterables of floats, or parameters and iterables of iterables of floats. if iterable of iterables of floats, the outer iterable must have length m_features. the method will make a grid of all the combinations of the parameters and fit a GAM to each combination. Returns ------- if return_values == True: model_scores : dict Contains each fitted model as keys and corresponding objective scores as values else: self, ie possibly the newly fitted model """ y, weights = self._exposure_to_weights(y, exposure, weights) return super(PoissonGAM, self).gridsearch(X, y, weights=weights, return_scores=return_scores, keep_best=keep_best, objective=objective, **param_grids) class GammaGAM(GAM): """Gamma GAM Parameters ---------- callbacks : list of strings or list of CallBack objects, default: ['deviance', 'diffs'] Names of callback objects to call during the optimization loop. constraints : str or callable, or iterable of str or callable, default: None Names of constraint functions to call during the optimization loop. Must be in {'convex', 'concave', 'monotonic_inc', 'monotonic_dec', 'circular', 'none'} If None, then the model will apply no constraints. If only one str or callable is specified, then is it copied for all features. dtype : str in {'auto', 'numerical', 'categorical'}, or list of str, default: 'auto' String describing the data-type of each feature. 'numerical' is used for continuous-valued data-types, like in regression. 'categorical' is used for discrete-valued data-types, like in classification. If only one str is specified, then is is copied for all features. lam : float or iterable of floats > 0, default: 0.6 Smoothing strength; must be a positive float, or one positive float per feature. Larger values enforce stronger smoothing. If only one float is specified, then it is copied for all features. fit_intercept : bool, default: True Specifies if a constant (a.k.a. bias or intercept) should be added to the decision function. NOTE: the intercept receives no smoothing penalty. fit_linear : bool or iterable of bools, default: False Specifies if a linear term should be added to any of the feature functions. Useful for including pre-defined feature transformations in the model. If only one bool is specified, then it is copied for all features. NOTE: Many constraints are incompatible with an additional linear fit. eg. if a non-zero linear function is added to a periodic spline function, it will cease to be periodic. this is also possible for a monotonic spline function. fit_splines : bool or iterable of bools, default: True Specifies if a smoother should be added to any of the feature functions. Useful for defining feature transformations a-priori that should not have splines fitted to them. If only one bool is specified, then it is copied for all features. NOTE: fit_splines supercedes n_splines. ie. if n_splines > 0 and fit_splines = False, no splines will be fitted. max_iter : int, default: 100 Maximum number of iterations allowed for the solver to converge. penalties : str or callable, or iterable of str or callable, default: 'auto' Type of penalty to use for each feature. penalty should be in {'auto', 'none', 'derivative', 'l2', } If 'auto', then the model will use 2nd derivative smoothing for features of dtype 'numerical', and L2 smoothing for features of dtype 'categorical'. If only one str or callable is specified, then is it copied for all features. n_splines : int, or iterable of ints, default: 25 Number of splines to use in each feature function; must be non-negative. If only one int is specified, then it is copied for all features. Note: this value is set to 0 if fit_splines is False scale : float or None, default: None scale of the distribution, if known a-priori. if None, scale is estimated. spline_order : int, or iterable of ints, default: 3 Order of spline to use in each feature function; must be non-negative. If only one int is specified, then it is copied for all features Note: if a feature is of type categorical, spline_order will be set to 0. tol : float, default: 1e-4 Tolerance for stopping criteria. Attributes ---------- coef_ : array, shape (n_classes, m_features) Coefficient of the features in the decision function. If fit_intercept is True, then self.coef_[0] will contain the bias. statistics_ : dict Dictionary containing model statistics like GCV/UBRE scores, AIC/c, parameter covariances, estimated degrees of freedom, etc. logs_ : dict Dictionary containing the outputs of any callbacks at each optimization loop. The logs are structured as `{callback: [...]}` References ---------- Simon N. Wood, 2006 Generalized Additive Models: an introduction with R Hastie, Tibshirani, Friedman The Elements of Statistical Learning http://statweb.stanford.edu/~tibs/ElemStatLearn/printings/ESLII_print10.pdf Paul Eilers & Brian Marx, 2015 International Biometric Society: A Crash Course on P-splines http://www.ibschannel2015.nl/project/userfiles/Crash_course_handout.pdf """ def __init__(self, lam=0.6, max_iter=100, n_splines=25, spline_order=3, penalties='auto', dtype='auto', tol=1e-4, scale=None, callbacks=['deviance', 'diffs'], fit_intercept=True, fit_linear=False, fit_splines=True, constraints=None): self.scale = scale super(GammaGAM, self).__init__(distribution=GammaDist(scale=self.scale), link='inverse', lam=lam, dtype=dtype, max_iter=max_iter, n_splines=n_splines, spline_order=spline_order, penalties=penalties, tol=tol, callbacks=callbacks, fit_intercept=fit_intercept, fit_linear=fit_linear, fit_splines=fit_splines, constraints=constraints) self._exclude += ['distribution', 'link'] def _validate_params(self): """ method to sanitize model parameters Parameters --------- None Returns ------- None """ self.distribution = GammaDist(scale=self.scale) super(GammaGAM, self)._validate_params() class InvGaussGAM(GAM): """Inverse Gaussian GAM Parameters ---------- callbacks : list of strings or list of CallBack objects, default: ['deviance', 'diffs'] Names of callback objects to call during the optimization loop. constraints : str or callable, or iterable of str or callable, default: None Names of constraint functions to call during the optimization loop. Must be in {'convex', 'concave', 'monotonic_inc', 'monotonic_dec', 'circular', 'none'} If None, then the model will apply no constraints. If only one str or callable is specified, then is it copied for all features. dtype : str in {'auto', 'numerical', 'categorical'}, or list of str, default: 'auto' String describing the data-type of each feature. 'numerical' is used for continuous-valued data-types, like in regression. 'categorical' is used for discrete-valued data-types, like in classification. If only one str is specified, then is is copied for all features. lam : float or iterable of floats > 0, default: 0.6 Smoothing strength; must be a positive float, or one positive float per feature. Larger values enforce stronger smoothing. If only one float is specified, then it is copied for all features. fit_intercept : bool, default: True Specifies if a constant (a.k.a. bias or intercept) should be added to the decision function. NOTE: the intercept receives no smoothing penalty. fit_linear : bool or iterable of bools, default: False Specifies if a linear term should be added to any of the feature functions. Useful for including pre-defined feature transformations in the model. If only one bool is specified, then it is copied for all features. NOTE: Many constraints are incompatible with an additional linear fit. eg. if a non-zero linear function is added to a periodic spline function, it will cease to be periodic. this is also possible for a monotonic spline function. fit_splines : bool or iterable of bools, default: True Specifies if a smoother should be added to any of the feature functions. Useful for defining feature transformations a-priori that should not have splines fitted to them. If only one bool is specified, then it is copied for all features. NOTE: fit_splines supercedes n_splines. ie. if n_splines > 0 and fit_splines = False, no splines will be fitted. max_iter : int, default: 100 Maximum number of iterations allowed for the solver to converge. penalties : str or callable, or iterable of str or callable, default: 'auto' Type of penalty to use for each feature. penalty should be in {'auto', 'none', 'derivative', 'l2', } If 'auto', then the model will use 2nd derivative smoothing for features of dtype 'numerical', and L2 smoothing for features of dtype 'categorical'. If only one str or callable is specified, then is it copied for all features. n_splines : int, or iterable of ints, default: 25 Number of splines to use in each feature function; must be non-negative. If only one int is specified, then it is copied for all features. Note: this value is set to 0 if fit_splines is False scale : float or None, default: None scale of the distribution, if known a-priori. if None, scale is estimated. spline_order : int, or iterable of ints, default: 3 Order of spline to use in each feature function; must be non-negative. If only one int is specified, then it is copied for all features Note: if a feature is of type categorical, spline_order will be set to 0. tol : float, default: 1e-4 Tolerance for stopping criteria. Attributes ---------- coef_ : array, shape (n_classes, m_features) Coefficient of the features in the decision function. If fit_intercept is True, then self.coef_[0] will contain the bias. statistics_ : dict Dictionary containing model statistics like GCV/UBRE scores, AIC/c, parameter covariances, estimated degrees of freedom, etc. logs_ : dict Dictionary containing the outputs of any callbacks at each optimization loop. The logs are structured as `{callback: [...]}` References ---------- Simon N. Wood, 2006 Generalized Additive Models: an introduction with R Hastie, Tibshirani, Friedman The Elements of Statistical Learning http://statweb.stanford.edu/~tibs/ElemStatLearn/printings/ESLII_print10.pdf Paul Eilers & Brian Marx, 2015 International Biometric Society: A Crash Course on P-splines http://www.ibschannel2015.nl/project/userfiles/Crash_course_handout.pdf """ def __init__(self, lam=0.6, max_iter=100, n_splines=25, spline_order=3, penalties='auto', dtype='auto', tol=1e-4, scale=None, callbacks=['deviance', 'diffs'], fit_intercept=True, fit_linear=False, fit_splines=True, constraints=None): self.scale = scale super(InvGaussGAM, self).__init__(distribution=InvGaussDist(scale=self.scale), link='inv_squared', lam=lam, dtype=dtype, max_iter=max_iter, n_splines=n_splines, spline_order=spline_order, penalties=penalties, tol=tol, callbacks=callbacks, fit_intercept=fit_intercept, fit_linear=fit_linear, fit_splines=fit_splines, constraints=constraints) self._exclude += ['distribution', 'link'] def _validate_params(self): """ method to sanitize model parameters Parameters --------- None Returns ------- None """ self.distribution = InvGaussDist(scale=self.scale) super(InvGaussGAM, self)._validate_params() PK,J.Ku3VRRpygam/utils.py""" Pygam utilities """ from __future__ import division from copy import deepcopy import warnings import scipy as sp from scipy import sparse import numpy as np from numpy.linalg import LinAlgError try: from sksparse.cholmod import cholesky as spcholesky from sksparse.test_cholmod import CholmodNotPositiveDefiniteError SKSPIMPORT = True except ImportError: SKSPIMPORT = False class NotPositiveDefiniteError(ValueError): """Exception class to raise if a matrix is not positive definite """ def cholesky(A, sparse=True): """ Choose the best possible cholesky factorizor. if possible, import the Scikit-Sparse sparse Cholesky method. Permutes the output L to ensure A = L . L.H otherwise defaults to numpy's non-sparse version Parameters ---------- A : array-like array to decompose sparse : boolean, default: True whether to return a sparse array """ if SKSPIMPORT: A = sp.sparse.csc_matrix(A) F = spcholesky(A) # permutation matrix P P = sp.sparse.lil_matrix(A.shape) p = F.P() P[np.arange(len(p)), p] = 1 # permute try: L = F.L() L = P.T.dot(L) except CholmodNotPositiveDefiniteError as e: raise NotPositiveDefiniteError('Matrix is not positive definite') if sparse: return L return L.todense() else: msg = 'Could not import Scikit-Sparse or Suite-Sparse.\n'\ 'This will slow down optimization for models with '\ 'monotonicity/convexity penalties and many splines.\n'\ 'See installation instructions for installing '\ 'Scikit-Sparse and Suite-Sparse via Conda.' warnings.warn(msg) if sp.sparse.issparse(A): A = A.todense() try: L = np.linalg.cholesky(A) except LinAlgError as e: raise NotPositiveDefiniteError('Matrix is not positive definite') if sparse: return sp.sparse.csc_matrix(L) return L def generate_X_grid(gam, n=500): """ tool to create a nice grid of X data if no X data is supplied array is sorted by feature and uniformly spaced, so the marginal and joint distributions are likely wrong Parameters ---------- gam : GAM instance n : int, default: 500 number of data points to create Returns ------- np.array of shape (n, n_features) """ X = [] for ek in gam._edge_knots: X.append(np.linspace(ek[0], ek[-1], num=n)) return np.vstack(X).T def check_dtype(X, ratio=.95): """ tool to identify the data-types of the features in data matrix X. checks for float and int data-types. Parameters ---------- X : array of shape (n_samples, n_features) ratio : float in [0, 1], default: 0.95 minimum ratio of unique values to samples before a feature is considered categorical. Returns ------- dtypes : list of types of length n_features """ if X.ndim == 1: X = X[:,None] dtypes = [] for feat in X.T: dtype = feat.dtype.kind if dtype not in ['f', 'i']: raise ValueError('Data must be type int or float, '\ 'but found type: {}'.format(feat.dtype)) if dtype == 'f': if not(np.isfinite(feat).all()): raise ValueError('Data must not contain Inf nor NaN') # if issubclass(dtype, np.int) or \ # (len(np.unique(feat))/len(feat) < ratio): if (len(np.unique(feat))/len(feat) < ratio) and \ ((np.min(feat)) == 0) and (np.max(feat) == len(np.unique(feat)) - 1): dtypes.append('categorical') continue dtypes.append('numerical') return dtypes def check_y(y, link, dist, min_samples=1): """ tool to ensure that the targets: - are in the domain of the link function - are numerical - have at least min_samples Parameters ---------- y : array-like link : Link object dist : Distribution object min_samples : int, default: 1 Returns ------- y : array containing validated y-data """ y = np.ravel(y) if y.dtype.kind not in['f', 'i']: try: y = y.astype('float') except ValueError as e: raise ValueError("Targets must be type int or float, "\ "but found {}".format(y)) warnings.filterwarnings('ignore', 'divide by zero encountered in log') if np.any(np.isnan(link.link(y, dist))): raise ValueError('y data is not in domain of {} link function. ' \ 'Expected domain: {}, but found {}' \ .format(link, get_link_domain(link, dist), [float('%.2f'%np.min(y)), float('%.2f'%np.max(y))])) warnings.resetwarnings() if len(y) < min_samples: raise ValueError('targets should have at least {} samples, '\ 'but found {}'.format(min_samples, len(y))) if not(np.isfinite(y).all()): raise ValueError('y data must not contain Inf nor NaN') return y def make_2d(array): """ tiny tool to expand 1D arrays the way i want Parameters ---------- array : array-like Returns ------- np.array of with ndim = 2 """ array = np.asarray(array) if array.ndim < 2: msg = 'Expected 2D input data array, but found {}D. '\ 'Expanding to 2D.'.format(array.ndim) warnings.warn(msg) array = np.atleast_1d(array)[:,None] return array def check_X(X, n_feats=None, min_samples=1, edge_knots=None, dtypes=None): """ tool to ensure that X: - is 2 dimensional - contains float-compatible data-types - has at least min_samples - has n_feats - has caegorical features in the right range Parameters ---------- X : array-like n_feats : int. default: None represents number of features that X should have. not enforced if n_feats is None. min_samples : int, default: 1 edge_knots : list of arrays, default: None dtypes : list of strings, default: None Returns ------- X : array with ndims == 2 containing validated X-data """ X = make_2d(X) if X.ndim > 2: raise ValueError('X must be a matrix or vector. '\ 'found shape {}'.format(X.shape)) n, m = X.shape if n_feats is not None: if m != n_feats: raise ValueError('X data must have {} features, '\ 'but found {}'.format(n_feats, m)) dtype = X.dtype if dtype.kind not in ['i', 'f']: try: X = X.astype('float') except ValueError as e: raise ValueError('X data must be type int or float, '\ 'but found type: {}\n'\ 'Try transforming data with a LabelEncoder first.'\ .format(dtype.type)) if n < min_samples: raise ValueError('X data should have at least {} samples, '\ 'but found {}'.format(min_samples, n)) if (edge_knots is not None) and (dtypes is not None): for i, (dt, ek, feat) in enumerate(zip(dtypes, edge_knots, X.T)): if dt == 'categorical': min_ = ek[0] max_ = ek[-1] if (np.unique(feat) < min_).any() or \ (np.unique(feat) > max_).any(): min_ += .5 max_ -= 0.5 feat_min = feat.min() feat_max = feat.max() raise ValueError('X data is out of domain for categorical '\ 'feature {}. Expected data in [{}, {}], '\ 'but found data in [{}, {}]'\ .format(i, min_, max_, feat_min, feat_max)) return X def check_X_y(X, y): """ tool to ensure input and output data have the same number of samples Parameters ---------- X : array-like y : array-like Returns ------- None """ if len(X) != len(y): raise ValueError('Inconsistent input and output data shapes. '\ 'found X: {} and y: {}'.format(X.shape, y.shape)) def check_lengths(*arrays): """ tool to ensure input and output data have the same number of samples Parameters ---------- *arrays : iterable of arrays to be checked Returns ------- None """ lengths = [len(array) for array in arrays] if len(np.unique(lengths)) > 1: raise ValueError('Inconsistent data lengths: {}'.format(lengths)) def check_param(param, param_name, dtype, iterable=True, constraint=None): """ checks the dtype of a parameter, and whether it satisfies a numerical contraint Parameters --------- param : object param_name : str, name of the parameter dtype : str, desired dtype of the parameter iterable : bool, default: True whether to allow iterable param contraint : str, default: None numerical constraint of the parameter. if None, no constraint is enforced Returns ------- list of validated and converted parameter(s) """ msg = [] msg.append(param_name + " must be "+ dtype) if iterable: msg.append(" or iterable of " + dtype + "s") msg.append(", but found " + param_name + " = {}".format(repr(param))) if constraint is not None: msg = (" " + constraint).join(msg) else: msg = ''.join(msg) # check param is numerical try: param_dt = np.array(param).astype(dtype) except ValueError: raise ValueError(msg) # check iterable if (not iterable) and (param_dt.size != 1): raise ValueError(msg) # check param is correct dtype if not (param_dt == np.array(param).astype(float)).all(): raise ValueError(msg) # check constraint if constraint is not None: if not (eval('np.' + repr(param_dt) + constraint)).all(): raise ValueError(msg) return param_dt.tolist() def get_link_domain(link, dist): """ tool to identify the domain of a given monotonic link function Parameters ---------- link : Link object dist : Distribution object Returns ------- domain : list of length 2, representing the interval of the domain. """ domain = np.array([-np.inf, -1, 0, 1, np.inf]) domain = domain[~np.isnan(link.link(domain, dist))] return [domain[0], domain[-1]] def round_to_n_decimal_places(array, n=3): """ tool to keep round a float to n decimal places. n=3 by default Parameters ---------- array : np.array n : int. number of decimal places to keep Returns ------- array : rounded np.array """ # check if in scientific notation if issubclass(array.__class__, float) and '%.e'%array == str(array): return array # do nothing shape = np.shape(array) out = ((np.atleast_1d(array) * 10**n).round().astype('int') / (10.**n)) return out.reshape(shape) def print_data(data_dict, width=-5, keep_decimals=3, fill=' ', title=None): """ tool to print a dictionary with a nice formatting Parameters: ----------- data_dict: dict. Dictionary to be printed. width: int. Desired total line width. A negative value will fill to minimum required width + neg(width) default: -5 keep_decimals: int. number of decimal places to keep: default: 3 fill: string. the character to fill between keys and values. Must have length 1. default: ' ' title: string. default: None Returns ------- None """ # find max length keys = np.array(list(data_dict.keys()), dtype='str') values = np.array(list(data_dict.values())) values = round_to_n_decimal_places(values).astype('str') M = max([len(k + v) for k, v in zip(keys, values)]) if width < 0: # this is for a dynamic filling. # fill to minimum required width + neg(width) width = M - width if M >= width: raise ValueError('desired width is {}, '\ 'but max data length is {}'.format(width, M)) fill = str(fill) assert len(fill) == 1, 'fill must contain exactly one symbol' if title is not None: print(title) print('-' * width) for k, v in zip(keys, values): nk = len(k) nv = len(v) filler = fill*(width - nk - nv) print(k + filler + v) def gen_edge_knots(data, dtype): """ generate uniform knots from data including the edges of the data for discrete data, assumes k categories in [0, k-1] interval Parameters ---------- data : array-like with one dimension dtype : str in {'categorical', 'numerical'} Returns ------- np.array containing ordered knots """ if dtype not in ['categorical', 'numerical']: raise ValueError('unsupported dtype: {}'.format(dtype)) if dtype == 'categorical': return np.r_[np.min(data) - 0.5, np.unique(data) + 0.5] else: knots = np.r_[np.min(data), np.max(data)] if knots[0] == knots[1]: warnings.warn('Data contains constant feature. '\ 'Consider removing and setting fit_intercept=True', stacklevel=2) return knots def b_spline_basis(x, edge_knots, n_splines=20, spline_order=3, sparse=True, clamped=False): """ tool to generate b-spline basis using vectorized De Boor recursion the basis functions extrapolate linearly past the end-knots. Parameters ---------- x : array-like, with ndims == 1. edge_knots : array-like contaning locations of the 2 edge knots. n_splines : int. number of splines to generate. must be >= spline_order+1 default: 20 spline_order : int. order of spline basis to create default: 3 sparse : boolean. whether to return a sparse basis matrix or not. default: True clamped : boolean, default: False whether to force repeated knots at the ends of the domain. NOTE: when Flase this results in interpretable basis functions where creating a linearly incrasing function ammounts to assigning linearly increasing coefficients. when clamped, this is no longer true and constraints that depend on this property, like monotonicity and convexity are no longer valid. Returns ------- basis : sparse csc matrix or array containing b-spline basis functions with shape (len(x), n_splines) """ if np.ravel(x).ndim != 1: raise ValueError('Data must be 1-D, but found {}'\ .format(np.ravel(x).ndim)) if (n_splines < 1) or (type(n_splines) is not int): raise ValueError('n_splines must be int >= 1') if (spline_order < 0) or (type(spline_order) is not int): raise ValueError('spline_order must be int >= 1') if n_splines < spline_order + 1: raise ValueError('n_splines must be >= spline_order + 1. '\ 'found: n_splines = {} and spline_order = {}'\ .format(n_splines, spline_order)) if n_splines == 0: warnings.warn('Requested 1 spline. This is equivalent to '\ 'fitting an intercept', stacklevel=2) # rescale edge_knots to [0,1], and generate boundary knots edge_knots = np.sort(deepcopy(edge_knots)) offset = edge_knots[0] scale = edge_knots[-1] - edge_knots[0] if scale == 0: scale = 1 boundary_knots = np.linspace(0, 1, 1 + n_splines - spline_order) diff = np.diff(boundary_knots[:2])[0] # rescale x as well x = (np.ravel(deepcopy(x)) - offset) / scale # append 0 and 1 in order to get derivatives for extrapolation x = np.r_[x, 0., 1.] # determine extrapolation indices x_extrapolte_l = (x < 0) x_extrapolte_r = (x > 1) x_interpolate = ~(x_extrapolte_r + x_extrapolte_l) # formatting x = np.atleast_2d(x).T n = len(x) # augment knots if clamped: aug_knots = np.r_[np.zeros(spline_order), boundary_knots, np.ones(spline_order)] else: aug = np.arange(1, spline_order + 1) * diff aug_knots = np.r_[-aug[::-1], boundary_knots, 1 + aug] aug_knots[-1] += 1e-9 # want last knot inclusive # prepare Haar Basis bases = (x >= aug_knots[:-1]).astype(np.int) * \ (x < aug_knots[1:]).astype(np.int) bases[-1] = bases[-2][::-1] # force symmetric bases at 0 and 1 # do recursion from Hastie et al. vectorized maxi = len(aug_knots) - 1 for m in range(2, spline_order + 2): maxi -= 1 # bookkeeping to avoid div by 0 mask_l = aug_knots[m - 1 : maxi + m - 1] != aug_knots[:maxi] mask_r = aug_knots[m : maxi + m] != aug_knots[1 : maxi + 1] # left sub-basis num = (x - aug_knots[:maxi][mask_l]) * bases[:, :maxi][:, mask_l] denom = aug_knots[m-1 : maxi+m-1][mask_l] - aug_knots[:maxi][mask_l] left = np.zeros((n, maxi)) left[:, mask_l] = num/denom # right sub-basis num = (aug_knots[m : maxi+m][mask_r]-x) * bases[:, 1:maxi+1][:, mask_r] denom = aug_knots[m:maxi+m][mask_r] - aug_knots[1 : maxi+1][mask_r] right = np.zeros((n, maxi)) right[:, mask_r] = num/denom # track previous bases and update prev_bases = bases[-2:] bases = left + right # extrapolate # since we have repeated end-knots, only the last 2 basis functions are # non-zero at the end-knots, and they have equal and opposite gradient. if (any(x_extrapolte_r) or any(x_extrapolte_l)) and spline_order>0: bases[~x_interpolate] = 0. if not clamped: denom = (aug_knots[spline_order:-1] - aug_knots[: -spline_order - 1]) left = prev_bases[:, :-1] / denom denom = (aug_knots[spline_order+1:] - aug_knots[1: -spline_order]) right = prev_bases[:, 1:] / denom grads = (spline_order) * (left - right) if any(x_extrapolte_l): val = grads[0] * x[x_extrapolte_l] + bases[-2] bases[x_extrapolte_l] = val if any(x_extrapolte_r): val = grads[1] * (x[x_extrapolte_r] - 1) + bases[-1] bases[x_extrapolte_r] = val else: grad = -spline_order/diff if any(x_extrapolte_l): bases[x_extrapolte_l, :1] = grad * x[x_extrapolte_l] + 1 bases[x_extrapolte_l, 1:2] = -grad * x[x_extrapolte_l] if any(x_extrapolte_r): bases[x_extrapolte_r, -1:] = -grad * (x[x_extrapolte_r] - 1) + 1 bases[x_extrapolte_r, -2:-1] = grad * (x[x_extrapolte_r] - 1) # get rid of the added values at 0, and 1 bases = bases[:-2] if sparse: return sp.sparse.csc_matrix(bases) return bases def ylogydu(y, u): """ tool to give desired output for the limit as y -> 0, which is 0 Parameters ---------- y : array-like of len(n) u : array-like of len(n) Returns ------- np.array len(n) """ mask = (np.atleast_1d(y)!=0.) out = np.zeros_like(u) out[mask] = y[mask] * np.log(y[mask] / u[mask]) return out def combine(*args): """ tool to perform tree search via recursion useful for developing the grid in a grid search Parameters ---------- args : list of lists Returns ------- list of all the combinations of the elements in the input lists """ if hasattr(args, '__iter__') and (len(args) > 1): subtree = combine(*args[:-1]) tree = [] for leaf in subtree: for node in args[-1]: if hasattr(leaf, '__iter__'): tree.append(leaf + [node]) else: tree.append([leaf] + [node]) return tree else: return [[arg] for arg in args[0]] def isiterable(obj, reject_string=True): """ convenience tool to detect if something is iterable. in python3, strings count as iterables to we have the option to exclude them Parameters: ----------- obj : object to analyse reject_string : bool, whether to ignore strings Returns: -------- bool, if the object is itereable. """ iterable = hasattr(obj, '__iter__') if reject_string: iterable *= not isinstance(obj, str) return iterable PK fJ pygam/.cache/v/cache/lastfailed{ "tests/test_GAM_methods.py::test_LinearGAM_pdeps_shape": true, "tests/test_GAM_methods.py::test_LinearGAM_prediction": true, "tests/test_GAM_methods.py::test_LogisticGAM_accuracy": true, "tests/test_GAM_methods.py::test_conf_intervals_ordered": true, "tests/test_GAM_methods.py::test_conf_intervals_quantiles_width_interchangable": true, "tests/test_GAM_methods.py::test_conf_intervals_return_array": true, "tests/test_GAM_methods.py::test_deviance_residuals": true, "tests/test_GAM_methods.py::test_is_fitted_conf_intervals": true, "tests/test_GAM_methods.py::test_is_fitted_dev_resid": true, "tests/test_GAM_methods.py::test_is_fitted_pdep": true, "tests/test_GAM_methods.py::test_is_fitted_predict": true, "tests/test_GAM_methods.py::test_is_fitted_predict_mu": true, "tests/test_GAM_methods.py::test_is_fitted_summary": true, "tests/test_GAM_methods.py::test_more_splines_than_samples": true, "tests/test_GAM_methods.py::test_partial_dependence_feature_doesnt_exist": true, "tests/test_GAM_methods.py::test_partial_dependence_on_univar_data": true, "tests/test_GAM_methods.py::test_partial_dependence_on_univar_data2": true, "tests/test_GAM_methods.py::test_summary": true, "tests/test_GAM_methods.py::test_summary_returns_12_lines": true, "tests/test_GAM_params.py::test_compute_stats_even_if_not_enough_iters": true, "tests/test_GAM_params.py::test_expand_params": true, "tests/test_GAM_params.py::test_lam_non_neg_array_like": true, "tests/test_GAM_params.py::test_line_or_spline": true, "tests/test_GAM_params.py::test_linear_regression": true, "tests/test_GAM_params.py::test_penalties_must_be_or_contain_callable_or_auto": true, "tests/test_GAM_params.py::test_wrong_length_param": true, "tests/test_GAMs.py::test_CustomGAM": true, "tests/test_GAMs.py::test_GammaGAM": true, "tests/test_GAMs.py::test_InvGaussGAM": true, "tests/test_GAMs.py::test_LinearGAM_multi": true, "tests/test_GAMs.py::test_LinearGAM_uni": true, "tests/test_GAMs.py::test_LogisticGAM": true, "tests/test_GAMs.py::test_PoissonGAM": true, "tests/test_gridsearch.py::test_GCV_objective_is_for_unknown_scale": true, "tests/test_gridsearch.py::test_UBRE_objective_is_for_known_scale": true, "tests/test_gridsearch.py::test_gridsearch_all_dimensions_independent": true, "tests/test_gridsearch.py::test_gridsearch_all_dimensions_same": true, "tests/test_gridsearch.py::test_gridsearch_improves_objective": true, "tests/test_gridsearch.py::test_gridsearch_keep_best": true, "tests/test_gridsearch.py::test_gridsearch_returns_extra_score_if_fitted": true, "tests/test_gridsearch.py::test_gridsearch_returns_scores": true, "tests/test_gridsearch.py::test_no_models_fitted": true, "tests/test_penalties.py::test_concave": true, "tests/test_penalties.py::test_convex": true, "tests/test_penalties.py::test_monotonic_dec": true, "tests/test_penalties.py::test_monotonic_inc": true }PKgJ /pygam/.ipynb_checkpoints/pyGAM-checkpoint.ipynb{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Data Examples" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from pygam import GAM\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nrkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "x = np.linspace(-5,5,5000)[:,None]\n", "obs = -.5*x**2 + 5 + 3*np.random.randn(len(x),1)\n", "plt.plot(x, obs)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "GAM(lam=0.6, n_iter=100, n_knots=20, spline_order=1, \n", " callbacks=[Deviance(), Diffs()], link=IdentityLink(), tol=1e-05, \n", " penalty_matrix='auto', distribution=NormalDist(scale=9.083))" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "gam = GAM(spline_order=1)\n", "gam.fit(x, obs)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Model Statistics\n", "------------------\n", "edof 20.9\n", "AIC 25244.084\n", "AICc 25244.285\n", "GCV 1.085\n", "\n", "Pseudo-R^2\n", "----------------------\n", "mcfadden 0.23\n", "mcfadden_adj 0.228\n", "cox_snell 0.778\n", "nagelkerke 0.779\n" ] } ], "source": [ "gam.summary()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nYsBAREREjv4fiSR8jYvDzFQAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(x, obs)\n", "plt.plot(x, gam.predict(x))" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0.96540000000000004" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a, b = (gam.prediction_intervals(x, width=.95).T)\n", "((obs.ravel() > a) * (obs.ravel() < b)).mean()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[,\n", " ]" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nfubWzjH9GXEAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(x, obs)\n", "plt.plot(x, gam.prediction_intervals(x), color='g')" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[,\n", " ]" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgwAAAFkCAYAAABMyWOlAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzt3XecFOX9B/DPc4UuvRdFRKSIhQNFQ0mCERU1BH+Ws0YT\no4kmQmJBE7uxEBVFJcauKIfGFjvYEcXGiYICooAU6eWQftw9vz+eHbbczE57puzu5/163WtvZ2ee\neW5v95nvPFVIKUFERESUTVHUGSAiIqL4Y8BAREREthgwEBERkS0GDERERGSLAQMRERHZYsBARERE\nthgwEBERkS0GDERERGSLAQMRERHZYsBAREREtgINGIQQVwohPhVCbBZCrBZCvCCE6JGxT30hxH1C\niHVCiJ+EEM8KIdoGmS8iIiJyJ+gahsEA7gFwOICjAJQCmCaEaJiyz10ARgA4CcAQAB0BPBdwvoiI\niMgFEebiU0KI1gDWABgipZwhhGgKYC2A06SULyT2OQDAPAADpZSfhpY5IiIishR2H4bmACSADYnn\nZQBKALxt7CClXABgKYAjQs4bERERWSgJ60RCCAHV/DBDSvlNYnN7ALuklJszdl+deM0snVYAhgNY\nAmBHMLklIiLKSw0AdAUwVUq53s2BoQUMACYC6A1gkIN9BVRNhJnhAJ7SlSkiIqICdAaAyW4OCCVg\nEELcC+A4AIOllD+mvLQKQD0hRNOMWoa2ULUMZpYAwJNPPolevXoFkd28NGbMGIwfPz7qbOQcvm/u\n8T3zhu+be3zP3Js3bx7OPPNMIHEtdSPwgCERLPwawFAp5dKMl2cB2A1gGACj02MPAHsDmGmR5A4A\n6NWrF/r16xdInvNRs2bN+H55wPfNPb5n3vB9c4/vmS+um/QDDRiEEBMBlAM4EcBWIUS7xEtVUsod\nUsrNQoiHAdwphNgI4CcAEwB8yBESRERE8RF0DcOFUH0R3svYfi6AJxK/jwFQA+BZAPUBvAHgooDz\nRURERC4EGjBIKW2HbUopdwL4c+KHiIiIYohrSRSI8vLyqLOQk/i+ucf3zBu+b+7xPQtXqDM96iCE\n6Adg1qxZs9jZhYiIyIXKykqUlZUBQJmUstLNsaxhICIiIlsMGIiIiMgWAwYiIiKyxYCBiIiIbDFg\nICIiIlsMGIiIiMgWAwYiIiKyxYCBiIiIbDFgICIiIlsMGIiIiMgWAwYiIiKyxYCBiIiIbDFgICIi\nIlsMGIiIiMgWAwYiIiKyxYCBiIiIbDFgICIiIlsMGIiIiMgWAwYiIiKyxYCBiIiIbDFgICIiIlsM\nGIiIiMgWAwaiAjF7NrB6ddS5IKJcxYCBqEAceihQVhZ1LogoVzFgICogK1ZEnQMiylUMGIiIiMhW\noAGDEGKwEOIlIcQKIUStEOLEjNcfTWxP/XktyDwRERGRe0HXMDQGMBvARQCkxT6vA2gHoH3ipzzg\nPBEREZFLJUEmLqV8A8AbACCEEBa77ZRSrg0yH0RERORPHPow/FwIsVoIMV8IMVEI0TLqDBEREVG6\nQGsYHHgdwHMAFgPYD8AtAF4TQhwhpbRqwiAiIqKQRRowSCmfSXn6tRBiDoDvAfwcwLvZjh0zZgya\nNWuWtq28vBzl5ewCQUREVFFRgYqKirRtVVVVntMTYd3ICyFqAYyUUr5ks98aAH+XUj5o8Xo/ALNm\nzZqFfv36BZBTynWTJgFnnw3U1gKWPWcKkPFesO6OqHBVVlaiTM3gVialrHRzbBz6MOwhhOgMoBWA\nlVHnhXLX/fdHnQMiovwTaJOEEKIxgO4AjPu8bkKIgwFsSPxcC9WHYVViv9sAfAtgapD5IiIiIneC\n7sPQH6ovgkz83JHY/jiAPwE4CMDZAJoD+BEqULhGSlkdcL6IiIjIhaDnYXgf2Zs9jgny/FTYpGQf\nBiIiXWLVh4GIiIjiiQEDERER2WLAQERERLYYMBAREZEtBgyUtzhBERGRPgwYiIiIyBYDBiIiIrLF\ngIGIiIhsMWCgvMU+DBSGCROAdeuizgVR8BgwEBF5tHYtcMklwEUXRZ0TouAxYCCiPTZsAG67jbUz\nTtXWqscdO9K3v/AC8OGH4eeHKEgMGIhoj8suA8aOBRYvjjonuSUzwBo1Chg0KJq8EAWFAQPlLd4l\nu7drl3rU9d5t3Ahs2qQnLSKKFgMGyjv5tkLlO++ov2njxvDOmS1gWLVKtd070bIl0KKFnjwRUbQC\nXd6aKAr5VrPw3/+qx6VLg7/4Ogm2OnRQj/n2PnuRb8EpUTasYSAiIiJbDBiIyJfqauCNN+pu37Il\n/LzkqvfeA556KupcEGXHgIHyVr5VmYf597g51803A8ceCyxcmL69a1etWcprv/gFcOaZUeeCKDsG\nDES0h5c2+R9/VI9bt6ZvX78+/fmmTcDKld7yFXf5FpwSmWHAQBSRzz8HPvkk+fyHH7JX44fdwa68\nHLjqKvv9nOZr//2Bjh3NX3vvPZXOtm2Os0dEIWPAQBSRAQOAgQOTz7t2VVX7YWjVSs1GmM2UKcAt\ntzhP86WXgO3brV/Ptt7Cgw+qx6BqIKZMAaZN83bsgw8CS5Zk34ejJagQMGCgvJWL1cQzZli/pvPv\n2bABuOkmf+e64AJg587kxfLaa4HLL/eXr6D+Z+XlwPDh3o79wx+A444zf83423Pxs0bkFgMGyju8\n2wvHAw8Ab72Vvm3NGvN9q6qypxX3/5lVUwkDBSokDBgoJ0kJ3HWXeRV4EIX4jh3AsmX603Uj7hdV\nwDqPzZt7T1NK1d+DiKLFgIEi99BDwEknuTvmgw+AMWOA228PJk+Zzj4b2HvvcM6Va1KDhCCCmv/8\nR/X3+PprfWlOn57e4dSOEYQuX54++iMXgjgiXTg1NEXu/PPdH1NdrR6zdbLTWdPw/vt1t61eDTRq\nBOy1l77zZOPm73n2WaBJE+CYY6z3MbvYRX0BNPsbP/hAPepcxGroUOvzZdOli/qfZw4hTfXee56z\nRRRrrGGgnJSts1lYF7327YGDDw7nXG6dfLL9iItsF0unF1Ipg3+/J09WjxMnZr9Qh8Vu6Gfm/BNW\nNmwAnnvOf36IwsIaBso7umoWPvgAaN0a6NXLep/Fi/WcKwpGLY2Z5cudpXHCCenPgwweJk9WzULG\nUM81a9T/ul274M5pcPOZcvoenHkm8Prr7DhJuSPQGgYhxGAhxEtCiBVCiFohxIkm+9wghPhRCLFN\nCPGmEKJ7kHmi+Prpp+jOvXhx3fUQhgwBeveOJj9mdF+M58yxfu2oo7yl6SWPtbXO11FIrWFo107V\n8kTJz7BKp0uEE8VF0E0SjQHMBnARgDpfKSHEFQAuBnABgMMAbAUwVQhRL+B8UQw1bep8XycFtZtC\n/NBDnU+adOmlamx+2Oz+nvnzgbvv9neOKPowvPyy+2Peflt/PrKxeu/t/ic1Nda1NVH3FyFyK9CA\nQUr5hpTyGinliwDMvh6XALhRSvmylHIugLMBdAQwMsh8Ue7LVth6KYjt5glIvTDccUdyZkLd3HZE\nrKxUkycBwEEHAaNHp78+dqwaEmplyhS1aNSuXcCjj7rPr5u8pu7z2WfJ516mg66sdH8MoGooNmxw\nf9zy5cCKFe6Pu/Za1VFy1y7rfeLYJFFTo3dUCuWHyDo9CiH2BdAewJ57BSnlZgCfADgiqnwRueXl\nAmTF7IJrdUGprgbKypJBglmfhNtuAx5/3Pp85eVqyOL48cB55wEffug+z6mcBmt/+IP5dMtuOlt6\nUVampsX2wmy2R7sAb+ZM9VhT4+2cUbnlFuDAA9lsQumiHCXRHqqZYnXG9tWJ1yjHbd+e/c5KB7ML\nRxB3bNkuhIMHh3OeTMbfef/92ferrc3++ubN6gfIXhuh0+zZwOGH2+9XL6Nx0u//dsEC69dWr84+\nCsNpYOi2hiuONQxG7QIXA6NUcRwlIWDS3yHTmDFj0KxZs7Rt5eXlKC8vDypf5FKjRqrTYBBVm3Ga\nw/+bb4JNX3dbd5Dv2TvvqPkfNm6039dsMarMgCXbSI5sbrsN6NZNDS91qn17oH//9OaSILEPAwWt\noqICFRUVaduq7Npfs4gyYFgFFRy0Q3otQ1sAX9gdPH78ePTr1y+grJEuQV1MzQrbZcvS74h0Xhjj\nEJhkk1EmpLHLu5TAzTer37NdxBYvVhfhbH78UT26KZNSz/nAA8C999ofY/c3jR3rbL8771Q1HR06\nqOdRTEEd988W5S6zm+jKykqUlZV5Si+yJgkp5WKooGGYsU0I0RTA4QA+iipflLv23hvo2TNed261\ntfaTDV12WfJ3uz4M69apqvNMp59unb6uC9K77+pJJ5vdu7O/nm2J7G+/dbccNwD87W/AoEHAP//p\n7rhMqe+x04mbzI6NizjmiaIX9DwMjYUQBwshDkls6pZ43iXx/C4A/xBCnCCE6AvgCQDLAfwvyHxR\nblu8GHjkEfV7GAWbEPadv7780nz7FVeoKvpsUtfDsAt22rRJzj0QZqH+3XfA88+Hdz4rU6ZYN3ec\neCJw1VXe0i3SVBK+/DLw+98nn2f7H8UpsLUzZ47K76JFUeeEohR0DUN/qOaFWVD9Eu4AUAngegCQ\nUo4DcA+A/0CNjmgI4FgpZcBd5SiXDR+e7Pm/bl3damQ/F9JVq4CuXYGVK90dd8gh5ttffDH5+48/\nqs5+2VRX172QvPaa+b7GcEo7me+H2/dn2zY1uuDVV90dZ6e2Fpg71/1xmzeb/w12nTuz8XvxNo6f\nNct6n3nzgCefrLs9jnfzme/HO++ox7D6d1A8BT0Pw/tSyiIpZXHGz3kp+1wnpewopWwkpRwupfwu\nyDxR7qmqSl9kKrWK/7HH1LBAM14K4htvBH74AXjlFffHVlWpgtbq2N691QRRTqTmfelS830mTHCe\n1sSJzvY1s9deyVEUuvXtq+dOe9MmNZ+EV05qGMzyafxvnHzWevcGzjrLXb7CMnu2atIhyoaLT1Hs\nNW+efqG1K5z9XIC83PEaVq1Sj1YLChkdAQcPNr/TTHXbbfbn27LFed6cTspk9t55uXN3E6xdcYX7\n9DP9/Of+jk/9u7/6Kvm73d+R2nfs6quB669Pf93o95Ea8G7fnt6sEocahkMPBQ44IOpcUNwxYKCc\nkG38vE46Cm+7NGbMsL/TNJv6+J579OSnuNh63x9+8HYOP9yeU8q6wy9T+5DY9RkxM3168vcFC9Sc\nC2+9lRw9kum111QTQ6qbbrJO/ze/Sf4+eDDQsmWwfRh27/bXRBOHIIbiJ47zMBD54raw07XoVbb2\nax2Mjp4GN7Mizp+vPz925wzKxRdn70/hZQns1OG/QgCjRgHvv2991z1ihLv0UwOSzM9JEO9Vaal6\n3LIFaNxY/f8/+8xbk8jbb/sLPih/sIaB8sJHJgNxnRbEv/yl92NTnXGG+2PCsGOHu+aLKDl533V3\nvjSzbJm7/a06pkZt/Hj12L8/cPbZ7o+fPl2tXPrEE3rzRbmJAQPlHLOLys9+lvzdbVVv6igLHXd7\njz8eThNK5nLcVoxJjMIUZpV2tpqdv/8d+PRTd+mlfn7C+Dsyz/FFYtq6LVuATz6xPm71ahXYZJtV\ns6ZGDQl2W+tivAfGnBJG/xwqbAwYiFLoukA8+2z684su0pOuYfXq9M55qTxO4qZVe4+rwezYoeZa\ncKN/f+vXbr5ZDcP1KsiAwWx68xNOAPr1A6ZNA377W2DgQPNjv/tOvcd77w306ZP9PD16ZH/d74Jj\nVDgYMBC5YDbLohN+hjWayTbs0+vSz3HwxBNqBU0/QyQz2c0eacaYoCj1Yh5GO77xf12xInstVepS\n23ZzhmzaZP3a55+rmS4zBREo7djhfO4QiicGDJR3/BR2dsd6vXMmd3ReWLwEDIbUz4Pui6ix9LXV\niqt+hvg6ZTeNdWYtiJ+RHS1bAp06eT+eoseAgfKWsRCSG1ENJ6upiea8cfXCC9ZNLm65fW9zYcrm\nuOTxo4+cL4m+fbv7dTYoXhgwUM5xOnHTgQcGnxddMif8mTfP2/DAfHHNNcDBB+tJS1cNQ1DiOOeB\nk+Xjt29XnY1Hjw4nTxQ9BgyUt6qr1cVi4kT3d5nV1f7O7fYOMHOO/hUrgJNPtt7fbGIn0sNqlEQc\nL+x+zJxpPXzUyd9qfKd09jeheOPETRSpzLvo6urkpDNepRZ2kyapEQpvvqkWgvrmG6BzZ7U+ghmj\nXfnii/3lwS2zu+DKSutJpSoqgs0PKYsXB38OL4GIsfhaphUrnDflHHmk+/OmclILQfmFNQwUmTlz\n6k7jq3tGwm3b1KOxamTv3sCwYXrPoYNZDcjq1UDTpuHnJd+4vaBZ1Q65XcHUKatOj9lkzvpp6NwZ\nOO44/3kyZKspY8BQeFjDQJHxGhy4WXzKrMCL4xK9ftrZiXQRwnmfBAYMhYc1DEQBcNuHwW+fCdIn\n7BEIdhfc2tpw13K4666628zyyICh8DBgoMiYFcx2hfWGDcCaNcHkJwhOLz4ffxxsPsg5oxkrLM88\nk/31zp3VCqNCeBsq7Ee2YMB4jQFD4WDAQI4tWaKWZo5St27u9re7YBt9G3RjYZq7wl6o67HHsr+e\n2nci29oSQcr2PeJnvHCwDwM51qOHqjqPsoCoqnK3/9Sp2V83VvMLwvz5as5/yi316kV/vt//3nxf\nIYCvv667fe1aoE0bvfkyzgdknxKdS18XDtYwkGO52M7+v/9lfz2o4Ofee4FevYJJm4Jld8ev27vv\nutvfbEIyqyGSfgNiNklQKgYMFCtxmfLWr6CG4FHw3nsv6hy4Z1WT5bZGLlNmMGD2/Vy1CmjUCPj+\ne3/novhjkwQ5kro6ni5O5qB/6CH36RorDZJmRdVA6wUANNxS7toL2NTVfzoFJm4jOIDk5FYvvgj8\n7W/B5oeixYCBHNE5MmHBArXq41ln2e97/vnu03dyd79yJdChg/u0c1KfZ4DWGmbE6vsU0Ppb/+kY\nJiwENnTXlx7ZmjYN+PJL4LLLvB0/blxyyvLMYIJNE/mPAQOFrmdP4JBDos1DWZkaolYQhdyvzwNq\ni4FdTez3zUZIYN5IYMZYf+k0WwqccgrQZCUDBpduv93f8cOHq0evAcPnn/s7P+U2BgwUiuHDgZEj\n1SqEADB7tvl+YVW5Fk4fAwnU2wq89ABQ6aG6Jgibu6jHfT4AShyujZzNyn7A9lb+08kBUQ9r1mXX\nLjWnSvv2UeeE3GDAQIHYvj39+bRp6idO5syJOgchKNmpHnc3jDYfqba3BHY1Bob9XU96s34PvPyg\nnrRy2P/9n/N97aYidzICIvO1V18FLr3U2fl/9zvgyScLpIYvjzBgIEfc3PlXV6te00Gfx6+DDgrv\nXK4V7QY6fq4e/aiXmIWoOkYBw+4GwJ3Lgfqb/ac18hyg4Qb/6eSB555zvu9ttznbz80cC25Gl7z1\nlvN9KT4YMJB2TgsjyuLAKcAoB71CndraTl9aOuxorn782t4SKA15Luc8sGxZsOnX1KjprK2wZiE3\nRR4wCCGuBXBtxub5UsreUeSH/Lv66qhzkAcarle1Avd/4T+t3Q2Aqn38pxNH1Y2BNvOAPk/7T2tb\nG2DxL/2nkwPsLth261tYpSGlmlq7aVO1BPe553rLH8VT5AFDwlwAwwAYFdJc7DeH1KsHjBoFTJkS\ndU7ySOl2oLoRsP6AqHMSbxv2Aw6eBJx8mp70vjwT+KmTvzSkAGb/Ntb/O6d3+Nn2W7LEfP9Nm9Tv\nr72mJ2DYtQv45pvoR1ZRfAKG3VLKtVFngpRFi4D99gOWLwc6OSg7q6uBp5+2Dhg2bnR+7nyZ6dG3\nku3x6ncQV+9fA8z8q/90Gm4ETj8e6PIRkvctHjX7ASiqAd4c5z9fAdGx/oNdHyAp1RoUo0fXnW7b\n6BS9ejXQzqa17NJLgXvuUcc0aOA5u6RBXAKG/YUQKwDsADATwJVSyoBb2cjKq6+qx+nTgfJy9buf\nC3nLlv7zlDOOGQ1009Cjq/FqYEcL/+nkPaFmjfRr117Av7/ynw4A/PEgPcNFA/Tww872c9vX4Kuv\nkqOPpATuvFPdSFx4Yfp+mxP9Xf/9b+C669RNys6d5uuvGItt1dS4ywvpF4eA4WMAvwWwAEAHANcB\nmC6EOFBKuTXCfBUsPx2SdNy5zJypajjatvWfVugOeAnY1gpY9jP/aS2zWFGI4m13faB4Z9S50OLl\nl93tf+ih5tutyhRj+377Zd+P4iHygEFKmboA8VwhxKcAfgBwCoBHo8kVAd5qFbxM5ZzpyCPVbJDz\n5vlPK3TFO4GFI4D3ros6JxSVmvqxr2Fw6sMP/R1vV4ZwaezcEnnAkElKWSWE+BZA1jljx4wZg2bN\nmqVtKy8vR7lRh06e+Ynyn3xSTx6+1bhkQahKdqo7TCpcuxsAe/0IdPrUf1pb2gNVe/tPJwJOyhHW\nKASroqICFRUVaduqfCxhGruAQQjRBMB+AJ7Itt/48ePRr1+/cDJVoMrLgf79ge4hTvefekfid2ne\nSBTvVHeYVLi2tgH6TgH209CXZXtz4DYXvYZjyiowYA1DsMxuoisrK1FWVuYpvcgDBiHEvwC8DNUM\n0QnA9VDDKiuyHVeoli5V6yAcfng455s5UwUMUSyr21zDvD6OiFqgwyw91cglO1jDUOheegiYcaX/\ndHo9Bwy90X86EdLRJMFaiPiIPGAA0BnAZACtAKwFMAPAQCnl+khzFVM9eqjexDq/REuXAiNGqIVt\nmjWznpDF8MorwPHH6zu/mVALia7vAecM05fe1lzsrUnaVDcGVmuYd7zjZ2qFUFELyCL/6YUs9Tv8\nySf2+1D8RR4wSCnZ6cCFnQF0vn78cWDuXBUwjBhh/yU+4QTzff72N/tFbfxoEdQowwaJmWYe/MT/\ndMW1JcDGff3niag2UTyLmtgEDH36ON9XyuTcLFemVLik1jo4CRg4N0t8RB4wULwZX1YnX9o779R3\nPjPGDHLaFe9Sj2t7A7uaBHQSIpdkYjGGohqgtjTavCR8/bX6jprN8php0yb7/dgkkVviEbZSbBXE\nl9UIGGrqRZsPolS1iYBBxG/Goq5d7fdxUnZkBgzTp2fff9OmAimTYoo1DORIWNWCkVQ/7gkY4nEX\nF1sdZgED71Lt6n7t3AuYeiewm9NfW9pTw5CbS+s4+S5nBgxDhwJr1wKtW9dNZ+tWNY30+PFqumkK\nHwOGAjdjBnDNNenbUiN448saVlT/4ovhnCdNUXUiWMjTxtLzfga0n+0/nXqJZaSXDPWXTulWoNPn\nwOxzgRWH+c9XvjL6MBTFr4bBiSIH9ddm5UpmPy1jn7ffVo/vvsuAISoMGArcPfdEnYN0l1/uYuc+\nT6upmP1qvSC/myM6fQbMHwksHeQ/raU/A1Z6G8O9R/PFwOhuQL2f/Ocnn8W4SUIXN/MwnH56cPkg\nZxgw5KitW4HGjZPPq6qAvn2Bt95SQy8B4I03gP33T87Tbia12nDnTpVupp07VVSfSUpgR5Qz4A74\nN9B6vuqs6MfOpkDl7/XkKW6KdgPF1cDCY9UdfRzsbKoeh/8V2NbGf3qfXwB8c7L/dOImtdNjDvLS\nhwGo25Rh91y33buByZOBs87iCI1MDBhy1IwZwPDhyeeVlcCyZcCjjwK33KK2HXss0LAhsG2bszRP\nOkk93n57+vaxY4G77qq7//jxaihlZIp2A98dA7z4WISZiLmSxDrCceorsL0l8NHfgL1W+E9r33eB\nXs/nZ8Cwp0kiN/swOPHaa+Y3HTU1wMaNqi/Dli3przltHt29G/jf/5Ll2jvvAMOGqY6TGasKpHn4\nYbW6Zrt26WUsMWDIG1ZfImPdeT9pLV1qvp+xDHZkinYnC9V803o+MOxK/xcLo0NndYwCBghg2u32\nuzlRfiJQ6jAizjVGk0Sbr4EGPqeHlsXAup6hzufg5MK+ZAlwxRV1t197LfDPf6o0PvW4JMc99wB/\n/auarXbgQOCpp9T25cuzBwzGlPROb7QKSZ6WtoXLbRWak/3NvvjV1Spij1Q+Bwz7vg30/B+w4ER/\n6exuCMw9FVgR0lziYatuBDRaF3UugrEzcVU76xg96b34SKjNUk5rAhYtqrvN6OBoxmkZty7xsTBr\nZnWCzRF15Wlpm/+iHub4yivhnD+rfA4YSnaooYdTohg2kkOqGwGdPwYu0LAQ3da2QMX/4rN42IoB\nwMQ5empQzvkF0DDcRaycBgzZyhK7NKRUa+t07Oj9/ORcnpa2hcfNlMwLFwIvvaT6H5gFBE6+aKNG\nOT9fYERN/gYMpdvj1e8grmb9QS0n7Vfr+UD3qcDVGtKSAnjlfpU3XwSw5kD/+QFUEFRUrScth3Rc\nsO3SmDgRuPhiYNUq1efADGsK9MnT0rbwXH21erTrs7BoUXIUhVXAMGGC3rwFpmh3sp03Llp+B7Ra\n4D+dtnNj1u8gppYPVD++SaDPf4H6GtZU/8W1KgCJk5pSNVomRGHc4RuLWm3aVDdg8Hp+1kxYY8AQ\nA1VVainnTz8FBgzwlsasWeqx2qZMyBxiOXly3X2WL/eWh9DFsUni1FFAuzl60vpBw7wJ5JAAvj5F\nT1IDJgLFAawS50dtaeijLbxeeIVIdjw0S8Ns8aogahFYM1FXzErbwvTtt+rxiSe8BwxBfnFiK44B\nQ/0q4ONLgBkmXb/d2t7SfxoUvt0NVB+UOKktyZkmiblzgXnz1O8bNjg7pqDKvQjFrLQtTF6+WJlf\nECONtWudp5E5vjkcEugyU88sf/W2xC9gKNkJbGsFbOkQdU4oKjX14xcw1IRfw+C1pvLoo5O/H3FE\n9n2d3Ci5DSbYJGEtZqVtYdJZO/D002qZ6XMdjJ7617/s9znzTM3Re+sFwO9+pi+9rW31paVD8c74\n9LL3YcgQ+5UDycLu+kDX94FTTvKf1voDgLdv9p9Obfh9GJYt85/G999nf92YKZI1DOFgwJAnUqPi\ne+8Fpk2zP8bpyAqtEbdRszDpDf9TOssi4CeT8VRRKtmpLhg5rlcvBgyezTkDOLDC/3DIZkuBni/q\nCRhqSoGeL6hOuX4tOwKYcaX/dDTyOtrLTEE27zrEgCFHfPONt1kbARXpd+miNz+eGfPib+4MbI5J\npvb6ETjGOB1IAAAgAElEQVT2L3qqkUu350UNQ0t2n/Duy7PVj1/9HgJOPB+AhO+VVGf9AdjPwV2E\nndbzgfZfxCZgcBMUsKnBPwYMMeAkou3Tx3v6e++t5l7o3t38vKEy2lFljIZDdvwM6P2cWqDJb+3A\n1/8HLP6lnnxFqFWrqHNAydUqa/1/Xz67SP34NfR6oP9//KejGWsDwsGAIUZ0fejNAoGvvqobMGwM\nd+I3xQgY4tRZ0Vhv4bnJwI7m0eYlJtpoWEQymxYtIvr85ZLU1SprYhJgy+LIl9s2G1bpZP8gps0v\nNOGtREJauf0wn3RS3WPM5nAPXCwDhkRnsDzoe+BW587m2886Sy2PHpQ4Fsa/jFvFkFHDEKfVKmuL\nY7Xc9tNPq0cnfRic1qiy6cIaA4YYiOoDWhzFTYtxdxKnGRqNGoaaetHmIwIPPmi+XQgWnJEzguqI\n7+jT1JbEIj+vvw70Tukz7WZY5e7dMVhpN0cxYIgBL71ys+27YoWzNBZomMHYtVjWMOwCaovi1a8i\nJMOHW7/mJWCY73BG5Jrorzl1xC5ASm2SiAsZfQ3Dyy8DY8cmJ3fKtHCh+f9y5Ur1eMstwPHHWx9P\n1mJUapMb2Qq3SZOcpZHzTRLFu4DGa/yn03hNQdYuAPo72h5wgP0+N98M3HGH+7QLzp5OjzEKGGqL\nI28i2b1b9clK9cEHwD77qCCgd281a24mo4lt9Wr1+MADwPjxdffjsEprDBhixFgPItXTT6t1Jqx8\n912OdR7TGTCMOgPo86z/dABga8C9/HLQ3nunP+/dWw3vtfPll6qm4dRTzV8fPVoV1uvX+89jXjO+\nI3HqwxCDTo9mPv5YTTK3apV67qSm6667zAMGAwOGuhgwxIAR0X7wgXrs0gU44wzg1luB004zP0YI\nVa27//7h5BEtvwO6vek/nY6JqEhH9X+T1cCiYcCHl/lPq2pv+30K3PDhzgKGgw6qOyKHPIhjk0Rt\nSbzykyG15nXcOPv9H3wQOP98Z2nX1Khm3N4+55vLZQwYYuaOO9Qc7LfdpgKGbG66KZw8AQCG3AQc\n8jhQo+Ejs3FfoLqR/3SKdgMbugPfZ2mIp4Lw5JPqDtOPzGa+gQPVnWtkYtskEaP8JHzzDTAnZZHY\ndeuSv2fWFKQ+v+CCugGDVXPvjTcC11+vasYKdWIzBgwxc+mlzvYTArjuukCzkq54p7qbf+KtEE9q\nI46rVZItIfRX9x52mN70ADU9dqQBg1HDcNyfgV1N/KVVWwx8cJVam0JHnkStmpo9Jt59V9Vsvf22\nev7AA+mvP/mk+XFSAu+/DwwaVHfU2B//CCxdmnxuBCTbtjFgiJQQ4iIAlwJoD+BLAH+WUn4Wba7C\nE7ve2WaKamJVQABgwGBizhzVR8AoOHXSNYonCGbfoauvVtXSO3eGmxdtVvdVs4822KR+/Nj7A2DV\nof4DBqPW4+DH/Tcr1tQD5o9Uy4FrYrUC74QJ1sf8/OeqL8Po0enbdSyelW8iL22FEKcCuAPAHwB8\nCmAMgKlCiB5SynVZD6bwiJp4zZ0AJPIU+UfYk+Ji1SZ65ZVqmJcuBx4Yzvwahx8OfPKJ/nR37QLq\naRqwcsMNwEcfeQ+eiqKOj7e2A556TU9aY5sDRRpWq6zaR5UDI8/znxYATHlBBQ2a/PrX5ttTA0qz\nYNbNUtyF3BkyDqXtGAD/kVI+AQBCiAsBjABwHgAH3VYKU+h3TTGrggSQqGGIWRDj0HHHqfHkUV6U\njAvzrFmqw61xh/XII+b76yoordKZOxcoLTV/bdAgYMYM9+fysziR1SyYmb79FujRw/l5IlFbome0\nxZKfAzftgFoQy4d6W4GxLYASjyvquXDaack5GABg8eK6+6R+D+0+MzlRIxyQSK8AQohSAGUA9twD\nSCklgLcAHBFVvsLm5QN43HH685FVUU38JjbKgyYJvx31dOjXD7jkEvU5lBI491xv6XzxRfJ3L59p\ns3kfevZUj5k90xcuTO+3YHU+P4X7Mcc42y+0kUp+1JQmp0D3q7YEqC3191PdUKUVwpDR1GABsA8Y\nnFi+XA3LLDRR3zK2BlAMYHXG9tVQ/RkoLuLYJJEHAUO2OTa8cloToLtq9ZBDkr/bXagbORgkM3s2\nsN9+dbd36KCGbaY2iei66/vTn1TnOSDPqp5rS+M1n4PxvdUVxPjkJmCorVVD38eMCS4/cRXX0lbA\nps5rzJgxaNasWdq28vJylJeXB5mvwlVUA+yOOr7MkAMBg5TmFx6nF6NLLgHuvltvnrxycwHNdgEX\nAnjlFTXz3h//aL3fwQf7DwTcHn/ffepC8NVXeVb1XFOqpw+DLrIYkCI2QYyTFTCNfapj9Dbaqaio\nQEVFRdq2qqoqz+lFXdquA1ADoF3G9raoW+uQZvz48ejXr19Q+QpVThRMolZPk0T9zcBvzgLq/+Q/\nrSar9uTpzDOth07FkdP/+ahR9gHDKacAzzzjP092dN5xd+0KXHihecBw1lnAp5+q38eNU/0aWrSw\nz8fXX9dt1vDThyFoW7YARx5Zd5rjQNSWxOZufg9d/So0sPpMLVumahNyldlNdGVlJcrKyjylF2nA\nIKWsFkLMAjAMwEsAIIQQiedZBsLkl9wIGDQ1SbRcCPR8CVh4DLCjhf3+2XxzMjBfdYvO1epjHflu\n2NB5mi1aqKr+ffbxf96gpK4D0KcP8OKLwGuvqcnMgLrD3wD1HdI9A18Qn6levZKLHjVuDNQPa0X1\n2lK1ZkprDSsubekA7NDQlhajWg+rTo+DBwNLlqTvm1kbkatljxdR1zAAwJ0AHk8EDsawykYAHosy\nU3Fwww1R5yCFrnkYjFni3hwHrOnrP70c5bSQqa11n9bYscmFdjKdcELdNSKcclJt6/R1t447Dti6\n1brvg87zBRnAT5gA/OpXqnYFCPFis6M5cPAk9ePX6r7AvzVUi8SohqG2Fli7FmjdGnjqqeT2NRrW\ntssnkQcMUspnhBCtAdwA1TQxG8BwKeXaaHMWvWuvjToHKXQ1SRgFhOYRF5GPmQ+Im4vXf/+rHocO\nVbPXDR1ad5+wLlCNGqnA5Jxz1JS6utK0kvk+3XyznnPmjaefA1p+7z+dQx8Guk/1nw6gaj32mwaU\naBgjvnQQ8MMQz4f/85/q57HH1Agcw/btQJMm1hNCFZrIAwYAkFJOBDAx6nxEpaCaJHSuVpki16oF\nzf7n11+fHiSuXp0+Pz6g5kz46CPgz3+ue3zflAqbsjLVafDLL9Xz1N/dsFqjwe79Li4GfvhB/Z4Z\nMAT5eTf6cwwcmH6uTp2AFSuyH2u2rPHy5c7nY3DDOEdon9ut7dSPX93e0re2xdJBQOeZQPvZ/tJp\nUAX82B94xMNEHRmMvjOptm5Nf55rZY1OsQgYCsnq1ar6q0OHqHPikrYmiWAChij06KFqNjKX0p08\nGTj99OzH1iTK3NRZGUeMSA8Y2rate3Ht10/9pAYMZhfgxo1VXwWjcHvsMeDQQ7PnyUz7lMHNbpok\nzAwZAkyfnr5tzRr1d+piDMM08mrks39/+4DBkPq3deqkJ1/du6ul6KPQo4eaXEoLnatVTnlRTzon\nnA+009Nz1MnnOnUf9mGgQBkFcCi1CkW7gVFnqGWg/WrzNbD6IP/pGHcnmud08PulPekk4Lnn3B/X\np0/dgKG83D5g2J2Im0pKVFV79+7m/RV0fU4amEzX7/Y983thP+wwFTCkNh+1aeMvTYPd+/Tgg2ra\n6ddf13M+N6RUfTCiChj69NEZMBTHpt/BHrJINZlS4PK05Te3BBY8NFoHHJgYb7e5s7+fBb8GvjrD\nf55i2iRxzTV1t42zmZjc66qL33+fDA6Ki4HNm9UsiWYXTy+dHp1y+7m75BJv5zHccguwaJH19M9+\nZP4txnPjsVkzNUQ1TGa1iJnNHmHcnWo9hyyO13LbAAOGELGGISQbN9ZdElVKwMccGvaML/aHlwML\nw55L2oKmgKFFC/WeGho39pUcWreuu61/f39pGgYOVMskl5SoOQa6dUs2SRQVJZslunate6yTi/qg\nQarJIduSuzqCUr+LWpWUAPvu6z8f2WReHFMv0GGP7Jg/P7nmS070U3Kitlhfk4QuMpw8GZ+t2T67\nXOQy1jAEoKYG2LAhfduqVXX3u/tudeHL7FSjjRF1x2lKZ00BQ8Ykn/j7372ntXw50LFj9n0mWnTJ\nveoq+/SN/gZ33plc2MkIGEps3gYnNQznnQesX++sel/3He3ZZ+tNzy+7WfrC1LRp3f9JZj50BaV2\nXn5ZU0K1JXldw7Btm/n2E08Enn1W/X7SSSmnzpdA0CEGDAEYMwZo1cq+k5Wx7K7Vh9Q3I+qO06JR\nmvKUWa3tZG0CK1Yd21ILA7MZCdu2VR0JvRQaF12kHu2q5530GxAie+1CtuPs2P1tDz/s/rxByMxn\nZqdHP446yn8aVu68M7i0DUJo7Fga0t28KxoDhscfN9/uJOCqqXEW4OcyNkkEwOhY1blzxBGocSeg\nY3TDYfcCR97uP53SRHVKjb+G7MwZ8rzeQV5/vbfjRo0C/v1vd8ek5vGUU9SPnf791VDKY48FTj7Z\n3fkKid33zE9w9Oab1sc7bQq7/XYV1DZtmr49iP4choYN1TwCWtWyD4OVkhK1wmkUHWvDwoBBs+++\nc3/xqqwMJi9amyS6fKQev9KwHvPmzkC1v04Hhx0GzJ3rPyvZLjQ9eli/NnKk87s2v0Fjv35qOG4c\nxXVImfGeT5oEPPqo6iti9X/4+c+B997zdx47ffqoUTiff66e63zf2rUDfve7upNVBTKZmSwGimqh\n1gaMyT8/wiBm333ViKhbb1XPrWZYzRcMGDSaOlVFmE4ZhYYxR752RRprGEQtsH5/4J2b/KelwcSJ\nyf4AgPcCOFuhajYU0ZBrbZe5ll+vMj8H3bolJ44y3oO//EVN0WwYPdo8YIhrMJRJSjW5VmbAEEj+\njb5HRTXxmUslwhqGZctU+W0EDIAa8eRlzpNcEJP/eH5wO8468ELc+BLp6MMgNE3cpImuJgkvx40e\n7aw5Qce5rPzqV6qqPOg8WH1G4xaAZA6jzCZz4S2r98TtJD5RCq3t3AgS/niQWp7aj5p6wHOTgXW9\n/KUTkyYJw2mnAQsWRJ2LYDBg0MhN4RHK3YvOSZKKamLTefIf/6i7Tcf7+YtfAO++m3xu9v9s2BAY\nP946jbFj624L4qIybZrKy44d+tM2c5DFnF1xuQu36vToJw03Jk1SzQ12S5GbTT+datAg1S9iqovl\nGqQ0z3sgTRLfHw3MuAIo3uUvneJdwGH3qRkafQcMMeyImacYMOQzrU0SmtaS0OCss/SllVpwv/JK\neic2LxcQs/kc7C4SXoV5d3vCCeGdy4vM5iOz98bY1qoVcNNNwI8/qqYtq/+Lm46SZ56pfuwCBjtH\nHaWmB3f7WTGrYWjaVE0KdsQR/vKUZmtb4K1b7fezU7JdBQw6Zo2MQQ3DOedEevrQxKeOOQ/E5W5r\nD61NErWxaZII6kJpNTTz4IOTv/u5c43d58OFuOe9V+Im1Uk+hVDzdhjTtBvHlJXZH5u6GNhxxwFP\nPOEun3YyO9IuXZo+7t+MEOZzcDRvroZ2//Wv+vKnzZ6+EPkRMKR+DuL+XfGDNQwaxaU9cw+dwyqL\naoDdAY4Bc0Hn+2z35V682NscB7nAScHWvLl6TF2Eym0acWV8joqL1VoLZjNtZjrwwOTvr76qNz+/\n/S1wwQXp27p0ASoqgHr1rI+T0nwa6tJS+wnJImMEDMXVGtIqjjxgSBW764BG8bhlpGDoHFYZoyYJ\nO59/nt4XIZtsFzwp1UUkc+y8GWNZ3JEjk9t+8xvn5/LCTXpeazkGDFD9JcwmroqD7t3Tn2crrLPN\nArn//nrmRLCbbTNb/o491rzfgV2+rNIMpA+DNkLfQlayKH5zQ+Qp1jAE7N57gYsvjujkOmd6jFGT\nhJnUQrOsDNiyxdlxdgGDUwMG1F321ks6cfSrXyV/r18/uT5CHHz8MbBypbN9BwxQj8aQtyBGgMyZ\nY10bkyqMmpnYfwZrSvOmSSJVLte62WHAELA//9nDKnnNfgD6/BdqchQfWixWj7qaJGIySsIo/Hbs\nsJ4rwemXNswvd5SdHnVdMFauVEtzjxihnjv5m4YOBd5/P/s+2SbJyqZVK/VjyJaf/v1V58Ag/+ft\n2gHXXQcceWRw58gbtSVAkYYmCVkMNNwAXHiI/7R2NQaefh7Y2s5/WnmIAUMIXBfW/e8HBt0G7Ghm\nv6+djV2BLQ5ueezEqEmiSxf1mDoXg5Nhdb16AfPmBZcvK8bIC78rasZBixbuj5k6Nfvwz40bs7fR\n62T2ucjc5jeguPZa69eylQVBNlnF8q63VlMNw7xRQNPl/msZGm4A+lYALb9nwGCBAUMIpHT5hS3e\nBaw7ALgvgqublaJ4TNz0/PNAkyZ1tzuZyGns2LrDn9w2SXgpeEeNUos0lZe7PzYbN3mJsnajfv26\n/59URsfKsEU5KZXZ/2P48OTvkyalL9+eTS5NMJVmd33gl/8AhmiYPXbO6cCrLhd3ydR6vgoYYtS8\nETcMGDQyljH2LY79BURtYE0SV14J3HKLvzQyl4l22uHLaqVKQN9FtqhILUEdpVheMGLCzzwMbhmd\nNM2GSqZ2rj3Tx5ItRx+tOqrG3v8eBdp87T+dPs8A7Wf7T8cocxkwWGLAEEc6+wu0/E5VtflVf3Ng\nTRJDhjgPGNz2TTjiCGDmTOv9Tj+97rY2bYCrrnLWeS1K++5r38Ty7LPJJhwgB6qpY8QqyBo+3N1M\njKlatQo+eNt7b+vXWrcG1q1zn2bv3sA333jPk6nvjlE/frVewIAhJAwY4khXDUP9KuDiAxKry2mw\n8Fg96dgYPBj44AN/afjp9NiqlVovIu7efReYPz/7PsadbOqEQwZdF65PPw1xLQONvP79L70Ur5Ei\nbpxxhrfZKJ96KsYLKukaJcGAwRYDhpAsXOhiZ10LPZVuU8HCq/cCPwzxn976A/ynYSK14P7d74CH\nHvJ299u1a7JjoXF8rlXFX3YZ8K9/Odu3XTv1EzVjuGKuMWbwTK2BSWX1GaxXL7xOmn446eDpVLZa\ni8gxYAgNA4YQfPwxcPLJLg4QtfoWjAKAjfsBa/r6Ty8E/fp5P3bx4uTvZgFDLgQP48Y5DxjcYPND\nXaNGqamTrWZDjNPnZc4coK/FV9hqhFDqdqNjqZPZLDO1bRvz2U5ri/VM3KQpYMjn71rMetblpyVL\nXB6gq0lC59TQIdHZ0RCIV6EfJV0jPgypkznFyWWXqc7HgwY52z+2UydnyOzU69YBB6i+PF46ZheH\nNJp66VKPB7KGITS5cyXJYZdd5vIAXZ0edU4NHRNu+yYYF8phw/I78ndK13tw443A+vV60tKpeXNg\nwgQ90zzn+uclM/8DB3qbLjqs98FqEjZbMQsYdu0CavJ0pmoGDHGkq4ZB5/LWOUpK1UHNa692Mldc\nHPNq6gJiVYtmrOBp5+qrs78e1qyVngMTqWnxKU0Bw6JFwC9/6T87cVS4V5I40zWros7lrTUyKxiC\nWk/+L39RHdSKi/U0T+TqXee++6o7uPPPT2777W8jy06sGdNe77NPtPnI5vXXgf32U7+bfSZnzQL+\n8x/7dE48Ebjhhuz7xP5zIouSN0d+0wG0BB/Tp/tOIpYi7fQohFgCILX/rQRwpZRyXDQ5igndfRhi\n1iQhRPrFu1kzFZE//rj7tE47DZgyxfw13f0Xxo0DjjpKb5phadIE2L49+Xz37rivZhido4+OX9+X\nzKDgmGNUP43vv6+bVymddR6O29/oWcyaJPJZ1EWGBPAPAO0AtAfQAcA9keYoDnT1YQiwSeLAA70f\n+9xzyd9HjFBVnsY4frO7JeNOyuz1Rx4BvnY4WZzf2oHLLovxWHSXiotzt7akEBlTax9ySHIpdUPm\nhd/Leh9Ruf12DUNUGTCEJuqAAQC2SCnXSinXJH622x+S57TVMATXJJFtbQA7I0eqiWCA5Pz5u3ZZ\np5utZ3fDhmoWunwycGDu1mRQMLp2BV54QY10sJv3wq6Jwa0gA8u//U3V6PgSs2GV+SwOAcNYIcQ6\nIUSlEOJSIUS86s+joGviphwaVmkEDGZ3G7oKLONO7J6Y12HNnAm8+WbUuaC4GTnS2UgCu31eeEHN\nVmnHmAQt9k0XrGEITdQTN90NoBLABgBHArgVqmni0igz5cWO3TuATl/qSazROmCXyZKMbgU4rNLL\nRXztWuvhRj16qMf99/eeJ6eytd0PGABcf33weaDc8sYb8RxGmslsbZRMI0c6S2vsWPsRFGbKylSn\ny9AwYAiN9oBBCHELgCuy7CIB9JJSfiulvCtl+1whRDWA+4UQV0opq7OdZ8yYMWjWrFnatvLycpTr\nXkPYoeWblwPnD9SX4FcOvvl29vRhiL7S5pVX1MI3hsyA4+ijgWXLgM6d6x6rq4bBSTqZ7cNEQPrS\n03GR+XmuqYlHv5SePcMOGIo1jZJIvHl5FDBUVFSgoqIibVtVVZXn9IKoYbgdwKM2+yyy2P4JVJ66\nAsi6+sL48ePRz888wpp1adoFmGiywo9XG7v5TyNLk0RVlRqd4DlplwVT5ox6ZtWcZsFC5rniUCAS\nxVGuj3rxPg8DaxismN1EV1ZWoqyszFN62gMGKeV6AF4r7w4FUAtgjb4chaN+SX1gjY+hA0HI0iSR\nSxfe1Lz6aU+NfVsskQdx+1xblS19+jgf0eSKLAJKdgD7+ZydrSjRkUpHB8o8FVkfBiHEQACHA3gX\nwE9QfRjuBDBJSum9ziQfHPQkMHwMIHyWBEWJVp3auv9mu4BhwADgs8/8nT7b+dwELLqDm1wKlois\nGMMnr7vOf1pvvgl88gnwj3/4T0sI4IgjVOfdVHPnBvTd29oWqP8TcNYxetI7/G5gH/8zL4378ABc\n/rPLNWQoPqLs9LgTwGkArgVQH8BiAHcAGB9hnuKh/Wz1+JGGvp87mgMburs+7M47gcGDrV/3+8V3\nc1eUWntmtWJfUOcmiitjUSiPtctpjjoKOOgg9wHD9OnApZem9/254w6gTRs1v0pm0BCIL84Fvhvu\nvymh5ULgt8OA4mqgzTzf2fphk9fFMeIrsoBBSvkFgCOiOn+siVpgWxtgxtiocwJATdI0d276NrcB\ng9cAY+fO5FDLtm3VFMdesWaB8slJJ6mJj3r2jC4PgwermonU71abNupx6lRg/nzgsMOyp9Gnj+oU\nnTmkum1bYI2jxmkB/NTJTbbNlW5Tj69OBJZmuVty6L6HfCcROzneTSZP6Zq4KdspbC6eqXfhv/51\noFnJyvcscClYs0D5ZOBA9Zk2LtBxs9deQPcslZvLl6vHG28EvvpK7a9L06YeDsrDTo+6MWCII12L\nT2Xh9+KZy3fruZx3oqC4/V4sWGC/T7aRWJ0SlQKlpeZNjX6+p8OGeThIc8DgrHYktzBgiKMQahj8\nEkLd2WTOKne5RR8fP50e/RxjhjUNFCdvvhmP5dczvxd23zdjsrVs/Az1dPI9PeUU7+nXPaHegKE2\nDysq4n1VyiHLlmlMTNfiU1m4uWha7btsGbBxY/o2q6kxMgufKC7aqXlo3jz88xOZOeooDesp5Jib\nbzbfft11wK232h9vLALXt6+qocjk6eZCc8CQjzWZDBg02blTY2Ih1DDYRb9OLuj169etYcg8zqiS\nbNfOed6Ckpq3JUvys8qQyCsdF7hbbnG235VXmm+/9lrgimzzBCcYI7is8nzVVc7ykYYBgy0GDHGk\na/EpTS67TK0YmbqSpNl6C2ZVlCefDOzYoXo8+6VziuhmzeLbWYwoDnKl6c6s2cPTUFPNAYOTmpJc\nE5+rEiWJ2lh1emzeHJgwIVn117Yt8KtfJV9fscL62OJif0thp7roIj3p5EpBSET2rKaUd01zwDA+\nD2cUYsCgidbqpxCaJLxcNK2OyVwnAkhG+N0slsRw+35J6X8WunysIiTSbehQNQIiV74vjRppSojD\nKm0xYIijEDo9NmyY/XUvAUVqk4TdmOoo7vJZs0Bkb6+9nI2ACNrFF9vvozWoYcBgiwGDJrlWw9Cg\nAbBrl7tjjAvuY4/VfW3mTGDy5ORzv+/H/vv7Oz6bXLlzIso1Zt8tL5OvSQlcfbWz82j7PjNgsBXl\nWhJkJYSJmwDz4UiGbHfjxx5bd9vAgfbHpbL7ks+YASxe7CwtItLPGCLtZzr2oBjlDGsYwsUahjiK\n6cRN11yTXPDGjt8vdNu2wOGHezvWDpsmiOwdeyywfj3Qu7e/dHLm+8aAwVb8rko5SmukG0IfBi+u\nuALYvdvZvsb7kTOFBRHV0bKls/2MZsqoJ2TzmVLigQGDFTZJaLJm20rglD/rSazzx8BKiykT80SU\ngQT7MBB5d8ABddeR8LTYk0N77aXmTFm0qO5rQrAPQ5gYMGgiIYHSrXoSW3UwMPdUPWnZeOEF4De/\nqbudNQNEZGbWLGD7dvPX7C7eb74Z4xlWGTDYYsCgSfvGHYGnXg8s/ccfB845R3+6I0eab/catZ9w\nggpAjj8eePdd63R4l0+UW6ZPV3f7jRurHy+OOsrbcVY3MG7KkRYt6q59k34SBgx22IchRzhtS9Rl\n8GDgjDOAH35wd1yTJsDzz6svJ8CaCqJ8MXgwcMgh5q/17KkeDzus7mtBlAFehlVed53NDkbAUH8z\n0HCD/5/6m738abHGGgYyVVwMPPlk1LkgolzQq5dqpshcjC5ObAOX2mKgphQYcbH68WvJUADv+U8n\nRhgwaBJ0FXu+VeGz5oEov4QZLJjVZGTq3BlYvtxForIYeOQDoGmWxXHc2NZaTzoxwoAhRwQdMIwa\npZoSdItToGPMOJdtwioiihch0m8wTj01GZxkGyUxaRLwi1+4PNmKwwFN8UI+YsBA2LEDKClRP2GJ\nIpA4+WRg2bJgOo8S5TqjI+Mxx0Sbj0yZtZFTpqTf3FiVJZnr2bBW0z92etRE1wXQag2FIC+w9eur\nPuRlKooAABEFSURBVAtDhgR3jjgoKQEuv5w1DERmGjUCtm0D/vSnqHNS14QJ5tuzlYsMEPRjwBAz\nRm/jTMZFzhh9kKpvXz3n5heMqLA1bKj/5uSCC/wdL4Qarp3KSVllts/8+Wq4N3nDgEETXV8yq3Q6\ndgRefhm4++66r11zjZ5zGzK/nEREXt17r7+bEbtjnZa9UqpZKo84wnteCh0Dhpix+vD37q0mQzKb\nMCXzGLO17EtKgIULs5/b+GL+97/2+fTr6KOBAw8E/u//gj8XEeUXPwGIWRn78MPe0yskDBhixi5a\nzvyiDBumLr6pevWqe1zTpkD37nry4MShh6rHYcPMX2/VCpgzB+jQwf+5iCh/ZSuP3JRVgwa5P4bS\ncZSEJro+hN26Od/30kuBf/3L2b6dO3vLj1ddu7JPBBEFI7VssSp7M8ufAQOs92cQ4QxrGGLGmCsA\nAG67Lfu+2YKFESOS69jvuy8wbZr9uY0vGL88RBQHhx4K3HOP9evZyiqvC2SRtcBqGIQQVwEYAeAQ\nADullHVWQxBCdAFwP4CfA/gJwBMAxkopufoHVBu/V6+8AqxfD7RuDdx1F9CunfNj+YUiojiorPR+\n7JYt5ttZw+BdkE0SpQCeATATwHmZLwohigC8BuBHAAMBdAQwCcAuAP8IMF+B0PWBs6vGd1PN36qV\nu/3ZhEBEucaq7LW64XJbVhcXAzU17o4B1GJd+SawJgkp5fVSyrsBzLHYZTiAngDOkFLOkVJOBXA1\ngIuEEAXbt8JJ25ybNNwYOlQ9FrGhiohizEk5uc8+5mWh23L18svd7W9o1MjbcXEW5aVhIIA5Usp1\nKdumAmgGoE80WYoXsw97kLUAN94IrFrFgIGIckPQ898ALA9TRflWtAewOmPb6pTXcorbD+5ddwWT\nDz+Ki931dSAiioLbG6e2bb2fi/0bklxV/QshbgFwRZZdJIBeUspvfeVKpZPVmDFj0KxZs7Rt5eXl\nKC8v93nqcFxyCTB6dN3tOpokiIgKQbbVKg0ffqiaJ/ycI1dVVFSgoqIibVtVVZXn9Nz2FbgdwKM2\n+yxymNYqAAMythn3t5k1D3WMHz8e/fr1c3gqIiIqREceab9Pvi5iZXYTXVlZibKyMk/puWqSkFKu\nl1J+a/Oz22FyMwH0FUK0Ttl2NIAqAN+4yVcc6IpCTzst++tOPrwDB+rJCxFRPrrwQvU4eTLw0Ue5\nXYsQpiDnYegCoCWAfQAUCyEOTrz0nZRyK4BpUIHBJCHEFQA6ALgRwL1Syuqg8hV3bduqyUq++MLb\n8cuXZ59uuWNH4McfvaVNRBSVV14BFixQv/ttujUmyOvWDTj8cOC776z3ZTCRFGSnxxsAVAK4FkCT\nxO+VAMoAIDE50/EAagB8BDVp02OJ/XOOlw+V1TjdTz8Fduwwf82uhqFTp+y9ej/7DJg+3Vn+iIji\nYsQI4K9/Td8mhPmCfHZGjwaGDAEOOkhP3gpFYDUMUspzAZxrs88yqKChIL3+upqNMbNDTkmJ+glC\nx47qh4goV6XeOE2a5H4Ru333Bd5/X2+eCkHBTpAUB40b142Oc7mDDRFRmIQA2msYhM9mB2c4JYUm\nQXzg+CEmIqrrN78B/vhH4He/05Mey1pnGDBE4J//9H6sVQ2E2yo5IqJc1aABMHEi0KRJ3de89Gnw\n4vDDwzlPnLBJIma8Nkl88w2wbZvevBAR5ZK1a4HSUr1pWtU+FGKtBAOGHGMVUDRvrn6IiApV69b2\n+5jJ14mbdGOThCZBLiN98cXu9iciKiRB3+3ffXf454wjBgwhKi0FOncGzs0YbPrBB0DTpup3swlJ\nWrZMbhsyJNg8EhHlmhUrgG99rGDUpYv1a0IAZ52Vvu2SS4Dbb7eeSydfMWDQxOmUzcuW1Z0HYdCg\n5Acydf4FszQ7dfKeRyKifNShA7D//t6PHzxYrdbr1F13qTUqCm0SPAYMmvht5xo3DpgyhQEBEVEU\nDjzQ+jUv5Xs+9n1gwBCQ445zt3+jRsCpp6ZvK8Q2MiKiKFiVt+edF24+4owBgyaZ0eTkycGlTURE\nwevfv+7U/U7l4w0fAwYiIip4ui/w+Xijx4BBEycfDq8foHyMVImIKLcwYNAkyGgyHyNVIqK4Y9mb\njgFDjLFmgYgoHLrL23wsvxkwaBJmJHr33cB994V3PiKifJdtRl0n5ftBB7k/JtcwYNAkzA/HX/4C\n/OlP4Z2PiCjfnXuuv3L80UeBK64Ann9eX57ihotPadajhxqGs9de6vkZZwBPPRVtnoiIyJlNm9Sj\n1WJ+y5aZb+/XT/1UVQWTrzhgDYMmRmR6yCHAtGlAURGwaxfwxBPJfY4/3l/aREQUrGbN1A+QLHtT\ng4fOncPPU1wwYNDE+GCldnQpLVWBAwC0aAFcfnn4+SIiIn+yrTNh1CYXAjZJaNK2rXo8+2zz1xs0\nyM9es0RE+eqkk+z3WbWqcGqBGTBo0rix/g8NAwwiomhUVztbwbJRo/TnRrndoIH+PEWNAQMREVGG\nEo9Xx6ZN1dD3007Tm584YMAQEi+1Dz17qsdf/UpvXoiIKDh/+UvUOQgGA4YY69KlcNrGiIjirLQU\nOO64qHMRLQYMIWF/BCKi3LVrV9Q5iB6HVRIREZGtwAIGIcRVQogPhRBbhRAbLPapzfipEUKcElSe\nosSmBSIiymVBNkmUAngGwEwA52XZ7xwAbwAwKu03BZgnIiIi8iCwgEFKeT0ACCHOsdm1Skq5Nqh8\nxAX7MBARUS6LQx+G+4QQa4UQnwghzo06M0FhkwQREeWyqEdJXA3gHQDbABwNYKIQorGU8t5os0VE\nRESpXAUMQohbAFyRZRcJoJeU8lsn6Ukp/5ny9EshRBMAlwFgwEBERBQjbmsYbgfwqM0+izzmBQA+\nAfAPIUQ9KWXWUa9jxoxBM2MN0oTy8nKUl5f7OH1w2IeBiIjCVFFRgYqKirRtVVVVntMTMuDG9USn\nx/FSypYO9v07gDFSytZZ9ukHYNasWbPQr18/jTkNjhBA+/bAypVR54SIiApZZWUlysrKAKBMSlnp\n5tjA+jAIIboAaAlgHwDFQoiDEy99J6XcKoQ4HkBbAB8D2AnVh+FKAOOCyhMRERF5E2SnxxsAnJ3y\n3IhkfgFgOoBqABcDGA81B8N3AEZLKR8KME9ERETkQZDzMJwLwHKYpJRyKoCpQZ2fiIiI9InDPAxE\nREQUcwwYiIiIyBYDhpCURD1FFhERkQ8MGEJwzz3AW29FnQsiIiLveN8bgosvjjoHRERE/rCGgYiI\niGwxYCAiIiJbDBiIiIjIFgMGIiIissWAgYiIiGwxYCAiIiJbDBiIiIjIFgMGIiIissWAgYiIiGwx\nYCAiIiJbDBiIiIjIFgMGIiIissWAgYiIiGwxYCAiIiJbDBiIiIjIFgMGIiIissWAgYiIiGwxYCAi\nIiJbDBiIiIjIFgMGIiIissWAgYiIiGwxYCAiIiJbDBgKREVFRdRZyEl839zje+YN3zf3+J6FK7CA\nQQixjxDiISHEIiHENiHEQiHEdUKI0oz9DhJCTBdCbBdC/CCEuCyoPBUyfrG84fvmHt8zb/i+ucf3\nLFwlAabdE4AAcD6A7wEcCOAhAI0AXA4AQoi9AEwFMA3ABQD6AnhUCLFRSvlQgHkjIiIiFwILGKSU\nU6GCAcMSIcTtAC5EImAAcCaAUgC/k1LuBjBPCHEogL9CBRdEREQUA2H3YWgOYEPK84EApieCBcNU\nAAcIIZqFmjMiIiKyFGSTRBohRHcAF0PVHhjaA1iUsevqlNeqTJJqAADz5s3TncW8VlVVhcrKyqiz\nkXP4vrnH98wbvm/u8T1zL+Xa2cDtsUJK6e4AIW4BcEWWXSSAXlLKb1OO6QTgPQDvSCkvSNk+FcAi\nKeUfU7b1BjAnM42U108H8JSrTBMREVGqM6SUk90c4KWG4XYAj9rss6fWQAjREcA7AGakBgsJqwC0\ny9jWNvG4GuamAjgDwBIAOxzkl4iIiJQGALoivY+hI65rGFwlrmoW3gHwGYCzZMbJhBAXArgJQDsp\nZU1i280ARkopeweWMSIiInIlsIBBCNEBwHSomoBzANQYr0kpVyf2aQpgPoA3AdwGNazyYQCXSCkf\nDiRjRERE5FqQAcM5AB7J3AxASimLU/brC+BeAAMArAMwQUp5eyCZIiIiIk8CbZIgIiKi/MC1JIiI\niMgWAwYiIiKylfMBgxBihBDi48QCVxuEEM9HnadcIYSoJ4SYLYSoFUIcFHV+4srpQmoECCEuEkIs\nTiwm97EQYkDUeYorIcSVQohPhRCbhRCrhRAvCCF6RJ2vXJN4H2uFEHdGnZc4E0J0FEJMEkKsS5Rj\nXwoh+rlJI6cDBiHESQCegBpZ0RfAkQBcTURR4MYBWA412RZZS11IrTeAMVBrovwzykzFjRDiVAB3\nALgWwKEAvgQwVQjROtKMxddgAPcAOBzAUVDr6kwTQjSMNFc5JBGQng/1WSMLQojmAD4EsBPAcAC9\nAPwNwEZX6eRqp0chRDHUkM2rpZSPRZub3COEOBZqEq6TAHwD4BAp5VfR5ip3CCEuBXChlLJ71HmJ\nCyHExwA+kVJeknguACyDGvk0LtLM5YBEYLUGwBAp5Yyo8xN3QogmAGYB+COAqwF8IaX8a/ajCpMQ\n4lYAR0gph/pJJ5drGPoB6AgAQohKIcSPQojXElNLUxZCiHYAHoBaLXR7xNnJVZkLqRW0RPNMGYC3\njW2JidreAnBEVPnKMc2havv4uXLmPgAvSynfiTojOeAEAJ8LIZ5JNH9VCiF+7zaRXA4YukFVE18L\n4AYAI6CqV95PVL+QtUcBTJRSfhF1RnJRykJq90edlxhpDaAYdad0Xw21kBxlkaiNuQtqCv1vos5P\n3AkhTgNwCIAro85LjugGVROzAMDRUGXXBCHEmW4SiV3AIIS4JdGBxeqnJtExyMj7TVLKFxMXv3Oh\nIvSTI/sDIuL0fRNC/AXAXlAzawIq6CpILj5rqcd0AvA6gKellJkTk1FdAuwj48REqP4xp0WdkbgT\nQnSGCq7OlFJWR52fHFEEYJaU8mop5ZdSygcAPAgVRDgW2vLWLjhd3Kpj4vc9a3VKKXcJIRYB2Dug\nvMWZk/dtMYBfABgIYKe6qdnjcyHEU1LKcwPKXxzpXEit0K2Dmv7dbDE5q4XkCIAQ4l4AxwEYLKVc\nGXV+ckAZgDYAZolkIVYMYIgQ4mIA9TPXLSKsRMq1MmEegFFuEoldwCClXA9gvd1+QohZUD0+DwDw\nUWJbKdQqXD8EmMVYcvG+/RnA31M2dYRatewUAJ8Gk7t4cvqeAXUWUjsvyHzlIilldeI7OQzAS8Ce\navZhACZEmbc4SwQLvwYwVEq5NOr85Ii3oEbFpXoM6gJ4K4MFUx9CXStTHQCX18rYBQxOSSl/EkLc\nD+B6IcRyqD/8cqjqz/9GmrkYk1IuT30uhNgKVW28SEr5YzS5irfEQmrvQY3KuRxAW+PGxlhIjQAA\ndwJ4PBE4fAo1/LQRVGFOGYQQEwGUAzgRwNZEZ2QAqJJS7oguZ/EmpdwKNbJrj0Q5tl5KmXkXTcp4\nAB8KIa4E8AzUUN7fQw1JdSxnA4aESwFUQ83F0BDAJwB+KaWsijRXuYcReXZHQ3Ua6gY1TBBIts0X\nWx1UaKSUzySGBt4A1TQxG8BwKeXaaHMWWxdCfYbey9h+LlSZRs6xDMtCSvm5EOI3AG6FGoK6GGpV\n6Clu0snZeRiIiIgoPLEbJUFERETxw4CBiIiIbDFgICIiIlsMGIiIiMgWAwYiIiKyxYCBiIiIbDFg\nICIiIlsMGIiIiMgWAwYiIiKyxYCBiIiIbDFgICIiIlv/D9hNeRGfNwOOAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(x, obs)\n", "plt.plot(x, gam.confidence_intervals(x), color='g')" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "OrderedDict([('mcfadden', 0.22847009061362966),\n", " ('mcfadden_adj', 0.22719884978976412),\n", " ('cox_snell', 0.77742061373698634),\n", " ('nagelkerke', 0.77850514449969777)])" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "gam._statistics['pseudo_r2']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Numerical Meth" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhAAAAFkCAYAAABxWwLDAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzt3XmcX3V97/HXJxsR0AAJSSAkYQm7FciICFfBshhAr0t7\nWx0We3HptRerxgKt2l4VF9paTKWValstInW8tLcLtFxTggoXBJEZoArBkIUlLAPJQADJOvneP87v\nRyaTmcyc3/zOnN/yej4e53Hmd37nnN9nziy/9+97vud7IqWEJElSHhPKLkCSJDUfA4QkScrNACFJ\nknIzQEiSpNwMEJIkKTcDhCRJys0AIUmScjNASJKk3AwQkiQpNwOEJEnKrdAAERFvjogbIuKJiNge\nEe8YYf13R8R/RMQzEbEhIn4cEW8tskZJkpRf0S0QewH3ARcDo7npxqnAfwDnAAuBHwI3RsRxhVUo\nSZJyi/G6mVZEbAfelVK6Ied2Pwe+l1L6QjGVSZKkvBq6D0REBPBqoK/sWiRJ0g6Tyi5gBJeSnQa5\nfrgVImI6sAh4BNg0PmVJktQSpgIHA0tTSuvzbNiwASIizgP+CHhHSmndblZdBPz9+FQlSVJLOh/4\nbp4NGjJARMR7gb8G/ltK6YcjrP4IwHXXXcfRRx9ddGktZfHixSxZsqTsMpqKx6w2Hrf8PGa18bjl\ns3z5ci644AKovJfm0XABIiI6gb8F3ptS+v4oNtkEcPTRR7Nw4cJCa2s106ZN85jl5DGrjcctP49Z\nbTxuNcvdBaDQABERewELgKgsOrRySWZfSunxiLgCODCl9FuV9TuBbwMfBe6OiFmV7TamlF4oslZJ\nkjR6RV+F8XrgXqCbbByIK4Ee4HOV52cDcwes/9vAROBrwJMDpj8vuE5JkpRDoS0QKaVb2U1ISSld\nNOjxrxZZjyRJqo+GHgdCxers7Cy7hKbjMauNxy0/j1ltPG7jZ9xGoixKRCwEuru7u+04I0lSDj09\nPXR0dAB0pJR68mxrC4QkScrNACFJknIzQEiSpNwMEJIkKTcDhCRJys0AIUmScjNASJKk3AwQkiQp\nNwOEJEnKzQAhSZJyM0BIkqTcDBCSJCk3A4QkScrNACFJknIzQEiSpNwMEJIkKTcDhCRJys0AIUmS\ncjNASJKk3AwQkiQpNwOEJEnKzQAhSZJyM0BIkqTcDBCSJCk3A4QkScrNACFJknIzQEiSpNwMEJIk\nKTcDhCRJys0AIUmScjNASJKk3AoNEBHx5oi4ISKeiIjtEfGOUWzzlojojohNEbEiIn6ryBolSVJ+\nRbdA7AXcB1wMpJFWjoiDgX8DbgGOA74K/G1EnFVciZIkKa9JRe48pfR94PsAERGj2OR3gNUppcsq\nj38REW8CFgM3F1Ol1NhWrFjBqlWruPnmm7nlllt46aWX2LJlC1OmTGHLli309vaydevWsstsOhMm\nTGDy5MnMmTPnleOYUmLPPffkpJNO4pJLLqG/v5+JEyfy6KOP0tvby+zZs5k3b94ry/v7+1mwYAEp\nJVatWsWCBQs4/PDDy/7WpHFRaICowRuBZYOWLQWWlFCLVKq+vj7OO+9Cli69CQh2NOIN/Fq12r4d\nNm/ezOrVqytLsgbZF154gZtvvoWbb76Z7FhTmW+vrDNwzqCvYdGic+nquo599923+G9CKlGjdaKc\nDfQOWtYLvCYi9iihHqk05513IcuW3UWW8yc61X2aPMTjacDxwD6V+ZTKNHj5PsB1wOmV564DHgOu\nY9myu+jsvGDoH6rUQhotQAyl+hHAj1xqGytWrGDp0pvo7z8D2FaZ+ivTwK+dap82D/H4U2Tdtj5Z\nmW8eZvlVwInAD4C/AM4H5gLn09//VZYuvYmHH3546B+u1CIa7RTG08CsQctmAi+klLbsbsPFixcz\nbdq0nZZ1dnbS2dlZ3wqlcbBq1arKV2tLrWNkk8j+ZA8EpgN7D5imDrH+FuDFAdMG4MnKtG0c6h3J\nzEHz4ZafCvx8wNcDnQbAypUr7Q+hhtLV1UVXV9dOyzZs2FDz/hotQNwJnDNo2Vsry3dryZIlLFy4\nsJCipPF22GGHVb46qNQ6djYPeAuwEDgWOBo4gKEbMjdVpoENh0F2OmDPIdbfTna2ciXZJ/z7gNuB\nFfUpfdSeGTQfbvltZC0Q1a/PH7DurQAsWLCggPqk2g31obqnp4eOjo6a9ldogIiIvYAF7DgNcWhE\nHAf0pZQej4grgANTStWxHr4OfCQi/gT4FnAG8N+Ac4usU2o0RxxxBIsWncuyZbfQ31/9My2jE+WR\nwAXAb5D9KW8ne5N/ALgGeBR4iqwFYR1Zq8IvyU4JDGci2RXerybrSzCnMs0FjgDOBP5nZb01wI1k\n/w5+PtTOxmASO7d6TAK+RNbH4YrKfHnlucHLP0p2lfnpwO+S/TxOA25l4sSPceaZ59r6oJZXdAvE\n64Efkv11JeDKyvJvA+8n6zQ5t7pySumRiHgb8BWyv9C1wAdSSoOvzJBaXlfXdXR2XlDSVRjHAZ8F\n3gU8D/wDcBnZp+u+Me67n+xUxnNkHQ//c4h19iI7NXAOWXj5aOW1P8koGiRHKTHw6ons8Qay1o8J\nZN9n9bPP1kHLJwAXVp4b+DWceWZ2FYbU6ooeB+JWdtNRM6V00TDb1NaeIrWQfffdl+9//995+OGH\nWblyJbfccgvLli3bZRyIp59+uo7jQOwBXA78HrAK+O/A98g6Eo6nXwL/tzJ9Angn8IfAj4FvAh+r\nrFO7CRNg8uQ9OOigg145jtk4EHtz0kkncemll7Jt2zYmTZr0yjgQs2bNYv78+a8s37Zt2yunKlau\nXOk4EGorkVJzX9wQEQuB7u7ubvtASGPQ2wvvfjf09MBnPwu/93sweXLZVe2wfTt861vw8Y/DnDnw\n/e/DIYeUXZXU3Ab0gehIKfXk2bYZLuOUVLBnnoFTT4U1a+C22+AP/qCxwgNkLQYf/CDce28WJk45\nBVaMdx9LSa8wQEht7uWX4eyz4YUX4Pbb4Q1vKLui3Tv8cLjjDth3XzjnHHj22bIrktqTAUJqcx//\nODz0UHZK4JWrRxvczJlw003w0kvwvvdBk5+JlZqSAUJqYzfeCH/zN3DVVXDccWVXk8/BB8M112TB\n5+tfL7saqf0YIKQ2tWlT1vpw1lnwgQ+UXU1tzjknq/3Tn4a+sV5dKikXA4TUpr72NXjsMfjqVyFi\n5PUb1Re/CFu3wuc/X3YlUnsxQEhtaNMm+LM/y/oPHH102dWMzaxZcMkl2WkMO1RK48cAIbWh73wn\nG/fhssvKrqQ+PvKRrBXl6qvLrkRqHwYIqQ391V/BO94BRx5ZdiX1MX06XHRR9n1ta4SbekptwAAh\ntZn7788GY2rWjpPD+dCHslaVpUvLrkRqDwYIqc1cc002jsLZZ5ddSX0ddxz8yq/AtdeWXYnUHgwQ\nUhtJCa6/Hjo7G2+o6rGKyDqF/uu/ZgNMSSqWAUJqIz098OST8M53ll1JMd71Lti8GW65pexKpNZn\ngJDayI03wrRp8KY3lV1JMRYsgKOOyr5PScUyQEht5MYbs9EbW+30xUBvfzv8279ld+yUVBwDhNQm\n+vqyUxit1nlysHPOya7GeOCBsiuRWpsBQmoTt9+ezU87rdw6ivbGN2YtLLfdVnYlUmszQEht4rbb\nYN687C6WrWzPPeHEEw0QUtEMEFKbuO02OPXUsqsYH6eeCrfeml22KqkYBgipDbz0Utb/oV0CxJvf\nnPWDWLmy7Eqk1mWAkNrAvfdCfz+cdFLZlYyPN7whm3d3l1uH1MoMEFIbuPde2GOP5r9192jNmJH1\n9zBASMUxQEhtoKcHXve61h7/YbCODgOEVCQDhNQGenpg4cKyqxhfHR3Z921HSqkYBgipxW3cCA8+\n2J4BYsMGWLWq7Eqk1mSAkFrcz36WdaA84YSyKxlfxx+fzX/+83LrkFqVAUJqcQ88kN3q+thjy65k\nfM2aBfvum7W+SKo/A4TU4pYvh/nzsxEa20kEHHOMAUIqigFCanEPPdQ+l28OZoCQimOAkFrc8uVw\n1FFlV1GOY47Jvv/+/rIrkVqPAUJqYZs3w+rV7d0CsWkTPPpo2ZVIrccAIbWwhx+G7dvbtwWiGpw8\njSHVnwFCamHLl2fzdm2BmDMHpk51LAipCIUHiIi4OCLWRMTGiLgrIk4cYf2PR8RDEfFyRDwWEV+J\niD2KrlNqRQ8/nF3KOGNG2ZWUY8IEOOQQA4RUhEIDRES8B7gS+AxwAnA/sDQihvx3FhHnAVdU1j8K\neD/wHuCLRdYptao1a+DQQ8uuolyHHWaAkIpQdAvEYuAbKaVrU0oPAR8GXiYLBkM5Gbg9pfS/U0qP\npZSWAV3AGwquU2pJa9Zkn8DbmQFCKkZhASIiJgMdwC3VZSmlBCwjCwpD+THQUT3NERGHAucC/15U\nnVIrM0BkAWLNGi/llOptUoH7ngFMBHoHLe8Fjhxqg5RSV+X0xu0REZXtv55S+pMC65Ra0rZt2eWL\nBgjYsgWefBLmzi27Gql1FBkghhPAkDfYjYi3AJ8iO9VxN7AAuCoinkopfWF3O128eDHTpk3baVln\nZyednZ31qFlqOmvXZp+62z1AVPuArFplgFB76+rqoqura6dlGzZsqHl/RQaIdUA/MGvQ8pns2ipR\ndTlwbUrp7yqPH4iIvYFvALsNEEuWLGFhu92vWNqNNWuyebsHiEMOye6LsXo1vOUtZVcjlWeoD9U9\nPT10dHTUtL/C+kCklLYC3cAZ1WWV0xJnkPV1GMqewPZBy7ZXNo0i6pRa1Zo12Rvn/PllV1KuPfbI\n7sz52GNlVyK1lqJPYXwF+HZEdJOdklhMFhKuAYiIa4G1KaVPVda/EVgcEfcBPwEOJ2uV+NdKB0xJ\no7RmDRx4YDaQUrubOxcef7zsKqTWUmiASCldX+kUeTnZqYz7gEUppWcrqxwEbBuwyefJWhw+D8wB\nngVuAP6wyDqlVvTII56+qDJASPVXeCfKlNLVwNXDPHf6oMfV8PD5ouuSWt3jj9tpsGruXFi6tOwq\npNbivTCkFvXEE9m9IATz5mV9IDwRKtWPAUJqQSlll3EedFDZlTSGuXPh5ZfhuefKrkRqHQYIqQU9\n9xxs2mQLRFX1VI79IKT6MUBILeiJJ7K5ASJjgJDqzwAhtSADxM5mz4ZJkwwQUj0ZIKQWtHZtNojU\nAQeUXUljmDgxGxPDACHVjwFCakFPPJGNvjh5ctmVNI4DD8xuqCWpPgwQUgvyEs5dHXAAPP102VVI\nrcMAIbUgA8SuDjgAnnqq7Cqk1mGAkFrQ2rUGiMFmzzZASPVkgJBakC0QuzrgAFi3DrZuLbsSqTUY\nIKQWs2ULrF+fdRrUDgcckI3Q+cwzZVcitQYDhNRiqm+Qs2aVW0ejmT07m9uRUqoPA4TUYnp7s7kB\nYmfVMTHsByHVhwFCajHVFoiZM8uto9HMnJkNrmWAkOrDACG1mGoLhAFiZ5Mmwf77ewpDqhcDhNRi\nenthn31gjz3KrqTxOBaEVD8GCKnFPPOMrQ/DcTRKqX4MEFKL6e21A+VwHExKqh8DhNRiDBDDmznT\ncSCkejFASC3GUxjD239/ePbZsquQWoMBQmoxtkAMb+ZMePFF2Ly57Eqk5meAkFpIf3/2CdsAMbT9\n98/mtkJIY2eAkFpIXx9s3+4pjOEYIKT6MUBILcRhrHfPACHVjwFCaiEGiN0zQEj1Y4CQWoj3wdi9\nPffMJi/llMbOACG1kN5emDoV9t677Eoal5dySvVhgJBayLp12RtkRNmVNK6ZMw0QUj0YIKQWsn49\nzJhRdhWNzRYIqT4MEFILWbcOpk8vu4rGZoCQ6sMAIbWQ9esNECMxQEj1YYCQWoinMEZmgJDqo/AA\nEREXR8SaiNgYEXdFxIkjrD8tIr4WEU9WtnkoIs4uuk6pFXgKY2T77w/PPw9bt5ZdidTcCg0QEfEe\n4ErgM8AJwP3A0ogY8jNSREwGlgHzgF8DjgQ+BDxRZJ1SK0jJUxijUR1Mat26cuuQml3RLRCLgW+k\nlK5NKT0EfBh4GXj/MOt/ANgHeFdK6a6U0mMppf+XUvpZwXVKTe/ll7O7THoKY/eqAcLBpKSxKSxA\nVFoTOoBbqstSSomsheHkYTb7r8CdwNUR8XRE/CwiPhkR9tWQRlD9RG0LxO5Vj09fX7l1SM1uUoH7\nngFMBHoHLe8lOzUxlEOB04HrgHOAw4GrK/v5QjFlSq1h/fpsboDYverxqR4vSbUpMkAMJ4A0zHMT\nyALGb1daK+6NiDnAJYwQIBYvXsy0adN2WtbZ2UlnZ+fYK5aaQPUN0VMYuzdtGkyYYAuE2k9XVxdd\nXV07LduwYUPN+ysyQKwD+oHB9wWcya6tElVPAVsq4aFqOTA7IiallLYN92JLlixh4cKFY6lXamqe\nwhidCRNg331tgVD7GepDdU9PDx0dHTXtr7C+BSmlrUA3cEZ1WURE5fGPh9nsDmDBoGVHAk/tLjxI\nyt4QJ0/2RlqjMX26AUIaq6I7J34F+O2IeF9EHAV8HdgTuAYgIq6NiC8NWP+vgOkR8dWIODwi3gZ8\nEvjLguuUml51EClvpDWy6dM9hSGNVaF9IFJK11fGfLic7FTGfcCilFJ1HLiDgG0D1l8bEW8FlpCN\nGfFE5es/LbJOqRU4iNTo7befLRDSWBXeiTKldDXZlRRDPXf6EMt+ApxSdF1Sq3EQqdGbPh1WrSq7\nCqm5Ob6C1CK8D8boeQpDGjsDhNQiPIUxep7CkMbOACG1CE9hjF61BSINNyKNpBEZIKQW4SmM0Zs+\nHbZtgxdfLLsSqXkZIKQWsHkzvPSSLRCjtd9+2dzTGFLtDBBSC3AY63y8oZY0dgYIqQV4I618bIGQ\nxs4AIbUA74ORj3fklMbOACG1AE9h5LPXXjBliqcwpLEwQEgtYP367C6Tg+5or2FEOBaENFYGCKkF\n9PVlt6ie4F/0qHlHTmls/HcjtYC+vh0dAzU6DmctjY0BQmoBBoj8PIUhjY0BQmoBBoj8PIUhjY0B\nQmoBBoj8PIUhjY0BQmoBBoj8PIUhjY0BQmoBBoj8pk+H55+H/v6yK5GakwFCagEGiPymT89u5/38\n82VXIjUnA4TU5DZuhE2bDBB5VY+X/SCk2hggpCZXfQM0QOTjDbWksTFASE3OAFEbb+ktjY0BQmpy\nBoja2AIhjY0BQmpyBojaTJ0Ke+5pC4RUKwOE1OSqb4D77FNuHc1ov/0MEFKtDBBSk+vry27jPWlS\n2ZU0H4ezlmpngJCanGNA1M4WCKl2BgipyRkgaudw1lLtDBBSkzNA1M4bakm1M0BITa6vb8eYBsrH\nFgipdgYIqcnZAlE7WyCk2hkgpCZngKjdfvvBhg2wbVvZlUjNxwAhNTkDRO2qx+2558qtQ2pGBgip\niW3ZAi+9ZIColffDkGo3LgEiIi6OiDURsTEi7oqIE0e53XsjYntE/FPRNUrNqPrJ2QBRG++HIdWu\n8AAREe8BrgQ+A5wA3A8sjYgZI2w3H/gycFvRNUrNyvtgjI0tEFLtxqMFYjHwjZTStSmlh4APAy8D\n7x9ug4iYAFwH/C9gzTjUKDUlA8TY2AIh1a7QABERk4EO4JbqspRSApYBJ+9m088Az6SU/q7I+qRm\nZ4AYmylTYO+9bYGQalH07XdmABOB3kHLe4Ejh9ogIv4LcBFwXLGlSc2v+sa3777l1tHMvB+GVJuy\nrsIIIO2yMGJv4DvAh1JKXlgljaCvL/sEPWVK2ZU0L0ejlGpTdAvEOqAfmDVo+Ux2bZUAOAyYD9wY\nEVFZNgEgIrYAR6aUhuwTsXjxYqZNm7bTss7OTjo7O2uvXmpwjgExdo5GqXbR1dVFV1fXTss2bNhQ\n8/4KDRAppa0R0Q2cAdwAUAkGZwBXDbHJcuBXBi37IrA38FHg8eFea8mSJSxcuLAeZUtNwwAxdrZA\nqF0M9aG6p6eHjo6OmvZXdAsEwFeAb1eCxN1kV2XsCVwDEBHXAmtTSp9KKW0BHhy4cUQ8T9b3cvk4\n1Co1FQPE2E2fDqtWlV2F1HwKDxAppesrYz5cTnYq4z5gUUrp2coqBwGORC/VwAAxdrZASLUZjxYI\nUkpXA1cP89zpI2x7USFFSS2grw8OPrjsKpqbfSCk2ngvDKmJ2QIxdvvtBy++CFu3ll2J1FwMEFIT\nM0CMXfX42Qoh5WOAkJpUfz88/7wBYqy8H4ZUGwOE1KSefz6bGyDGxvthSLUxQEhNyvtg1IctEFJt\nDBBSkzJA1Ef1PiK2QEj5GCCkJmWAqI/Jk+E1r7EFQsrLACE1KQNE/XhHTik/A4TUpNatgz33hFe9\nquxKmp+jUUr5GSCkJrVuHcyYUXYVrcHRKKX8DBBSkzJA1I8tEFJ+BgipSa1bt+MSRI2NLRBSfgYI\nqUmtX28LRL3YAiHlZ4CQmpSnMOrHFggpPwOE1KQMEPWz337wy1/C5s1lVyI1DwOE1IRSMkDUk3fk\nlPIzQEhN6MUXYetWO1HWi/fDkPIzQEhNaN26bG4LRH14R04pPwOE1ISqb3QGiPqwBULKzwAhNSFb\nIOprn32yuQFCGj0DhNSEqgHCPhD1MWkSTJvmKQwpDwOE1ITWrYO994apU8uupHVMn26AkPIwQEhN\nyGGs62/mTHj22bKrkJqHAUJqQo4BUX8zZ8Izz5RdhdQ8DBBSE/I+GPU3cyb09pZdhdQ8DBBSE7IF\nov5sgZDyMUBITejZZw0Q9VYNECmVXYnUHAwQUhPq7YVZs8quorXMnAkbN2Y31ZI0MgOE1GS2bs36\nQBgg6qt6PD2NIY2OAUJqMtVLDQ0Q9TVzZja3I6U0OgYIqclU3+AMEPVVDRC2QEijY4CQmszTT2dz\nA0R9TZ8OEQYIabQMEFKTqbZAVD8xqz4mTsyubDFASKMzLgEiIi6OiDURsTEi7oqIE3ez7gcj4raI\n6KtMN+9ufand9PZmd4/cY4+yK2k9jgUhjV7hASIi3gNcCXwGOAG4H1gaEcNdxX4a8F3gLcAbgceB\n/4iIA4quVWoGXsJZHAOENHrj0QKxGPhGSunalNJDwIeBl4H3D7VySunClNLXU0r/mVJaAXywUucZ\n41Cr1PAMEMWZNcurMKTRKjRARMRkoAO4pbospZSAZcDJo9zNXsBkoK/uBUpNyABRHFsgpNErugVi\nBjARGJzpe4HZo9zHnwBPkIUOqe0ZIIrjDbWk0ZtU0usGMOKI8xHxB8BvAqellLYUXpXUBAwQxTng\ngOxGZZs320lVGknRAWId0A8M/nc3k11bJXYSEZcAlwFnpJQeGOmFFi9ezLRp03Za1tnZSWdnZ66C\npUa2bVv2BmeAKMacOdn86adh/vxya5Hqrauri66urp2Wbdiwoeb9FRogUkpbI6KbrAPkDQAREZXH\nVw23XURcCnwKeGtK6d7RvNaSJUtYuHDh2IuWGlj1bpGzR3sCULlUA8QTTxgg1HqG+lDd09NDR0dH\nTfsbj1MYXwG+XQkSd5NdlbEncA1ARFwLrE0pfary+DLgcqATeCwiqp+1XkopeZ88tbW1a7P5QQeV\nW0erGhggJO1e4QEipXR9ZcyHy8lOZdwHLEopVW4JxEHAtgGb/A7ZVRf/OGhXn6vsQ2pb1Tc2A0Qx\n9tkHXvUqA4Q0GuPSiTKldDVw9TDPnT7o8SHjUZPUjNauhSlTsiGXVX8RcOCBBghpNLwXhtREnngi\na2aPKLuS1jVnjgFCGg0DhNRE1q719EXRDBDS6BggpCZigCjenDnw5JNlVyE1PgOE1ESqpzBUnGoL\nRBpxqDupvRkgpCaRki0Q42HOHNi4EZ5/vuxKpMZmgJCaRF8fbNpkgCha9fhWx9yQNDQDhNQkHnss\nm8+dW24dre7gg7P5mjWlliE1PAOE1CSqb2iHOFJKoWbPhqlTDRDSSAwQUpNYvRr23ttBpIoWkbVC\nrF5ddiVSYzNASE1izZqs9cFBpIp36KG2QEgjMUBITWL16uyNTcU75BADhDQSA4TUJKotECreIYdk\ngc2xIKThGSCkJrB9exYgbIEYH4ceCi+/DM8+O/K6UrsyQEhN4KmnYMsWWyDGS/U425FSGp4BQmoC\nDz2UzY84otw62sWCBdn8F78otw6pkRkgpCawfDlMmeIpjPGy994wf3523CUNzQAhNYHly+Hww2HS\npLIraR9HHw0PPlh2FVLjMkBITWD58uwNTePnmGNsgZB2xwAhNYEHH8ze0DR+jjkm60S5aVPZlUiN\nyQAhNbi+PujttQVivB19dHb5rB0ppaEZIKQG19OTzU84odw62s1rX5vN77+/3DqkRmWAkBrcPffA\nq1+ddaLU+HnNa+DII+GnPy27EqkxGSCkBtfdDQsXwgT/WsfdiScaIKTh+C9JanD33AMdHWVX0Z5e\n/3q4775sFFBJOzNASA3s6afhkUfgDW8ou5L2dOKJsHkz/OxnZVciNR4DhNTAfvSjbH7aaaWW0bYW\nLoSpU3f8HCTtYICQGtgPf5hdTjh7dtmVtKepU+HNb4Zly8quRGo8Bgipgf3gB/Crv1p2Fe3trLPg\n1luzUxmSdjBASA1q+XJYuRLOPrvsStrbmWfCxo1w++1lVyI1FgOE1KD+z//J7gp51lllV9Lejj8e\nDj4Yrr++7EqkxmKAkBpQSvC978Hb356dh1d5IuC974V/+Acv55QGMkBIDej22+GBB+ADHyi7EgGc\nfz489xz88z+XXYnUOAwQUgP68z/Phq4+/fSyKxFk98U44wz48pez1iFJBgip4fz0p/BP/wSf/rTD\nVzeS3//9bFjxf/mXsiuRGsO4/HuKiIsjYk1EbIyIuyLixBHW/42IWF5Z//6IOGc86pTKtnkzfPCD\n8LrXwQUXlF2NBjrzTDj3XPjYx7LTGVK7m1T0C0TEe4Argd8G7gYWA0sj4oiU0roh1j8Z+C7w+8C/\nA+cB/xIRJ6SUHiy63no65ZRTuPPOO8suQ00jgG+R/cqfyKRJ/znqLSdMmMCESnPF5MmTmT59OlOm\nTGHLli3MmzeP17/+9bz97W/nrLPO4pvf/Cbf/e53mTBhAq997Ws59thjmTdvHv39/SxYsIDDDz+c\nFStWsGoXJvv6AAANaklEQVTVqlceL126lJ/85CecfPLJnFXjZSHVfU6cOHGn18q7/eDtqrXNnTuX\nbdu20dvbC8Ds2bOZN28ejz76KDfddBP33HMPL730Ehs3bmTLli2kms5FzAd62G+/nwLvAOxVqdE7\n5phjeOCBB8ouo35SSoVOwF3AVwc8DmAtcNkw638PuGHQsjuBq4dZfyGQuru7U6P43Oc+lwAnpxzT\nfgn+MUF/gveOYT9RmU+ozCcOen5CZYoB60zYaZ3p02ft9Hjy5Fft8vzq1atH/fewfv36tGjRuUO+\n1qJF56a+vr4c2+/Yrru7e0CtMWCakHY+FvWezkiwMcEPEhzUAL87To09Df4bnJguvfTSsb7N1E13\nd3e1toUp7/t73g1y7RwmA1uBdwxafg3wz8Ns8yjw0UHLPgvcO8z6DRcgsl8YJ6eRpr0S/JcEVyZ4\nrjK9a4z7nFSZ71H5elqC6xI8NmDZHpVp3wTHpyy8VNc5ftA2+wx6fF2CaWn69Fmj/ntYtOjcNHHi\nfkO81nVp4sT90qJF545y+523y4LNtMp+9xji+9qjwJ/daQnWJngpwV8lOLPy8yz7d8qp8aZd/35g\n4ljfZupmLAGi6FMYM4CJQO+g5b3AkcNsM3uY9ZvibgCnnHIK0F959Clg2oBnY4gtBi8bzTq1btcM\nr1/kvst+fYC9gP0r0yFkZxGfITt18cfAs0NsU4vq7+DXgPOBbwLVsZi3VeZfAC4FrqusswK4b8Dj\npcDzAx5TmSfWr7+Qm2++ecTTGStWrGDp0puALw96rWxf/f2JpUsv5OGHHx7ydMaO7Qdvdz/9/V8G\nLq/sd6AvDLGs3m4FjgY+QXZ29sNkx3wt8BiwAXgB+GVleT+wfdA8FVxjo2m377fq7cCxla+zvx+4\nkGOPPbbpT2cU3gdiGEG+36YR11+8eDHTpk3baVlnZyednZ35qxuD+++/f8Cjs4FZg9YY6tsYvGw0\n69S6XTO8fpH7Lvv1NwK/AG4HVgM9lamfYpxamf9oiOdmDlpn1aDHPxn0uOo0AO68884RA8SqVdV9\nDn6tnfe1cuXKIQPEju0Hb1c9XjPZ1VDLivAi8DmyEPNa4A3AocBc4NVkn3n2IvsMNWHQfOI41dgo\nhgrT7eKQQY+z3/kVK1aMeyVdXV10dXXttGzDhg0176/oALGO7C998LvoTHZtZah6Ouf6ACxZsoSF\nCxfWUmNdHXfccQM6Tg7+pyeNt9vIPvW8hexT/EDPDFrnsEGPTxr0uOpWAE4++eQRX/2ww6r7HPxa\nO+9rwYIFI2w/eLvqG/Az7GqoZUVKwM8qkzTYwNYzqP7OH3HEEeNeyVAfqnt6eujo6Khpf4UGiJTS\n1ojoBs4AbgCIiKg8vmqYze4c4vmzKssb3o9//GMiymrYkaqNdZPIsvvFlcdvBfaoLKu++X4JOB74\naGWd0yqPLx7weJ9Bj28FPsL06bNGdTXGEUccwaJF57Js2RX09w9+rVuZOPFjnHnmucNejbFj+4/S\n3z9wu28yYcKr2Lr1C5Walw/Y6ksDlm3bdafSuNr17wcmNv3pC6DYTpQp6+T4m2Tttu8DjgK+AawH\n9q88fy3wpQHrn0x2bdQnyPpJfBbYBBwzzP4brhPlFVdcUe2U4uQ0zlPjXYXR19c3pqswdt5+x3b3\n3ntvSVdhODnlmQb/DbbOVRiRsjfhQkXE/wQuIzs1cR/wuymleyrP/QB4JKX0/gHr/zrwRbKLrh8G\nLk0pLR1m3wuB7u7u7oY4hTHQm970Ju64446yy1AbGDwOxIwZM5gyZQqbN29m/vz5dHR0vDIOxDXX\nXMN3vvOdncaBmD9/Ptu2bXtljIWHH36YlStXvvL45ptv5s477xzTOBDVfU6aNGmn18q7/eDtqrXN\nmzdvp3EgZs2axfz583cZB+Lll18ewzgQUu0acRyIAacwOlJKPXm2HZcAUaRGDhCSJDWysQQIR9qX\nJEm5GSAkSVJuBghJkpSbAUKSJOVmgJAkSbkZICRJUm4GCEmSlJsBQpIk5WaAkCRJuRkgJElSbgYI\nSZKUmwFCkiTlZoCQJEm5GSAkSVJuBghJkpSbAUKSJOVmgJAkSbkZICRJUm4GCEmSlJsBQpIk5WaA\nkCRJuRkgJElSbgYISZKUmwFCkiTlZoCQJEm5GSAkSVJuBghJkpSbAUKSJOVmgJAkSbkZICRJUm4G\nCEmSlJsBQpIk5WaAaGNdXV1ll9B0PGa18bjl5zGrjcdt/BQWICJi34j4+4jYEBHPRcTfRsReI6x/\nVUQ8FBG/jIhHI+KrEfGaompsd/6h5ecxq43HLT+PWW08buOnyBaI7wJHA2cAbwNOBb6xm/UPBA4A\nPgG8Fvgt4GzgbwusUZIk1WBSETuNiKOARUBHSuneyrLfBf49Ii5JKT09eJuU0gPAbwxYtCYiPg18\nJyImpJS2F1GrJEnKr6gWiJOB56rhoWIZkICTcuxnH+AFw4MkSY2lkBYIYDbwzMAFKaX+iOirPDei\niJgB/CG7P+0BMBVg+fLlNZTZ3jZs2EBPT0/ZZTQVj1ltPG75ecxq43HLZ8B759S820ZKafQrR1wB\n/P5uVklk/R5+HXhfSunoQds/A/xhSumvR3idV5O1WDwLvDOl1L+bdc8D/n5034EkSRrC+Sml7+bZ\nIG8LxJ8BfzfCOquBp4GZAxdGxERgX6B3dxtHxN7AUuB54Nd2Fx4qlgLnA48Am0ZYV5Ik7TAVOJjs\nvTSXXC0Qo95p1onyAeD1AzpRvhW4CThoqE6UlXVeTfZNbATOTSltrntxkiRpzAoJEAARcRNZK8Tv\nAFOAbwF3p5QurDx/IHALcGFK6Z5Ky8MysjT0buDlAbt71o6UkiQ1jqI6UQKcB/wlWSjYDvwj8LEB\nz08GjgD2rDzuAE6sfL2yMg+yfhWHAI8VWKskScqhsBYISZLUurwXhiRJys0AIUmScmu5ABERb4uI\nuyLi5Yjoi4h/KrumZhERUyLivojYHhGvK7ueRhUR8ys3h1td+T17OCI+GxGTy66t0UTExRGxJiI2\nVv4uTxx5q/YVEZ+MiLsj4oWI6I2If46II8quq5lUjuH2iPhK2bU0uog4MCK+ExHrKv/L7o+IhaPd\nvqUCRET8OnAt8E3gV4BTyG7qpdH5U2AtWcdVDe8osg6+HwKOARYDHwa+WGZRjSYi3gNcCXwGOAG4\nH1haGWVWQ3sz8BdkQ/6fSdbZ/D8i4lWlVtUkKgH1Q2S/a9qNiNgHuAPYTHbvqqOB3wOeG/U+WqUT\nZWWgqkeAP0opXVNuNc0nIs4hGyjs14EHgeNTSv9ZblXNIyIuAT6cUlpQdi2NIiLuAn6SUvpY5XEA\njwNXpZT+tNTimkQlbD0DnJpSur3sehpZZSiAbrKhA/4IuDel9Ilyq2pcEfHHwMkppdNq3UcrtUAs\nJLslOBHRExFPRsRNEXFMyXU1vIiYBfw1cAHZIF7Kbx+gr+wiGkXldE4H2VgvAKTs08oyspvtaXT2\nIWsR9HdrZF8Dbkwp/aDsQprEfwXuiYjrK6fLeiLig3l20EoB4lCyZuXPAJcDbyNrirm10lSj4f0d\ncPWgu6dqlCJiAfAR4Otl19JAZgAT2XXo+l5GeUO9dldpsflz4PaU0oNl19PIIuK9wPHAJ8uupYkc\nStZa8wvgrWT/v66KiAtGu4OGDxARcUWlQ8xwU3+lk1H1e/lCSulfKm+GF5Gl998o7RsoyWiPW0R8\nFHg18CfVTUssu1Q5ftcGbjMH+L/A/04pfaucyptKdXA4jexqsj427y27kEYWEQeRBa0LUkpby66n\niUwAulNKf5RSur9yk8u/IQsVo1LkSJT1MtobeB1Y+fqVe5OmlLZExGpgXkG1NbLRHLc1wK8CbwQ2\nZx94XnFPRPx9SumiguprRKP9XQNeGY79B2SfEP9HkYU1oXVAPzBr0PKZjHBDPUFE/CVwLvDmlNJT\nZdfT4DqA/YHu2PFPbCJwakR8BNgjtUpnv/p6igHvlxXLgV8b7Q4aPkCklNYD60daLyK6yXqTHgn8\nuLJsMtldxh4tsMSGlOO4/S7w6QGLDiS7odlvAncXU11jGu0xg1daHn4A/BR4f5F1NaOU0tbK3+QZ\nwA3wSpP8GcBVZdbW6Crh4Z3AaSklh/Af2TKyq+4GuobszfCPDQ/DuoPs/XKgI8nxftnwAWK0Ukov\nRsTXgc9FxFqyg3AZWXPpP5RaXANLKa0d+DgifknWzLw6pfRkOVU1tog4APgR2VU/lwEzqx98Ukp+\nut7hK8C3K0HibrLLXfck++euIUTE1UAn8A7gl5UOzgAbUkqbyquscaWUfkl25dgrKv/H1qeUBn/C\n1g5LgDsi4pPA9WSXDn+Q7DLYUWmZAFFxCbCVbCyIVwE/AU5PKW0otarmY2LfvbeSdUA6lOyyRNhx\nbn9iWUU1mpTS9ZXLEC8nO5VxH7AopfRsuZU1tA+T/R79aNDyi8j+r2l0/B82gspdsN8N/DHZZa9r\ngI+llL432n20zDgQkiRp/DT8VRiSJKnxGCAkSVJuBghJkpSbAUKSJOVmgJAkSbkZICRJUm4GCEmS\nlJsBQpIk5WaAkCRJuRkgJElSbgYISZKU2/8Hww428i6mT+sAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "x = np.linspace(-5,5,5000)[:,None]\n", "\n", "log_odds = -5*x**2 + 5# quadratic\n", "# log_odds = 10*x# -5.77104596# linear\n", "p = 1/(1+np.exp(-log_odds)).squeeze()\n", "\n", "obs = (np.random.rand(len(x)) < p).astype(np.int)\n", "# obs[len(x)/2:] = obs[:len(x)/2][::-1]\n", "\n", "plt.plot(x, p)\n", "plt.scatter(x, obs)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from pygam import LogisticGAM" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false, "scrolled": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "links.py:46: RuntimeWarning: divide by zero encountered in divide\n", " return np.log(mu / (dist.levels - mu))\n", "links.py:46: RuntimeWarning: divide by zero encountered in log\n", " return np.log(mu / (dist.levels - mu))\n" ] }, { "data": { "text/plain": [ "LogisticGAM(lam=1, n_iter=50, n_knots=50, spline_order=1, \n", " callbacks=[Deviance(), Diffs(), Accuracy()], tol=1e-05, \n", " penalty_matrix='auto')" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lgam = LogisticGAM(lam=1, n_iter=50, n_knots=50, tol=1e-5, spline_order=1, penalty_matrix='auto')\n", "lgam.fit(x, obs)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# plt.plot(p)\n", "plt.scatter(x, obs)\n", "plt.plot(x, lgam.predict_proba(x))\n", "plt.plot(x, p)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(lgam.logs['deviance'])" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(lgam.logs['diffs'])" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nqtv/D9sj6cmwTArRAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(lgam.logs['accuracy'])" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[,\n", " ]" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nEgAAoGT/H57tZ73pwnBUAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(lgam.predict_proba(x))\n", "plt.plot(lgam.confidence_intervals(x, .99), color='g')" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[,\n", " ]" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\noWMP1bS9psW2+dSIT6W2+NM5pw83xqeaNnZu1OIPF8em0jZ3bdYbq9+IDWydc1r+0XJ1dhU/0ZKk\nD974IL7TnlUyIzFD0hzn3FxJMrOLJZ0q6UJJMwu0/7ak/3DO3ZT9+UozmyrpUknfinujR956RAM7\nC1fUr9u8rlc5aV+GDxpe8g9l5OCRGtE8QhnLyGTRf822/pz//z0fy/+5ubFZzY2fTLf2PPA61+Pn\nmMdLPffjzo+1dtNaSdLzy5/XGb88Y7vfa9WGVXp33buxv/uydct6lW82mU7b57Sij58w4QQdPe5o\nff+Y75d8rSTZ2Llx6/I91I8hA4aos7tTnV2dampo6u/u9NrN027WzdNujm1z98t3658X/rPWd6wv\n2ua55c/p7lfu1v969H+VfM+42b+1b67Vvj/bd7tLfxc6qei5j+rPdus71mvlxyu3296zTW4FmA+l\njjPDBg7TTs07xbbZ8Bd//emNsgIJM2uSNFnStbltzjlnZg9LOrLI045UNIORb56k00u9372t92rS\npEnldHEbGzo3aGn70tg27ZvatWTtkpKvs2TNktgDZWd3p95d9646uzrl5NTtuuVc9N/cv9zPPR/v\n+fOGzg1b7wORr+eMSKEz9nLbZCyjMUPGRBXs6i4YfI1oHqHDdzlcOwzYoejvL0mTdp6k8cPHx7bZ\nY/ge2rF5x9g2tWjTlk3b1T+g9g1pGiJJuuDeC2IDifEt43Xl8VfW1KzlWfufpbP2j5+N6Ojq0Msf\nvFzwIJuzdtNaPf/e87FnyXPvmau/2u2vCrYpNGa92beFaGcy7TZst5JXvx0/fLyGDhga22b3lt21\n0+D4AGDU4FFe9iMLFy7U5GsnV/06vVXujMRISQ2SeoZoKyVNLPKcsUXaF85ZRAZJ0t2P363nlxct\nvdhG3HR5zJN6bVftWvJ99mjaQyqwr4n7Iyymkt+nojHI807DO/rckM8VfnBz9C/ud1m2bpmWaVls\nv55U8WVt2zwn0Jh1dHWUvLfByx+8XHLqcs1ba7RqzCotHFx8KrmQ9vZ2LVxY3nNQnXLGfNC6QTrc\nDtefF/25aJv1Het16+pb9ceFf4yt2WlubNbEkRMLrtwplsYrFpgUTfsV3ezn9Yu1zyijgdp+9jj3\nOo0djTq46+DCr5/3Zxvbn0J/3oWau172P/9949qvK/jQNtauWau1Wlv8dWRaruXx/enRvsgDvWq/\n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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(lgam.prediction_intervals(x, .95), color='g')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# GCV Loop" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "utils.py:134: RuntimeWarning: divide by zero encountered in divide\n", " left = ((x - aug_knots[:maxi]) / (aug_knots[m-1:maxi+m-1] - aug_knots[:maxi])) * bases[:,:maxi]\n", "utils.py:134: RuntimeWarning: invalid value encountered in divide\n", " left = ((x - aug_knots[:maxi]) / (aug_knots[m-1:maxi+m-1] - aug_knots[:maxi])) * bases[:,:maxi]\n", "utils.py:134: RuntimeWarning: invalid value encountered in multiply\n", " left = ((x - aug_knots[:maxi]) / (aug_knots[m-1:maxi+m-1] - aug_knots[:maxi])) * bases[:,:maxi]\n", "utils.py:137: RuntimeWarning: divide by zero encountered in divide\n", " right = ((aug_knots[m:maxi+m]-x) / (aug_knots[m:maxi+m] - aug_knots[1:maxi+1])) * bases[:,1:maxi+1]\n", "utils.py:137: RuntimeWarning: invalid value encountered in divide\n", " right = ((aug_knots[m:maxi+m]-x) / (aug_knots[m:maxi+m] - aug_knots[1:maxi+1])) * bases[:,1:maxi+1]\n", "utils.py:137: RuntimeWarning: invalid value encountered in multiply\n", " right = ((aug_knots[m:maxi+m]-x) / (aug_knots[m:maxi+m] - aug_knots[1:maxi+1])) * bases[:,1:maxi+1]\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "scores = []\n", "lams = np.logspace(-2,1, 21)\n", "for lam in lams:\n", " lgam = LogisticGAM(lam=lam, n_knots=25)\n", " lgam.fit(x, obs)\n", " scores.append(lgam._statistics['UBRE'])\n", "\n", "plt.plot(lams, scores)\n", "best = np.argmin(scores)\n", "plt.scatter(lams[best], scores[best], facecolor='None')\n", "plt.title('Best Lam: {}'.format(lams[best]))" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "LogisticGAM(lam=1.259, n_iter=100, n_knots=20, spline_order=4, \n", " callbacks=[Deviance(), Diffs(), Accuracy()], tol=1e-05, \n", " penalty_matrix='auto')" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lgam = LogisticGAM(lam=lams[best])\n", "lgam.fit(x, obs)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "6.783812081178338" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lgam._statistics['edof']" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(x, lgam.confidence_intervals(x, width=0.95), '--', c='b')\n", "plt.plot(x, lgam.predict_proba(x))" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgQAAAFkCAYAAABfHiNRAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzt3Xec3FW9//HXyWaTkIRsSC+kkELoJQEuoShFmihwEcHQ\nFKQJXL25eFWUJniFKwrCT7kgIEU0gKKIVCEISAklgVBCCUkgpGeTzaaX3T2/Pz77dTfJ7s75fmdm\n5zsz7+fjsY9JhvOdObtsZt7zOc157xEREZHy1qHQHRAREZHCUyAQERERBQIRERFRIBAREREUCERE\nRAQFAhEREUGBQERERFAgEBERERQIREREBAUCERERIUEgcM4d7Jx7xDk33znX4Jw7LuCaQ5xzU51z\n651zHznnvp6suyIiIpIPSSoE3YC3gIuAjAchOOeGA48Ck4E9gZuAO5xzRyR4bhEREckDl83hRs65\nBuAE7/0jbbT5X+AY7/0eze6bBFR577+Y+MlFREQkZ9pjDsH+wDNb3PcUML4dnltEREQCdGyH5xgA\nLN7ivsVAD+dcZ+/9hi0vcM71Bo4CPgHW572HIiIipaMLMBx4ynu/LPSi9ggELXGNt62NVxwF/L6d\n+iIiIlKKTgP+ENq4PQLBIqD/Fvf1A1Z67ze2cs0nAPfddx8777xzHrtWWiZOnMiNN95Y6G4UnVL/\nub3+Olxwgf25e3fo2RO23Ra6dLGvzp3h6quhW7fWH+O55+DDD6GiAjp0gMcem8ixx95IQwM0NMDg\nwXDssW3344c/hJUrYf16+6qpgepqqKuz/37llXBcxjVLxa3Uf9fyQT+z+N5//31OP/10aHwvDdUe\ngeAV4Jgt7juy8f7WrAfYeeedGTt2bL76VXKqqqr080qg1H9uu+4Kxx8PffpAx4T/4rf88cydW8Wv\nfhXvZ/bkk1vf5z2sWAHz58PAgdC7d7L+FYtS/13LB/3MshJryD32y4Nzrhswiqay/wjn3J7Acu/9\nZ865a4FB3vtor4FbgYsbVxv8FjgcOAnQCgORLHgPd98NU6bAbbe13q5zZxgwINlzNDTYm/XcubBs\nmX2qX7ECZs2CX/zC2lRWwnbbQa9e0LcvjB5tfw/hnLUNaV9fbxUKEcmPJJ8X9gH+gY3/e6DxZYF7\ngLOxSYRDosbe+0+cc8cCNwDfBuYB3/Teb7nyQEQCbdpkwwC//S2ceab9vbIyu8fcsMHCxeuv29f0\n6TBnDmzcYmCvSxcr8199tf1940YbAmiuTx/YbTc4+GA45BC7zaZ/1dX2OD//ORx9dPLHEZHWxQ4E\n3vvnaWO5ovf+rFauGRf3uURkaw0NFgIeesgqBF/PYt/PdevscR56CJ55BlavtrkEY8fCUUfZp/0R\nI2DYMHuT79nTKg7HHQePPLL549TUwKJFMHMmfPQRTJ0Kt9wC11xjQwEnnwzf/jbstFP8fnbuDDvs\nACecAI89Bocfnvx7FpGWFWqVgeTBhAkTCt2FolRsP7cf/xgeeAAefBBOOinZYyxZAj/7Gdx5pw0B\nHHCATfo7+mjYY4/Mpfktf2bbbGNfgwZtPt+gocEqDfffD/fdB7feCl/9qn3SHzKEYNtuC3/6kwWR\nk0+GN9+EoUNjfMMpUWy/a2mgn1n7yWqnwnxxzo0Fpk6dOlWTSUSaeeUVOOgguOoquPzy+NfX1dmb\n8U9+Ym/63/oWnHMOjBqV865uZcMGuPde6/vKlfDLX8I3vxnvMZYvh733tqrFs8/aHAQR2dy0adMY\nN24cwDjv/bTQ63TaoUiRqK+3eQPjxsGll8a//tNPrRLwox/B+efD7Nlw3XXtEwbAyv7nngszZsAp\np1gQufhi+75C9eoFt99uyyDvvz9vXRUpSxoyECkS8+bB2rW2oiDu8sHXX4cvf9nK+q+8Avvtl58+\nhqiqgjvugH33hQsvtPkHt99u+xuEOPJIm0vwox/Z8EPSpZQisjn9UxIpEsOGwQcfxF96N326vYnu\ntJNNBOzbNz/9i+v8820C45ln2tyDa64Jv/aKK2yuwsMPJ59HISKbUyAQKSJxw8CCBbZaYORI2xio\nqio//Urq9NOt8nHppbD//pl3O4zsvbcNGxx0UF67J1JWNIdApETV1cGpp1qIePzx9IWByPe+Z0Hg\nnHOgtjb8us9/XhsVieSSAoFIibr5ZvjnP2HSJOjXr9C9aV2HDrYccfVqmxcgIoWhQCBSgubPt8OC\nLroIPve5Qvcms+23t3kBt91mqx9EpP0pEIiUoMsvtxUF0fbCxeCii2w3xJ/8pNA9ESlPCgQiJeaT\nT+B3v4Mf/MC2Gi4WXbvC979vmxctWFDo3oiUHwUCkRR78007D2DTpvBrrr/egsD55+evX/ly1lm2\ngdEddxS6JyLlR4FAJMUmTbISeujmO6tX2yfsb33L1vgXm6oqOO00+M1vbJVEqPr6eO1FZGsKBCIp\nNnkyHHZY+J79DzwAa9bEPyMgTc45xyZFvvBCWPuFC21L46efzm+/REqdAoFIStXW2pDBYYeFX3Pn\nnbYr4bBh+etXvu27LwwfDn/8Y1j7AQNs/sHzz+e1WyIlT4FAJKXeeAO8h/Hjw9p/9pmdU3DGGfnt\nV745Z2cUPPRQ2DCAc7ZJ0T//mf++iZQyBQKRlHr9ddh2WxgzJqz9X/9qcw1Ct/9Ns698BZYuhSlT\nwtrvt59VUzSPQCQ5BQKRlHrtNdhnn/BTAP/yFxteKKalhq3ZZx/YbrvweQH77GOnJr7/fn77JVLK\nFAhEUur11208PURtrY2hn3BCfvvUXioq4PDDwwPB3nvb0MEbb+S3XyKlTIFAJIU2bLAy+KGHhrV/\n4QVbenfkkfntV3s68kh49VVYsSJz22hoZerU/PdLpFQpEIikUOfONqnu6KPD2v/jHzBkCIwYkd9+\ntafDD4eGhvDJguPGKRCIZCNwuxMRSbPnnrNqQuh+BcVghx2gf3+bWPjlL2duf8UV+e+TSClThUCk\nyNXUwFtvhQ8vFAvnYP/9w1ca7LijfYlIMgoEIkVuyhTbr+Dggwvdk9wbP95WW9TXF7onIqVPgUCk\nyL3xhi3RK6X5A5H997fzGd57r9A9ESl9CgQiRe6NN2wdfinNH4hE35eWE4rknwKBSJGbOtVm2Jei\nbt1g5Eh4551C90Sk9CkQiKRMTQ2sWhXWduFCOxlwn33y26dC2mMPePvtQvdCpPQpEIikzHXX2Ztg\niGjdfakHgunTbeKkiOSPAoFIysyebWXyEO++C1VVMHRofvtUSHvsAcuWwaJFmdsuWQL/+Z/w8cf5\n75dIqVEgEEmZOIFgxgzYeefSnFAYiaolIcMGFRVw0022L4OIxKNAIJIi3sOsWeFLCGfMgF12yW+f\nCm2HHWCbbcKWHvbqZRWTWbPy3y+RUqNAIJIiNTV2cmFIIGhosON+CxEI6utt4mNdXf6fq0MHGD0a\nZs7M3NY5q64oEIjEp0AgkiKzZ9ttSCD47DNYu7b9AkFDAzz4IBxxhJ0u2KMH3HBD+zx3aCAA+9kp\nEIjEp0AgkiLRG1nIHIIZM+x2553z15/I7Nlw0EFwyil2NPPVV8OkSXDqqfl/brAzCj76KKytKgQi\nyei0Q5EUmTMHeva0r0xmzICuXfO/wuCFF+Df/922R/7HP+CQQ/L7fC3ZccemikjXrm233WEHa1tX\nBx31CicSTBUCkRQ591w7yjjEzJlWSu+Qx3/FixbBscfCnnvC668XJgyAfZ8Q9sl/6FAb3li4ML99\nEik1CgQiKdK7t735hoizPDGpAQPgnnvg0UetQlAo0bHGIcMGo0bBMcfApk357ZNIqVEgEClSc+ZY\neTzfTjwxc5l+Sx9/DA89lLs+9OljywlDJhaOHg2PP16apz+K5JMCgUgRqq+HTz5J75vezTfD2Wfb\nzoG54BwMH27fs4jkhwKBSBGaN88mzaU1EFxxhb2JX3ll7h5z2DD49NPcPZ6IbE6BQKQIxdmvoBD6\n9IHLLoPbb8/dm7gCgUh+KRCIFKE5c+wT+LBhhe5J6y64wDYv+uUvc/N4USDQqYci+aFAIFKEZs+G\nwYOhc+fcPWZ9vZ0qmCvdu8PFF1uVoKYm+8cbNsz2IchlH0WkiQKBSEo8+SRce21Y29mzc7/C4A9/\nsCGIXE0EBLjoItvZ8Pe/z/6xomqIhg1E8kOBQCQlnngCfve7sLaffZbb4QLv4frr4eCDoV+/3D1u\n//7wpS/BnXdm/1hxA8HGje1z+JJIqVAgEEmJ+fNtGCDEvHmw/fa5e+7Jk+Gdd+CSS3L3mJGrr4Z7\n783+cfr2tWOQ587N3PaDD2w45dVXs39ekXKhnb5FUmLhQttlL5OGBgsPuQwEN9wAe+2Vn62Jd989\nN4/jnG1LHFIhiKoc2r5YJJwqBCIpsXixldgzqa62bXlDqwmZfPKJDVd85zv2pptmgwfDggWZ2223\nHXTqpEAgEocCgUhKhAaCefPsNlcVgnvusRUBX/1qbh4vnwYNCgsEztk5DIsW5b9PIqVCgUAkBdau\nhdWrwwLB/Pl2m4sKQUMD3H03nHwydOuW/ePl28CB4Z/647QVkYSBwDl3kXNujnNunXNuinNu3wzt\n/9M594Fzbq1zbq5z7gbnXA5XUIsUt8WL7Ta0QtCxY25WA1RXW7A466zsH6s9RBWCkM2JFAhE4ok9\nqdA5dwrwC+A84DVgIvCUc25H7311C+1PBa4FvgG8AuwI3AM0AN9N3HORElJXBwcdZJPmMpk3z94Y\nKyqyf95+/eDFF7N/nPYyaBCsWwe1tdCzZ9ttBwyAKVPap18ipSBJhWAicJv3/l7v/QfABcBa4OxW\n2o8HXvTeP+C9n+u9fwaYBOyXqMciJWj0aPjnP2HMmMxt4yxPLDWDBtltyDwCVQhE4okVCJxzlcA4\nYHJ0n/feA89gb/wteRkYFw0rOOdGAF8EHkvSYZFyl+s9CNrTuefCf/5n8uujQBDyRn/qqTBpUvLn\nEik3cSsEfYAKYPEW9y8GBrR0gfd+EnAl8KJzbiMwE/iH9/5/Yz63iGCBoFgrBF26wKOPJr9+4EC7\nDakQjBoFhx6a/LlEyk2uNiZyQIvTfJxzhwA/xIYWXgNGATc75xZ673/S1oNOnDiRqqqqze6bMGEC\nEyZMyEWfRYrSggVNn5SLzec+B7/6lS0HHNDiR4i2bbONzR0ICQQi5WDSpElM2qIUVltbm+ix4gaC\naqAe2HIudD+2rhpErgbu9d7f1fj395xz3YHbgDYDwY033sjYsWNjdlGkdK1bB6tWJXszTYPxjQOL\nL78MJ56Y7DFC9yIQKQctfUieNm0a48aNi/1YsYYMvPebgKnA4dF9zjnX+PeXW7msK7aioLmGxktT\nvi+aSLpEJxGGLE9Mo+23t5UUL7f2ahFAgUAkP5KsMrgBOM85d6ZzbifgVuxN/24A59y9zrmfNmv/\nN+BbzrlTnHPDnXNHYFWDvzZOSBSRQNF+BdnuQfDYYzBrVvb9SeLAA7MLBNqBUCQ/YgcC7/2DwCXY\nm/qbwB7AUd77pY1NtmfzCYbXYPsWXAO8B9wOPIHNKRARwjbagXgbGLWmvh7OOCP8qOVcO+AAmDoV\n1q9Pdn2/frB0aeZ2IhJPop0Kvfe3eO+He++38d6P996/0ey/Hea9P7vZ3xu899d473f03ndrvO7b\n3vuVufgGRIrdunW2bfBDD2Vuu3ix7dPft2/y55s2DWpq4Igjkj9GNvbfHzZuhLfeSnZ9v35NQyci\nkjs6y0CkwJYts1DQtWvmtkuWQO/etnVxUi++aMv/9m1zw/H82W032x9g9Ohk1/fta4Fm06bMbZ99\nFv74x2TPI1JuFAhECqy6ccPv3r0zt128OPv5Ay+9BPvtZ8cDF0KXLvC1r4V9vy2Jvv/qrTZK39r9\n98P/ascTkSAKBCIFtmyZ3fbpk7lt6BHJrfHeAsEBByR/jEKLhktChg0030AknAKBSIHFqRAsWZJd\nIPjkE5uhX8yBIKoQhLzR9+2rQCASSoFApMCqq21OQI8emdtmO2QQLfcb39rJI0Ug+v5DKgR9+9r8\njDVr8tsnkVKgQCBSYMuW2XBByDZd2Q4ZrF4NBx8cNjyRVt262RbGoYEAVCUQCaFAIFJg1dVhwwV1\ndRYesgkE558PL7yQ/Pq0CJ0bEGe+gUi5y9XhRiKS0Omnwxe+kLld9AZYrNsW51LfvqoQiOSaAoFI\nge23X1i7XG1bnBavvQZPPQWXXx7/2jgVggEDwvYsECl3GjIQKRLRG2CpBIL33oMrr4S1a+NfG7pb\nYadOsHAhnHBC/OcQKTcKBCJFItqvIOmGPmmzyy62L8KHH8a/NnTIQETCKRCIFIlly6CyErp3L3RP\ncmOnnex2xoz41+o8A5HcUyAQKRLLlll1IGR5YjGoqoLBg5MFgt69YdUqzQ0QySUFApEiEQWCJDZu\ntK+02XlneP/9+NdFP4fly3PbH5FypkAgUiSyCQTPPGOnKS5YkNs+ZWunnZLNIejVy24VCERyR4FA\npIAWLIA//xnWr8/cNptAMGOG7e43cGCy6/Nl1CiYPRsaGuJdFwWCaKKliGRPgUCkgF56Cb7ylfBA\nEL0RxjVjhpXn0zb/YI894MADbT5AHBoyEMk9BQKRAqquhooKm2CXSbYVgl12SXZtPh16qA1nhHz/\nzW23nd2GBIIXX4Q992w6VVJEWqZAIFJAcVYOJA0E3qc3ECTVqZMtvwwZMvAe3n5bgUAkEwUCkQKK\nc7BRbW2yQDB/vpXkd945/rVp1rt3WIVA8w1EwigQiBTQihVN5e+2RG98SQJBtM6/lCoEYG/0IYFA\n8w1EwigQiBRQaCDIZtviGTOgSxcYPjz+tWnWq1fYp35VCETCKBCIFNCKFdCzZ+Z22QSCU0+FyZNt\n8mIpCR0y6NQJtt1WgUAkEx1/LFJAa9bkv0LQr1/pnJDYXK9eMHNmWNvQ8CBSzhQIRAro9dehvj5z\nuygQJN2HIO3q6mw1QGVl+DWhQwZx24qUKw0ZiBRYSCl/+XLo0SPeG2axWLbM5jg8+mi86+J86r/g\nAjjmmPh9EyknqhCIFIFsNiVKu169bJz/00/jX7d6tR3a1KlT223PPTd5/0TKhSoEIkWglAOBczB0\nKMydG+86LScUyS0FApEiUMqBACwQJKkQgAKBSK4oEIgUgeXLw1YjFKthw+JXCBQIRHJLgUCkCNTW\nxj8ACOBXv7LjldMuSYUgqpho9YBIbigQiBSBpIHg17+G55/PfX9ybdgwWLoU1q0LvybOiYcikpkC\ngUiBPP44nHiirb/PJEkgaGiAOXNg5Mhk/WtPQ4fabZxhg8pK6NbNfjYikj0FApECmTHDthTOdPSx\n98kCweLFsGFDcZxhsPfe8OSTMHhwvOt69rTtnzOpq7MjkEPaipQrBQKRAgk9x2DdOntDixsIok/b\n0afvNKuqgqOOgu7d410XGghWroQ997QAJiItUyAQKZCamrCVA1FJPG4giCbpDRsW77piEhoIeva0\nSozmG4i0ToFApEBCKwRJA8HcufaJO+Q5ilVoIOjQwcKXViSItE6BQKRAVqzIb4Vg7lwbLsg0R6GY\nhQYCsGWKCgQirVMgECmQmpp4FYK4n/QHDoTDDovfr2KiQCCSOzrcSKRA8j1kcOml8ftUbOIEgl69\nLISJSMtUIRApkC99CQ48MHO7KBBsu21++1OM4gYCTSoUaZ0CgUiB/OxncNJJmdvV1loYqKjIf58K\nadEiuOGGeGX9qipbUtjQkLmtAoFI2xQIRFIu6bbFxWbpUrjkEpg5M/yanj1t46aVKzO3vewyePrp\n5P0TKXWaQyCScuUSCAYNstsFC8KvieZghMzH6Ns3Wb9EyoUqBCIpVy6BoFcv6Nw5eSAQkewoEIik\nXLkEAuesSjB/fvg1CgQiuaNAIJJySQJBfX1++pJvgwapQiBSKAoEIimXJBB88Ytw5pn56U8+xQ0E\n0c9FgUAkewoEIgWwZg2sXh3WNkkgWLCgOM8wiBsIOnWCrl0VCERyQYFApABuvhmGDw9rmzQQRLP2\ni8mOO8b/XuNsTiQirVMgECmA0G2LvY8fCNavtw14ijEQXHghvPxyvGviBIKrroInnojdLZGykCgQ\nOOcucs7Ncc6tc85Ncc7tm6F9lXPu1865BY3XfOCcOzpZl0WKX2ggWL8eNm2KFwgWLrTbYgwEScQJ\nBPfdB889l9fuiBSt2BsTOedOAX4BnAe8BkwEnnLO7ei9r26hfSXwDLAIOBFYAAwDVOSTslVTk7+j\nj6MxeAWCrWn7YpHWJdmpcCJwm/f+XgDn3AXAscDZwM9aaP9NoCewv/c+Wgw1N8HzipSMfJ50WI6B\nIHTvAgUCkdbFGjJo/LQ/Dpgc3ee991gFYHwrl30ZeAW4xTm3yDn3jnPuUuec5i9I2VqxIr8Vgm22\nKY/NjEAVApFciVsh6ANUAIu3uH8xMKaVa0YAhwH3AccAo4FbGh/nJzGfX6Qk1NTkr0LwpS/BDjvY\nzn/lIG4geO+9/PZHpFjl6nAjB/hW/lsHLDCc11hNeNM5Nxj4LhkCwcSJE6na4pVwwoQJTJgwIfse\nixRQPocMRo60r3IRJxD07h3veGWRtJs0aRKTJk3a7L7a6IUjpriBoBqoB/pvcX8/tq4aRBYCGxvD\nQOR9YIBzrqP3vq61J7vxxhsZO3ZszC6KpN/DD8PgwZnbRf+ue/TIb3+KWc+e9nNqaIAOGQYiNWQg\npaalD8nTpk1j3LhxsR8r1ji+934TMBU4PLrPOeca/97a6uGXgFFb3DcGWNhWGBApZQceGLYxUW0t\ndO8OFRV571JqXHopnHJKePuoerJqVea2o0bB+PFQp1ceka0kmdh3A3Cec+5M59xOwK1AV+BuAOfc\nvc65nzZr/39Ab+fcTc650c65Y4FLgV9l13WR0lcuJx02t3YtvPtuePs4BxwdeyxMngwdczVYKlJC\nYv+z8N4/6JzrA1yNDR28BRzlvV/a2GR7oK5Z+3nOuSOBG4HpwPzGP7e0RFFEminHQNC/PyxubQCy\nBdHPJ+GwqYg0SpSTvfe3YCsFWvpvh7Vw36vAAUmeS6SclWsgWLbMdmisrMzcXoFAJDe0F4BIipVr\nIABYurTtdpE4QwYi0joFApEUixsIPvwQfvvb4p40FwWC0GEDVQhEckOBQCTF4gaCZ5+F88/PvPwu\nzeIGgi5doFMnVQhEslXELxsixenFF+Hee8Paxg0EixdDv37FHQj69bPb0EDgnP2MVCEQyU4Rv2yI\nFKc//xmuvTasbdxAsGRJ0xtqserSBa6/HvbeO/waBQKR7Gk1rkg7C922GJJVCPpvuY9oEfrud+O1\nj7N98Smn2D4Ev/99/H6JlDJVCETaWWggWL8eNm4svwpBEnEqBB06wKJF+e2PSDFSIBBpZzU1YUcf\nR594y7FCEFd0nkEInWcg0jIFApF2ls+TDsu5QhDnCGQFApGtKRCItLMVK8IqBHEDwaZN0K0bDBqU\nvG/FKs6QgQKBSMs0qVCkndXU5KdCUFkJ8+cn71cxizOpsFcvWL3a5md06pTffokUE1UIRNqR9/aG\nFDLOn2TIoFzFrRCABTMRaaIKgUg7cg5mzw5rG73B9eiRv/6k1cqVMG0a7LcfdO2auX1VFaxbF/ap\nPwoEy5aV5wRMkdaoQiCSUrW1NiegYxnG9hkz4NBDYdassPbREExIlWDMGDvvQWFAZHMKBCIpVY4n\nHUb69rXb6uqw9nEOOOrTB846C3r3TtY3kVKlQCCSUuUcCPr0sdvQQBCnQiAiLVMgEEmpcg4EPXrY\nUEncCoFOPBRJToFAJKXKORA4Z1WCpUvD2scZMhCRlikQiKRU3EDwla/ATTflrz/trU8fVQhE2pMC\ngUhK1daGn4oI8NJLpfUJuW/f8EDQsaOtyCil71+kvSkQiLSja6+FM88MaxunQtDQYOX1UjrHIE6F\nAOIdcCQiWyvDFc4ihTNjBsydG9Y2TiCoqbFQEC3XKwW/+Q107hzePs4BRzNmwLx5cOSRyfomUopU\nIRBpR6EnHUK8QBB9ko6W65WCnj1hm23C28fZvvi+++CCC5L1S6RUKRCItKPQQLB+vW3DGxoIli2z\n21IKBHHFGTLQiYciW1MgEGlHNTX5Ofq4FCsEccUZMujVy37GdXX57ZNIMVEgEGlHoRWCuIEgqhBE\nB/eUI514KJIdBQKRdlRTk59AsOuucNllUFmZvG/FrmfPeBUC0LCBSHNaZSDSTjZuhLVr8xMI9tvP\nvspZkgqBAoFIE1UIRNpJQ4N9it9778xt4wYCaZpU6H3mtgoEIltTIBBpJ126wDXXwJ57Zm4bBYIe\nPfLbp7S7+GL429/C2lZV2STBtWszt40CgbY6FmmiIQORFKqtta14O5b5v9C//tXevL/85cxtmx9w\n1K1b2227dLEhnHKecyGyJVUIRFKonE86bK5376YVFJlEczNC5xEoDIhsToFAJIUUCEycDYR04qFI\ndhQIRFJIgcDks0IgIptTIBBJoTiBYONGmD4d1qzJb58KQRUCkfajQCCSQnECwaefwl57wWuv5bdP\nhdC7d3gg6N4dOnRQhUAkKQUCkXby6ad25G6IOIGglA826tUrfMjAuXibE4nI5sp8UZNI+/nud62c\n/fTTmduW+9HHkd12gyOOsM2GnMvcPs4BRyKyOVUIRNrJihVhJx1CsgpB797J+pVmRx8Nf/pTWBiA\neBWC55+3/Q3q65P3T6SUKBCItJPQo48hfoVg222hU6fkfSsV0fbFIZYtg0cfVUVBJKJAINJOQisE\nGzbYV5wKQSkOFyQRZ8hA5xmIbE6BQKSd5Ovo4+rq0hwuSCJOhUCBQGRzCgQi7cD78ApB3ECgCkET\nVQhEktMqA5F2sGqVHX+cj0Bw6602xCDxJhVGVRUFAhGjQCDSDmpq7DYfQwZ9+ybrUymKM2SwzTZ2\n6qECgYhRIBBpB4MGwQcfwODBmdvGDQSlznvYtClsFUVVFaxcaUsJKyoyt4+zNbJIqdMcApF2UFkJ\nY8bY9rqZRIGgR4/89qlYfPGLcPrpYW2jCsyqVWHtTz0VdtklWb9ESo0qBCIpU1sLXbtaiBD71L90\naXhbsJ9esUNCAAAgAElEQVRhyPDM9dcn75dIqVGFQCRldPTx5nTioUj7UCAQSRkFgs317h1+wFFU\nFdABRyLxKRCIpIwCweZUIRBpH4kCgXPuIufcHOfcOufcFOfcvoHXfc051+Cc+3OS5xUpB3ECwcsv\n2ymKDQ357VMh9e4Na9aE7bXQfA6BiMQTOxA4504BfgFcCewNTAeecs61uVeac24YcD3wQoJ+ipSN\nFSvCA8Frr9nGRB1KuNYXZ0fBLl2gc2cFApEkkryMTARu897f673/ALgAWAuc3doFzrkOwH3AFcCc\nJB0VKWa/+Q3cf39Y27gnHZb6OQZRIAidRxBn+2IRaRIrEDjnKoFxwOToPu+9B54Bxrdx6ZXAEu/9\nXUk6KVLs7rkHnnoqrG3cQFDq5xjssgs8/DAMGRLWPs5uhQ0NFh42bUreP5FSEbdC0AeoABZvcf9i\nYEBLFzjnDgTOAs6J3TuREhF60iHECwTLlpV+haBnTzj++PCfSZzzDN5+286XeOut5P0TKRW52pjI\nAX6rO53rDvwOONd7XxP3QSdOnEjVFq8CEyZMYMKECUn7KVIQoScdQvimOmAVgoEDk/erFOnEQykn\nkyZNYtKkSZvdV5twEk3cQFAN1AP9t7i/H1tXDQBGAsOAvznnXON9HQCccxuBMd77VucU3HjjjYwd\nOzZmF0XSJ7RCsH69zaaPEwh22y27vpWaOEMGCgRS7Fr6kDxt2jTGjRsX+7FiDRl47zcBU4HDo/sa\n3+gPB15u4ZL3gd2BvYA9G78eAZ5t/PNnsXssUmTWr7evfBx9vGxZ6c8hiCtOhaBbN9siWoFAJNmQ\nwQ3APc65qcBr2KqDrsDdAM65e4F53vsfeu83AjOaX+ycW4HNRXw/m46LFIskRx+HVgj22gt22ilZ\nv0pVnAqBczrxUCQSOxB47x9s3HPgamzo4C3gKO99dPzI9kBd7rooUtyi5XIhk/+iT7ahFYLHH0/W\np1IWZ1IhKBCIRBJNKvTe3wLc0sp/OyzDtWcleU6RYuU97LsvDGhxHc7m4lYIZGtx9yFQIBAxJby/\nmUg67L677Sg4YkTmtnErBOVi2jR44IGwtj172pyNjRvD2vfqFb7pkUgpy9WyQxHJgRUrbFy7R49C\n9yRdHnkEbr8dTjklc9vm5xn07Zu5/TXXQEVFdv0TKQUKBCIpUlsL225b2mcTJJH0xMOQQLDnnsn7\nJVJK9LIjkiIrVmj+QEt697ZhgLVrM7eNfn464EgkHgUCkRSJs21xOYlWaIRUCZpXCEQknAKBSIqo\nQtCyOCceqkIgkowCgUiKxKkQnHYanHRSfvuTFlGFICQQRBMyFQhE4lEgEEmROBWChQuhY5lMC44T\nCCoqoHt3DRmIxKVAIJJnu+4KN90U1jbu0cflco5BVVXT/gIh4mxfLCKmTD5fiBSG9zBrVvgywjgV\ngurqsO2QS4FzTWdChIi7ffFdd8HIkfC5z8Xvm0ipUIVAJI/WrrXjjEPfuEMrBN6XV4UgrrjbF//8\n5/DnP+evPyLFQIFAJI+iZXIhgaChAVauDKsQrFkTL2iUm7hDBv36wZIl+euPSDFQIBDJo2gSXLRs\nri2rVtkn/5AKQfS4qhC0LG6FQIFARIFAJK+SHH0cUiGorg5/3HKkCoFIfAoEInkUZ8ggztHHQ4c2\nTYSTrcWdVNi/PyxenL/+iBQDrTIQyaNly2xdfMjphXGOPu7bF77xjay6VtKSDBlUV0N9vU4+lPKl\nCoFIHh10EPzf/9myuUziVAikbdGQgfdh7fv1s0mdoScqipQiBQKRPNptNzj33LC2cSoE5WjKFDjg\ngLDdCquq7NN+yOmIAIMGwahRNrFTpFxpyEAkJWproXNn6NKl0D1Jp02b4JVXYOnSzHMyoirLihXQ\nrVvmx95vP5g5M/s+ihQzVQhEUmLFClUH2hItsQytEIC2LxaJQ4FAJCV09HHboqpAtOSyLVEg0AFH\nIuEUCERSIs7BRuUo2twppEIQBStVCETCKRCIpERNDWy3XVjbv/4VPv44v/1Jm44dLTBpyEAkPxQI\nRFJi+fKwLY4BJkyAxx7Lb3/SqE+fsEDQrZvtJ6AhA5FwCgQiebJyJTz6aPin1NBAsHYtrFtXnucY\n9O4dNofAufi7FYqUOwUCkTz54AP48pfhk0/C2ocGgnI+2OjMM+Gww8LaKhCIxKNAIJInS5fabd++\nYe1D5xCU88FGF10Ep54a1rZnz3hDBk8+CTvsYNUXkXKkQCCSJ9HpeSGf5DduhNWrVSHIpbgVgspK\nq+YsXJi3LomkmgKBSJ4sXWqfUjt1yty2psZuQwJBOVcI4oh7wNGgQXa7YEF++iOSdgoEInmyZIkd\nmhMiOlQnNBB06gTduyfvWzmIDjgKpUAg5U6BQCRPli6NN38AwuYQrFplwwUhJyiWs7hDBj16QNeu\nCgRSvhQIRPIkTiCIUyG49FL49NPk/SoXcScVOmdVAgUCKVcKBCJ5Ul0df8ggdKfCjjqnNKMkyw4H\nDlQgkPKllxWRPJkyxVYPhFi+3MrVOvq4bQ0NthKgd+/M5z5UVdnwSn297VoYQhUCKWeqEIjkSYcO\n4W/wcc4xKGfr18PIkfC3v2VuGw2/xBk2+MY34PzzE3VNpOipQiCSAnHOMShnXbvCNtuEnWcQzd9Y\nujR8iebRRyfvm0ixU4VAJAUUCMKFnmcQbdwU0lZEFAhEUmH5cg0ZhAo98VCBQCQeBQKRFKipUYUg\nVO/eYYFgu+1sKWF0poSItE2BQCQFQocM3n4bjj22vGfC9+kT9qm/oiJ8eEFEFAhEUiE0EMyZA48/\nXt77EPTr13RwVCah4UFEFAhE8uLaa+Gaa8LaNjSELztcssTK4OV8sFHcQKAhA5EwCgQieTB5Mrz7\nbljbFSssFIQcZ7xkibUL3WinFJ17Lrz4Yljbvn3jVwhmzYJnn43fL5Fip0AgkgcLF9o2uCGiT7Ah\n5x7EOUGxVPXvD6NHh7VNMmRw113w9a/H75dIsVMgEMmDOIEgesMKCQRLlyoQxJFkyGDYMJu0uWlT\nfvokklYKBCI5tn69zQmIWyEIHTIIPUFRklUIhg61IZxyXskh5UmBQCTHFi2y2ziBIHSioIYM4unb\nF1avtpAWatgwu9UR01JuFAhEcmzhQruNEwh69QqbKHj88XDIIYm7VnaS7FY4ZIjdzp2b+/6IpFkZ\nr2YWyY+o1BwnEIQOA4QuZRTTPBBsv33YNd262f+POXPy1y+RNFKFQCTHBg60Y3RDtyKOEwgknqTn\nGYwcacsPRcqJKgQiOXbAAfYVqrpagSCu+++HlSvhvPPabtf8COQ4Ro2C+fOT9U2kWCWqEDjnLnLO\nzXHOrXPOTXHO7dtG23Occy8455Y3fj3dVnuRcqMKQXx//7vtF5BJt27QuXP8QHDHHfYcIuUkdiBw\nzp0C/AK4EtgbmA485ZxrbdHU54E/AIcA+wOfAX93zgWOsIqUNgWC+EK3L3YOBgyAxYvjPX7nznat\nSDlJUiGYCNzmvb/Xe/8BcAGwFji7pcbe+zO897d679/23n8EnNP4vIcn7bRIqfDeAkHIHgTSpF+/\n8Df5AQOaVn6ISOtiBQLnXCUwDpgc3ee998AzwPjAh+kGVALL4zy3SClas8bWyKtCEE///vazW7Mm\nc9uBAxUIRELErRD0ASqALbP5YmBA4GP8LzAfCxEiZS3OOQaLFtlEOmnanClkbsCAAU2bRYlI63K1\nysABPmMj534AnAx83nu/MVP7iRMnUlVVtdl9EyZMYMKECUn7KZIqcc4xOOssG9t++OH89qkYRIFg\nyRIYPrzttqoQSCmbNGkSkyZN2uy+2traRI8VNxBUA/VA/y3u78fWVYPNOOe+C3wPONx7/17Ik914\n442MHTs2ZhdFCmf5cti40T6VhojGwUO2I164MN5yxlLWv/EVKGQewYABVkmory/vY6OlNLX0IXna\ntGmMGzcu9mPFGjLw3m8CptJsQqBzzjX+/eXWrnPO/TfwI+Ao7/2bsXspUiRuuw123TW8/cKFNps9\nNBCE7n5Y6vr0gX32gU6dMrcdONAOKwpZlSBSzpKsMrgBOM85d6ZzbifgVqArcDeAc+5e59xPo8bO\nue8B12CrEOY65/o3fnXLuvciKfPpp3ZaXqiFCy0MdMxQq6urs0+5CgSmY0d4/XU46qjMbaNqTdx5\nBFOmwL77WtVHpBzEDgTe+weBS4CrgTeBPbBP/tH0nu3ZfILht7BVBX8CFjT7uiR5t0XSadYsGDEi\nvH3op/4lS2yJogJBfNHPLO48gq5d4Y034P33c98nkTRKNKnQe38LcEsr/+2wLf6+Q5LnEClGs2bB\nSSeFtw8NBHFPUJQm0XBM3ArBmDHQoQO89x4ceGDu+yWSNjrcSCRHNm2yI3NHjgy/RoEg/zp1sjkH\ncSsEnTvbmQYzZuSnXyJpo0AgkiOffmoz2fMVCDp0CJt8KFtLuhfBrrtahUCkHCgQiORIdFxuaCDw\n3t6kQgLBSSfBq69q2VxSAwfCggXxr9t1V1UIpHwoEIjkyKxZNvt9yJCw9suX2zBDSCDYbjtbZifJ\nDBkC8+bFv26XXSxIrFiR+z6JpI0CgUiOfP3rMH165iWEEc0LyA2fcY9UWwo6d278x472lHj33fjX\nihQbBQKRHOnWzT5RhlIgyE5NjVVOQrZyHjLEhmc2bIj3HDvtBFddBYMGJeqiSFFRIBApkCgQhG5z\nLJurqrLTDkPmBkSbRcUdNujUCa68Mt7eEiLFSoFApEDmzYNevaBLl0L3pDh16GCf3OfPz9w2CgSf\nfZbfPokUMwUCkQKZOxeGDSt0L4rboEFhFYLtt7fbJPMIRMqFAoFIgcydG+/cA9na4MFhFYKuXW1z\nIgUCkdYpEIgUSGggeOklG8cOmU1fbuKsHhg6VEMGIm1RIBApAO/DT0Z89lm49VY7Jlk2N2yY/Rwb\nGjK3HTJEFQKRtigQiOTAd74Df/lLePvaWli9OiwQzJ0bvtlRuRk+3JYSLl6cue3QoRYeRKRlCgQi\nWaqrg9/8Jt6bTdQ2JBB89pkCQWv22w8mTYLu3TO3HTkSZs8OqyZsqaYGbrkFqqvjXytSLBQIRLL0\n4Yewfj3stVf4NVHpOjQQaPJhywYMgK99DbbdNnPb0aOtmpBkC+O1a+Gii+D55+NfK1IsFAhEsjRt\nmt3GDQSVlZk3JfJeQwa5MmqU3X78cfxrBw+GHXaAf/4zt30SSRMFApEsTZtm5eiePcOv+eQTe5Pv\nkOFf4NKlNtdAO+Vlb/hwOy1y5sxk1x98MLz4Yk67JJIqCgQiWZo2DcaOjXfNzJlWws4k7pHK0rpO\nnWxVQpIKAVggePNNmxAqUooUCESy0NBgbxJxA8HHHzeVsDM9/vjxqhDkyujRyQPBF75g/z8mT85t\nn0TSQoFAJAszZ8KqVfECQUODffIPqRAceCC8/HLYpDnJbNSo5EMGw4fb6YdPPJHTLomkhgKBSBYq\nKuDcc+Hf/i38mnnzbFVCSCCQ3Bo92sJYfX2y6485Bp58UrtGSmlSIBDJwqhRtgdBVVX4NVHJOmTI\nQDJbvx5++9uwT/677GLt58xJ9lzHHWd7H6xalex6kTRTIBBpZzNnWmVhhx0K3ZPSUFEB558PzzyT\nue3uu9vtO+8ke65DDoGHHoIePZJdL5JmCgQi7WzmTJvtXllZ6J6UhspKm3T50UeZ2/bvb6ceJg0E\nIqVMgUCknc2YYaVryZ0xY2zHyEycg912UyAQaYkCgUg7e+cde1OS3BkzJqxCADZsoEAgsjUFApF2\ntGKFrTKIxrLbsnq1ZrOH2nFHmyi4YUPmtrvvbsM269blv18ixUSBQKQdvfuu3YZUCE49FU48Mb/9\nKRU77WT7O4SsNNhzT2urKoHI5hQIRBJ46qlkG9S8+y507GhvYJnMmKEdCkNFAevttzO33XNP28b4\n1Vfz2yeRYqNAIJLAj34Ed9wR/7q337bydqdObbdbuxZmz4Zdd03Wv3Kz3Xaw776wZk3mtp07286S\nU6Zk95yLFsHEibBsWXaPI5IWHQvdAZFi8/HHMHUqfO978a99/XXYZ5/M7T74wOYPaDVCuNdeC2+7\n//7wyCPZPV9FBdx6q4WRK67I7rFE0kAVApGYHnwQunaFY4+Nd9369TB9etg2x1On2tHIIZMPJb79\n97cKzJIlyR+jb1845xy46SabACpS7BQIRGJoaIC77oITToBu3eJdO306bNpkW99mMnWqVQfiPoeE\n2X9/u33llewe57//G1auhP/7v+z7JFJoCgQiMTz7rA0ZXHBB/Gtfe83mDuyxR+a2b7wRNrQgyQwb\nZltHh2x33JahQ+Hss+G662D58tz0TaRQFAhEYrjlFpvod9BB8a99+WWbzJZpQuGGDTb5UIEgv448\nEp5+OvvHufpqq/xcdVX2jyVSSAoEIoFmzICHH4Zvf9u2wI3De6suHHpo5raVlfDWW/DVrybrp4Q5\n4gjb7nju3Owep39/uPxyC4tvvZWbvokUggKBSKABA+AnP4FvfCP+te+9ZxPYDjssc9sOHWz+QL9+\n8Z9Hwh12mP2s//737B/rO9+xvRAeeCD7xxIpFC07FAnUqxf88IfJrn32WRsqOOCA3PZJtrZhA9TV\nZZ6Qud12NvTz5z/baoFsdOoEzz0HVVXZPY5IIalCINIOnngCDjzQlitK/tTVWSXnttvC2p98ss0j\nyMXmQj17xh9KEkkTBQKRPKuthcmT4d//vdA9KX0dO9o+D6HbSn/lK7aU9C9/yW+/RIqBAoFInj32\nmM1CP+GEQvekPHzxi/DCC2GbBQ0YYBM977kn//0SSTsFApE8e+AB22d/yJBC96Q8HHMMbNwI//hH\nWPvzz4cXXww7GEmklCkQiLRg6dLcbEe7YIFVCM46K/vHkjCjR8OYMfCnP4W1P+EEGDQIfvWr/PRn\n0yb4/e9taEIkzRQIRLYwe7atBrjwwuwf6+67bQb6qadmbnv77fCFL9jEOMnOaafBQw+FnX5YWQkX\nX2zDBtnuSdCSxx+H00+3/7effpr7xxfJFQUCkWb+9CcYN842Esp257n16+1T54QJYcvRbr8dttnG\nJsZJdk47zcLAww+Htf+P/7D/R1dfnfu+HH+8bZH88ce2v8TVV4cFFZH2pkAgAsyZAyedZLsDHnGE\nnSUwYkR2j3nnnbB4MXz/+5nbvvuuHY2soYXcGDECPv/58CORu3eHyy6zg6viHKMc6vDD4Z13rOr0\nP/8DO+4IP/+5HYwkkhYKBFLWPvzQDiraeWc7+e6++2wSYM+e2T1uba3tajhhgr34Z/KLX9g49pe+\nlN3zSpNHH7WjiUNdeCHsvTd885u2uVGuVVXB9dfD++/DUUfZJldDhtguliJpoEAgZe2GG6ysfMUV\nFg5OOy03m8tcfjmsWgXXXpu57dy5FkQuuSTzwUcSrnv3eO07drSqzkcf2ZwC7/PTrxEj4Le/hU8+\ngf/6r7DAKNIeFAikrF17rU30+uEP47+BtObRR+H//T+rEIQsNfz+921b5PPOy83zS3J77mm7HN5x\nh32az6dBg+DKK21SY1s++shWKojkm6YvScnw3sbsP/oIpk+HqVNtd8Djj2/9ml69ctuH6dPhjDPg\nuOPsVMRMnnoK7r/fViPkKpBIdr7xDZsA+P3v28TQyy8v3JbEDQ22h8XGjbD77naA0m672Z932slC\nRUVFYfompUcVghIyadKkQneh3d18s43T77OPjdEOHGiTyS65xCbqrV2b+TFy9XN77TVbWjZyJNx7\nr52kl8lHH9nOemeckZMutJtS/1275hr7uvJKOPHE3Jx1AMl+bn//O/z0p7DrrjYx8bLL4MgjYehQ\nW5USuk1zsSr137U0cT7BQJlz7iLgu8AAYDrwH97719to/1XgamA48BHwA+99q7/GzrmxwNSpU6cy\nduzY2P0rV8cddxyPPPJIobsRrLra3hDXrLHZ1suXb/5VX29jrW057TT47DPbiGb0aBuP3XFHe1Pu\n3DmsH9n+3Orr4de/hv/+bxg71jYiilN5aGgICw9pUmy/a0k98gh8/etWIbj6aptwuM02yR8vFz+3\n+nrbK2PmTFsdc9xxbQ9N3XabBZu+fW2ybM+edtJjdDtwoE2sbcvGjTa0UYhKSbn8ruXStGnTGDdu\nHMA47/200OtiDxk4504BfgGcB7wGTASecs7t6L2vbqH9eOAPwPeBx4BTgYedc3t772fEff5C++lP\nbUlaRUXLX+PH24tGa+rr4brrNr+mY8emNwTn4NhjYfjw1h/j449tr/boH6dz9vXZZ/C739njTZjQ\n9vfx5JM2dl5fb29IDQ2b/3mXXawfrVm/3l5ENmywF4uNG7f+8y9/CQcf3Ppj/O1vcPbZTX93zl6k\neve2N9QBA9r+HsB2gCuUujo7FOenP7WhggsvtNUCoUEkUmxhoJgtW2bVmKuugv32y9z+uOPggw9s\njsm3vw0//rEdlXzyybDXXoV5g6yosPA7enRY+3Hj7Hdz2TJYsQJqaixIRH/ebrvMgeCgg+x1r2tX\n6NLFJr926mQhoVMn+5lMnNj69UuW2ATKDh3sy7mmP0dfP/gBDBvW+mNMnmzzc7xv+atXL6vqtOXH\nP7YwVV9v/363vD3ppM1fk7Y0d64tS66rs5VJjz7a9vMVmyRzCCYCt3nv7wVwzl0AHAucDfyshfbf\nAZ7w3t/Q+PcrnXNHAhcDOdgLrn3V1dmbYX395r9M0dfgwW1fv2mTLYVqfk1d3ea/2MOGtR0IXnml\n9dBx5pn2hpQpENxyi32S7dDBXmCa/8OsqIBTTmk7EHToALNmNb0wdO5sb+bRnzt1yrwZz/HH25Kr\nbt1g222tfdrHQ5cuhVdftd3n/vIXWLTIDsd55RU7ZU/SbcUK20763/7NTjq86CIbYmorlPXvb6sP\nLr3U/u3edpuF+mHD4HOfs2Otx42zKtW227bf9xJqn33sKxtXXgnz51s1r3nw37TJbkeObPv6ujqY\nN6/pA0dDg73WNf97puG9OXNs+CT6ALTlV6bXXrA39Nmzmz6INb/t0iXzBM9u3SwkduwY9nzFJlYg\ncM5VAuOAn0b3ee+9c+4ZYHwrl43HKgrNPQW0MdUrva64Irvru3SxtJyN009v2gq3eZA48UTbaS9k\nFCjbClynTvDPf2b3GL165X5SX1J1dU2fmJYvb7qdN89eiObMsU+K0dazw4db6Dr9dBsm2FJDg7Wd\nMcPegM49t12/HWnFyJE22fSuu6yac9hh0KePjcnvt59V+FqrHIwaZatHbrjBDk567DF46SX4wx8s\n2IO9SYwcaZP9Bg602/79LexWVdn+FHPm2J+7dy9cGT6utj4chBg0CJ57LrvHOOcc+8rGnXdmd33v\n3vlffVJIcSsEfYAKYPEW9y8GxrRyzYBW2rdVEO4C8P7778fsXn599hk8/bQl2ehNt/mbr/f2j7xf\nv83va66hwRJqS9dG+ve3JNrSf/Pe1rc3DxXRoSnTptVyxhnTcA522KH15/AeFi5s/fuA1r+P5rez\nZrX+fYKV/Lt2bfm/Rd/H4sVN30P0fTT/85Ah9mLr/ea3UZvqali3bvNPG9FjeN9UsWhpWCP6Wr++\nlsrKlofZOne2F7Po0+Auu9jkrkGDml7I77nH9jKoqWn6WrKkaXObQYNsw5tSGhqora1l2rTgocnU\nGTvW9n6YPt2C7auvwh//aGdY3HBD69d5b6GgstI+JR5wAOy/v/0uR//vwcb3X3nFKkqbf/KtZcSI\nzX9uHTs2PV7056jaVlnZVLWLvjp0sN/5TZu2LrtHX1272ptX9DsalembDzMuWLD1f484Z3MOoteh\nqMTf/Pp16+zf35af1JuLXodas3SpPU7z522uWzf44INafvSjaa0Gp08+2fra5n/u23frFTzN//uq\nVfZ9tPbfm7+ebvnfonlLadPsvbNLnOtiTSp0zg0E5gPjvfevNrv/Z8BB3vsDWrhmA3Cm9/6BZvdd\nCFzmvR/UyvOcChRwdFhERKTonea9/0No47gVgmqgHui/xf392LoKEFkUsz3YkMJpwCfA+ph9FBER\nKWddsFV9T8W5KPayQ+fcFOBV7/13Gv/ugLnAzd77rUZXnHP3A9t4749vdt9LwHTvfdFNKhQRESlF\nSVYZ3ADc45ybStOyw67A3QDOuXuBed77Hza2vwl43jn3X9iywwnYxERNsxIREUmJ2IHAe/+gc64P\nttFQf+At4Cjv/dLGJtsDdc3av+KcmwD8T+PXTOD4YtyDQEREpFQl2qlQRERESksJLYQSERGRpBQI\nREREpDgCgXPuWOfcFOfcWufccufcnwvdp2LgnOvknHvLOdfgnNuj0P1JM+fcMOfcHc652Y2/ZzOd\nc1c17s4pzTjnLnLOzXHOrWv8d7lvofuUVs65S51zrznnVjrnFjvn/uKcS+FWNunV+DNscM61sWWU\nADjnBjnnfuecq258HZveeFhgkNQHAufcV4B7gTuB3YEDsMOSJLOfAfMATRTJbCfAYatfdsFWz1yA\nTYSVRs0ON7sS2Bs77fSpxonGsrWDgf8H/BvwBaAS+LtzLoszE8tHY9g8F/s9kzY453oCLwEbgKOA\nnYFLgJrgx0jzpELnXAW2OdHl3vu7C9ub4uKcOwb4OfAVYAawl/f+7cL2qrg4574LXOC9H1XovqRF\nK/uQfIbtQ9LS4WbSTGNwWgJ8znv/YqH7k2bOue7AVOBbwOXAm977/ypsr9LLOXcdtovw55M+Rtor\nBGOBQQDOuWnOuQXOucedc7sUuF+p5pzrD/wGOB1Yl6G5tK4nsLzQnUiLZoebTY7u8/aJoq3DzWRz\nPbGKnX6vMvs18Dfv/bOF7kiR+DLwhnPuwcbhqWnOuVjHQaU9EIzAyrhXYvseHIuVP55vLI9Iy+4C\nbvHev1nojhQr59wo7IjuWwvdlxRp63Cztg4rE/5VTfkl8KL2YWmbc+5rwF7ApYXuSxEZgVVTPgSO\nxE/r1pgAAAKcSURBVF67bnbOnR76AAUJBM65axsnibT2Vd848Sbq30+89w83vsGdhSXsrxai74US\n+jNzzn0b2Bb43+jSAna74GL8rjW/ZjDwBPCA9/63hel5UXFonkqIW7D5KV8rdEfSzDm3PRacTvfe\nbyp0f4pIB2Cq9/5y7/107/1vgNuxkBAkydbFufBz7FNsW2bTOFwA/OssR+/9RufcbGBonvqWViE/\nsznAocD+wAa3+Xmhbzjnfu+9PytP/Uur0N81wGbpAs9in+LOz2fHilCSw80EcM79CvgicLD3fmGh\n+5Ny44C+wFTX9CJWAXzOOXcx0NmnefJb4Syk2Xtlo/eBE0MfoCCBwHu/DFiWqV3jeQkbgDHAy433\nVWKnOH2axy6mToyf2X8AP2p21yDsxKuTsbMnykrozw3+VRl4FngdODuf/SpG3vtNjf8mDwcegX+V\nwQ8Hbi5k39KsMQwcD3zeez+30P0pAs9gK8qauxt7c7tOYaBVL2Hvlc2NIcZ7ZaEqBEG896ucc7cC\nP3bOzcO+se9h5ck/FrRzKeW9n9f87865NVhJd7b3fkFhepV+zrmBwHPYqpbvAf2iDyfee336bdLm\n4WayOefcLdiBbscBaxon/ALUeu91tHsLvPdrsJVR/9L4OrbMe7/lJ2BpciPwknPuUuBBbKnrOcQ4\nSDDVgaDRd4FN2F4E2wCvAod572sL2qviokSd2ZHYpJwR2DI6aBobryhUp9Im4HAz2dwF2O/Qc1vc\nfxb2miZh9BqWgff+DefcvwPXYcs05wDf8d7fH/oYqd6HQERERNpH2pcdioiISDtQIBAREREFAhER\nEVEgEBERERQIREREBAUCERERQYFAREREUCAQERERFAhEREQEBQIRERFBgUBERESA/w9wsIOV1LH0\nIAAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(x, lgam.prediction_intervals(x, width=0.95), '--', c='b')\n", "plt.plot(x, lgam.predict_proba(x))" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgQAAAFkCAYAAABfHiNRAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzs3XmUXOd53/nvW7du7b2gu7GDJAgu4GJKJEBlJEtjKWIc\nKVIs68QzI8N2NMeK42NbnszQkT224zM+8a4kFo8TR7FyEsemFcP2GU8c2Y4lWYsjyZJCixApiiS4\nCQBB7EDvtd17q9754/YlGs3urvdWd/VS9fuc06eAwq2qiz5A16+e973PY6y1iIiIyGDLbPYJiIiI\nyOZTIBAREREFAhEREVEgEBERERQIREREBAUCERERQYFAREREUCAQERERFAhEREQEBQIRERGhi0Bg\njPmfjTGfMMacM8a0jTHvcXjM24wxjxtjGsaY540x/3t3pysiIiK90E2FoAw8AXwQ6DgIwRhzEPgz\n4LPA64HfAP6DMeY7u3htERER6QGzluFGxpg28F5r7SdWOebDwN+z1r5u0X3HgRFr7bu6fnERERFZ\nNxuxh+CNwGeW3Pcp4E0b8NoiIiLiILsBr7EHuLTkvkvAsDEmb61tLn2AMWYceAdwGmj0/AxFRET6\nRwE4CHzKWnvN9UEbEQiWYxZuV1qveAfwnzfoXERERPrR9wO/73rwRgSCi8DuJfftAmattcEKjzkN\n8PGPf5y77767h6fWXx5++GEeeeSRzT6Nbacfv2+NRoNarUaj0aDZbFKrNWk0Qur1kChq025DqwXt\nNlgb38JrbxPxVqM4xxtjOH78N/ne7/3xV//cGLDW3nCbyGSu3xoT32Yy4HngeYZCIUuplKNUypHP\n5ymVSpTLZfL5fG++OZuoH/+t9Zq+Z+k9++yz/MAP/AAsvJe62ohA8BXg7y257+8u3L+SBsDdd9/N\nkSNHenVefWdkZETfry70y/dtZmaGS5cu8cor17h2LaBezxJFY0ARzytQKuUYGcmRzfp4XpZMxlv4\nypDJeBhjMCZDJpMBzMLv46+l/vIvP8Hf/ts/tOK5WGtf/QJLu93G2jatVmvhNqLVioiikCgKCIIm\nc3MN5uZqZLNNSqUmu3d7HDiwk71791IoFHr2fdtI/fJvbSPpe7YmqZbcUwcCY0wZuJ3rZf9DxpjX\nA5PW2rPGmF8F9llrk14DvwX8+MLVBr8NPAT8L4CuMBBZBzMzMzz33EucOjXL/HyBQmEnlcoOduwY\nJpv11/Tc7TZcuQKXLsHsLMzNwfw8nDsHf/RH8TGeB0ND8dfoKBw4AENDNwYJz3N/zSgKqVZnOHXq\nGs8/f47x8Ze566493HbbIXx/bX8fEVlZNxWCB4HPE6//W+DXF+7/XeADxJsIb0oOttaeNsa8G/gI\n8E+AV4B/ZK1deuWBiKRgreVb3/oWTzxxlunpISYm7mPXrrFlP9G7CAJ45hl47jk4eRJeegkuXoQw\nvPG4XC5ebnj00fj3YRg/drGREbj1VrjvPrj/fnjd6yDr+NMmm/UZGZlgZGSCVut2Jicv8Nd/fYZz\n565x9Og9jI6OdvX3E5HVpQ4E1tr/ziqXK1prf3CFxxxN+1oisjxrLU899TRPPHGNQuE2Dh060FUQ\naDbhC1+Ivx5/HOp1KBTgzjvhDW+IP+3v3Qu7d8dv8pVKHAj+2T+DX/7lG59nbg4mJ+GVV+Kv55+H\n//pf4fd+D4aH4W1vg+/5Hrj5Zvfz8zyPnTsPMDq6i5dffpb5+Sd585vvZWJiIvXfVURWt1lXGUgP\nHDt2bLNPYVvajt+3kyef4/HHrzE29m2MjIynfvzUFPzBH8B/+2/xEsC998L3fz/8rb8Fhw51LvG/\n/e03fs/y+fhrYiIOE4l2O640fO5z8JnPwJ/+Kbz1rfCjPwq7drmfr+/nOHjwdZw58wxf/eozfMd3\n3M/w8HCKv/HWsB3/rW02fc82zpo6FfaKMeYI8Pjjjz+uzSQiS1y4cIHPf/45CoW7GRtbegHP6lot\n+MM/jD+1ex685z3w7nfD/v09OtlFggA+/Wn43d+FahU++MH4tdNot9ucOvUEt98e8OY3P0jWdR1C\nZICcOHGCo0ePAhy11p5wfZz+N4lsI81mkyeeeJFWa2/qMHDxIvzzfx6X8r/ne+KKwMhIj050Gbkc\n/P2/Hy8d/Lt/B//qX8GLL8KP/7j7psNMJsNNN93DSy/9Dfv2neKOO+7o6TmLDBIFApFt5FvfOsX5\n8xkOHrwt1eNOnoSf/dm4rP+bvwmb2d6jUoGf/Ek4fBh+4zfi/Qcf+tD1fgWd5HIFKpWDPP30t9i/\nfz+lUqm3JywyIDZiloGIrIN6vc7Jk5cYHj6I57ln+RdfjN+A9+6NP5lvlV5f73kP/PRPwyc/Cb/z\nO+keOzGxn6tXc5w+faYn5yYyiBQIRLaJs2fPMjnpMz6+1/kxV6/CT/0U7NsHH/5w3CdgK/nO74Qf\n+qF4T8NXVmtVtkQmk2Fk5Gaef/4yjYbGnYisBwUCkW0giiJefPES5fK+hU6CnbVa8Eu/FK/P/9qv\nxaX6reh7vxfe+MZ4T8H8vPvjxsb2cO1ahgsXLvTu5EQGiAKByDZw5coVrl5tMzbmXh344z+Gp56C\nn/s52LGjhye3RpkM/MRPxD0Q/uN/dH+c53nkcrs5ffoiW/FqKZHtRoFAZBs4f/4SrdYouZzbwJ8r\nV+J1+e/+bnj963t7buth5054//vjPgXnz7s/bseO3Vy61GRmZqZ3JycyIBQIRLa4IAg4e3aG4WH3\nTj6//dvxFQUf+EAPT2ydvfe98WWQv/d77o8pl4epVvNcuXKldycmMiAUCES2uMnJSaanLcPDbh0J\nL16Ev/xLOHZs6+4bWE6hEJ/zpz8db4Z0YYwhn5/g/PlrvT05kQGgQCCyxV29eo1Waxjfzzkd/wd/\nEAeB7/quHp9YD7zznXEDoz//c/fHDA+Pc/lyg1qt1rsTExkACgQiW5i1lnPnpiiXx5yOr9fjT9jv\neQ8Uiz0+uR6oVOChh+DP/iy+SsJFuTzC/HyGycnJ3p6cSJ9TIBDZwubn55mejqhU3BoIfO5z0GjA\nu97V4xProXe/O14yePJJt+M9z8PaYaampnt7YiJ9ToFAZAubmZmhVstQKrlN9vuLv4AHH4Q9e3p8\nYj10113x+f/3/+7+mFJplAsXZnT5ocgaKBCIbGHT0zNYO+TUjOjyZXj66bj733ZmTDwi+QtfSLds\nMD0dah+ByBooEIhsYZcvz1IouI0k/Ou/jrsSvulNPT6pDfAd3wHT0/DMM27Hl0rD1GqG2dnZ3p6Y\nSB9TIBDZoprNJlNTTUqlIafjv/hFeOCB7XWp4UoOH4ahIfja19yO9zyPVqvE3Nxcb09MpI8pEIhs\nUXNzc9RqOAWC+fl4E95b3rIBJ7YBPA+OHIHHH3d/jO8Pce2aKgQi3VIgENmi5ufnCQKfXK7Q8dhv\nfAPa7XhDYb948EF49ln3gUfF4hBXr1Zpt9u9PTGRPqVAILJFzc3NY4xb/f/rX4ddu+Ixx/3iyJE4\n5HzjG27HF4sVqlWrjYUiXVIgENmirl2bJ593CwRPPgn33x/v0O8Xe/fGUxpdNxYWixXq9biyIiLp\nKRCIbEGtVoupqQbFYrnjsXNz8OKL8YbCfmIM3HOPeyDwPI92u0C1Wu3tiYn0KQUCkS2oWq3SbEKh\n0DkQPPMMWAv33bcBJ7bB7r0XTp5070eQyZSZm1MgEOmGAoHIFlSr1ajXIZ8vdTz2uefiS/T6af9A\n4u674/kMp0+7HZ/Pl5mcVCAQ6YYCgcgWVKvVsLaA53kdj33uufi6/X7aP5BI/l7PPed2fKFQZmam\nScu1pCAir1IgENmCqtUaxnSuDgA8/zzceWePT2iTFItx5ePUKbfjC4USzSa60kCkCwoEIlvQ1FQN\n3+88v/jatXgyYL8GAoBDh+Cll9yOzeeLNBoKBCLdUCAQ2WKstczONpz2Dzz/fHx7+HCPT2oT3XZb\nHAhcBhl6XpZ2O0e9Xu/9iYn0GQUCkS2m2WxSr7fJ5ztXCE6dgnIZdu/egBPbJIcOwewsTE66PqKo\nQCDSBQUCkS2mXq8TBDgFgtOn4ZZb+nNDYeLQofjWddkgmy0yO6slA5G0FAhEtpg4EBinGQZnzsSB\noJ/t3Qv5vPulh7lckZmZRk/PSaQfKRCIbDGNRgNr85gOH/vbbXj5ZTh4cGPOa7NkMrB/P5w753Z8\nPl9kfj4kiqLenphIn8lu9gmIyI0ajQbQuTpw+TI0GhtfIQjDgNnZazQaNcCSz5cYHh4nl8v37DUP\nHIBXXnE7NpcrMDcXfx8rFbdZECKiQCCy5czPN8hmO19hcOZMfLtRgSCKQi5cOEUUXWBsDA4cKGCM\nYWrqHOfPv4Dn7WXfvkN43vr/WDlwAD7zGbdjc7kCQRAvvSgQiLhTIBDZYmZnG+RyYx2PO3MGCoV4\n7HGvVauzXLz4NAcOtLjnnkPs2bMH3/cBiKKICxcu8MwzZzh9eor9+++jUHBrquTqppuuV0QKHYon\nvp+j1fIWKi0i4kp7CES2kHa7zfx84LSh8JVX4rX1TI//F8/NTXHp0hPcd1+et73tDdx0002vhgGA\nbDbLTTfdxFvf+iB3353h3LknaDbX97K//fvj2/PnXR9RoNlsrus5iPQ7BQKRLaTRaBAEOAWCCxd6\nP9CoVpvjypVvcuTIKA8+eD/5/Mr7BAqFAg8++HruvNPj7Nmn1nWewE03xbdnz7odb22eel0VApE0\nFAhEtpBms0kYgu933qB34UJ8SV6vRFHI+fPf5N57S9x3371kHEoRuVyOo0fvY9++JufPv7hu5zIy\nEjdgcr3SwPcLzM0pEIikoUAgsoU0m02CoHMgaLXg4sXeBoKzZ09yyy1t7r//25ymLiZKpRIPPHA7\nmcwF5uam1uVcjIE9e+K/swvfzzM/ryUDkTQUCES2kLgHQa7jp/ErV+JQ0Kslg8nJi5RK1zhy5K5V\nlwlWsnfvXg4fHuHy5RexLkMIHOzeDZcuuR2byxWoVkONQRZJQYFAZAuJN8K5LRdAbyoEURQyNfUS\n9923m/Hx8a6f5/Dh2xkerjI15fgu3kG6QJAnDNHGQpEUFAhEtpBGo4kxboHAmN4MNbp06Qz79rW5\n/fbb1vQ8Q0NDHD48weTkmXWpEuzZEwcCl6fyfQUCkbQUCES2kGo1IJvNdTzuwgWYmIBc50NTaTbr\nhOE57r33FnLr8OQHD97M8HCd2dlra36u3bvjPgSzs52P9f08QaBAIJKGAoHIFjI/33S6wuD8+d4s\nF1y6dIabbvLZn1z4v0bDw8PceusI16459h1eRVINcdlYmMlksNZXIBBJQYFAZItot9vUaqHTTIAr\nV9Z/uSAIGlh7icOHb051VUEnN9+8j2x2emH2QfeSv6/rPgLIKxCIpKBAILJFBEFAGOK0ZHDlCuzc\nub6vf/nyWfbty7J3nUsPO3fuZPfuLJOTjtcMrmB0NB6DfPmy6yNyNJvBml5TZJAoEIhsEUkg6LRk\n0G7D1avxHoL10mpFBMFF7rhj/7pWByAu39966y7q9ctr2lxoTDy3wbVCkM3mqVZVIRBxpUAgskU0\nm02iKB7Os5qZGYii9a0QTE5eZHy8zb4eNTbYtWsXpVKDWm1uTc8zMRGHIRe5XJ5qVRUCEVcKBCJb\nRBAERJEhm/VXPe7Klfh2PQPB7OwFbrttYl2uLFjOyMgIO3fmmJ6+sqbnmZiAa44XLGSzOarVYN0a\nI4n0OwUCkS0iCAKg8xty8gl5vZYMqtVZisUq+/b1rg+yMYabb56g0XD8eL+CsTH3QOD7OcLQEobh\nml5TZFB0FQiMMR80xpwyxtSNMV81xryhw/H/lzHmpDGmZox52RjzEePSfUVkgLgGgitXwPPiTXbr\nYWrqEnv35tmxY8f6POEKxsfHKRTqa7raIKkQpGlOFH9fRaST1IHAGPM+4NeBnwceAJ4EPmWMWfbz\nijHm+4BfXTj+LuADwPuAX+7ynEX6UrMZYIxbIJiYiEPBWllraTYvc/PNuzDGrP0JVzE6OsrISGZN\nTYrGx6HZhGq187HZbE7dCkVS6KZC8DDwMWvto9bak8CPADXiN/rlvAn4krX2D621L1trPwMcB/5W\nV2cs0qdqtQDPc1syWK/lgrm5KSqVkF27dq3PE67C8zwOHBilWu1+AmLy93bZWJjN+kSRKgQirlIF\nAmOMDxwFPpvcZ+MdO58hfuNfzpeBo8mygjHmEPAu4M+7OWGRflWtBh2vMIDrFYL1MDNzlT17igwN\nDa3PE3YwPr4Da6dpt9tdPj6+ddlHkHQrVCAQcZNNefwE4AFLrwS+BBxe7gHW2uMLywlfMnFN0gN+\ny1r74bQnK9LP6vXQuSnRoUNrfz1rLUFwlQMHejAhaQWjo6OUy21qtVkqlfSbINIEglhOgUDEUdpA\nsBIDLLvNxxjzNuBniZcWHgNuB/61MeaCtfaXVnvShx9+mJGRkRvuO3bsGMeOHVuPcxbZMqIoIgja\nHS85hPjNcA1TiV9Vq81RKgVMrGeHow4qlQqjo1mmpma6CgT5PFQq6QKBrjKQfnb8+HGOHz9+w30z\nMzNdPVfaQHAVaAFLP1Ls4rVVg8QvAI9aa//Twu+fNsZUgI8BqwaCRx55hCNHjqQ8RZHtJ+5BAKXS\n6hWCZhNqtfjyu7Wanb3G2FiW4eHhtT+ZI2MMe/eOcO7cNHBLV88xPu7enMjzctTr2lQo/Wu5D8kn\nTpzg6NGjqZ8r1R4Ca20IPA48lNy3sAzwEPFegeWUgKULhu2Fh/Z2W7PINhGGIVHUeY7B1MJ+vPW4\nQrBWm+TAgbGeX12w1OjoCDDbdcOgdM2JfHUrFHHUzVUGHwF+2BjzfmPMXcBvEb/p/w6AMeZRY8yv\nLDr+T4EfNca8zxhz0BjzncRVg/9q1UJMBLheIei0ZLBegSCKQjxvjvHxdSg1pDQyMkKh0KLRcLh2\ncBljYzA56XZsNpujVlMgEHGReg+BtfaPFjYJ/gLx0sETwDustUlP0gNAtOghv0hcEfhFYD9wBfgE\n8HNrOG+RvhJXCAyet/p/yfUKBPPz0wwN0fNmRMupVCpUKmahQ2Il9eNHR+HkSbdjfT9HsxnRbrfJ\nZNSYVWQ1XW0qtNZ+FPjoCn/29iW/T8LAL3bzWiKDIN4J73cs309NxVP/1tqlcG5uiptvLpLPb3zD\nUM/z2LmzzAsvzALphynt2AHT066v5ROGceDajL+ryHaiyCyyBcQ74TtfYTA1BcPDa+9SGATT7Nmz\nTr2PuzA+PkwYdjf5cGQE5ubiiY+d+H5OzYlEHCkQiGwBYRg6tS2emlp7dSCKQrLZGqPrNQyhC0ND\nQ2QyNVqtVurHJqscLldWJd0KdemhSGcKBCJbQKMREjcCXd3U1NovOaxWZyiXeU2Pj41UqVQoFi31\n+nzqxyanPeXQATmbzSkQiDhSIBDZAmq1wKkp0fT0emwonGFsLE+hUFjbE61BuVymVDJdBYI0FYJM\nJkO77WnJQMSBAoHIFtBohE6BYHJy7UsGzeYsu3ZtXDOi5WQyGSYmyl0FguTv71IhiPmqEIg4UCAQ\n2QLq9RDPc1syWEuFIG79McfIyOYGAoCxsQpRlL4XQbEYtzB2vdJA7YtF3CgQiGyyKIoIQ9uxQtBq\nwezs2gJBo1GlWGxvaLvilZTLZYypdtWxcHTUPRAY49NsaslApBMFApFNFoYhrVbnLoXJG+BaNhVW\nq7OUSoZKJX1DoPVWLpfJ5VoEQSP1Y9MEAs/zaTRUIRDpRIFAZJNdn2Pg1rZ4LXsIarU5JiZKeGtt\nZLAOyuUyhQJdtTBOGwjqdQUCkU4UCEQ2WRIIOu0hSN4A17JkEEXzjI8Pdf8E6yifz1MuZ6nX0weC\nNN0Ks1kFAhEXCgQim8y1QjA7G992u/xvrcWY6pZYLkiMj5dpNmupHzcy4n6VQTLPQLPURFanQCCy\nyaIowlqv4/CdmRnIZuNd9t1oNGrk822GhrZGhQBgeLhEq5U+EHQ7z0BEVqZAILLJ4jeqznPGZmfj\n6kCH+UcrqtfnKRbjtfutolQqAekDwfAw1Gpu8wzUvljEjQKByCZzHWyUBIJu1evz7NhRIJvtashp\nT5RKJXy/RRA0Uz0u+T4kyyiryWZ9Wi0FApFOFAhENtlGBYIgqDI2tnWqAxAHgkKB1PsIku/DnMPA\nRFUIRNwoEIhssmYzIpNxCwRrmUdkbZWhoa2zoRCgUCiQzxsajXSBINkG4VIhyGQ82m2jQCDSgQKB\nyCZrNEI8z20PQbf7AVutCM9rLqzZbx3GGEZHiwRBPdXj0iwZGGPQPAORzhQIRDZZve422GgtSwb1\nepV8fmttKEx0EwiSYOSyZABgbVaBQKQDBQKRTdZsRk6BYGam+0DQbNYoFs2WqxAAlEpFrE0XCHw/\nvvzSpUKw8AgFApEOFAhENlG73SYIWh2XDFotqFa7DwSNRo3R0ULHXgeboVgsYkwjdeOg4WH3QGCM\nTxAoEIisZuv9dBAZIFEU0Wp1blucvPF1u6mw2ayyY8fWqw5AHAh8v00Ypr/00HXJIB5w5NC0QGSA\nKRCIbKLrcwxWrxCsvW1xjXJ5awaCQqFALkfqqYdDQ/EyiotsVhMPRTpRIBDZREmFoJdzDNrtNplM\nY0vuH4Dk0kNoNtNfaeBeIchqwJFIBwoEIpvItUKQfBLuJhA0m3XyebZsIMhkMlQq+dQVgjSBIJv1\nNeBIpAMFApFNdH0PQe+WDIIgDgTFbqcibYDh4ULqCsHQkPumwqRbYeQy/EBkQCkQiGyiMAydJh3O\nzUG5HE87TKvRqFEseuRyuS7PsveGhoq02+krBK6BwPOymmcg0oECgcgmij+xuk867EazWWfHjq1b\nHYB4HwGkDwT1Ori8x3ue5hmIdKJAILKJoijCmN42JYqiOsPDWzsQ5PN5jAlot9vOj+lmwJGWDERW\npkAgsoniJYPeVgigsaX3D8D1Sw/T9CJIM+BISwYinSkQiGyiMHSrEMzNdTfYqN1uY8z2CQRprjRI\nUyHIZDJY6ykQiKxCgUBkEzUakdOkw2o13lSYVhA0yOW29hUGEC8ZpK0QJIHAtTmRMb6WDERWoUAg\nsolcRx+vNRDEm/a2rkwmQ7mcS1Uh0MRDkfWlQCCyiZpNtwrB/Hx3gaDZrFMoGPL5fBdnt7Hi5kTu\nFYJsFgqFOCy5UYVAZDUKBCKbyGX0sbVrqxAMDxcwxnR5hhtnaKhAFKW79LBSicOSC2OyNJuqEIis\nRIFAZJO0Wi3C0HasEDSb8fjjSiX9aySBYDuIqxjpJh6mCQTxgCNVCERWokAgsknCMHRqW5yUxLup\nEFjboFRSIID4+6yJhyIrUyAQ2SSucwzWEgigseU3FCby+Tye16LVcv8UrwqByPpRIBDZJK6BIHnD\nSxsIWq0WmUy4rQKB75NqY2HaCkEQaOKhyEoUCEQ2SdoKQdo9BGHYxPfZFlcYwPVAkKYXQdoKgdoX\ni6xMgUBkk/Q6EGyXHgSJXC6XujlR2gqB2heLrEyBQGSTRFHkNPo4CQRpmw3GgWB79CCA682JwjBw\nfky6QKAKgchqFAhENkn8SdWtS2GpBJ6X9vmbVCq5bdGDIFEq5VJVCMplqNXAZUiiKgQiq1MgENkk\n8SfV3nUpDMMmQ0PbozqQqFTyRFG6JQNr41DQSTbr02qpQiCyEgUCkU3iGgi67VIYRQ0qle2xfyCR\nz+ewNt2SAbgtG2QyGdrtjCoEIitQIBDZJPHo494FAmhum/0DibTNidIEglhWFQKRFSgQiGySZjMi\nk3ELBN20Ld6OgSCXy2FM6NwrIH0g0IAjkZUoEIhsEtdJh91UCKIoJJttb7tAkM/nyWat85UG3VQI\ntGQgsjwFApFN4jLpELrbVLjdmhIlcrkcvg9R5BYIku9LukCgCoHIchQIRDZJvGTQ+VrCbioEQbB9\nA0E2i3OFwPehUNA8A5H1oEAgsgmstYRhy6lC0N2SQYDvx2+w20naCgFo4qHIelEgENkErm2Lre0u\nEIRhk3J5ezUlAjDGLDQncg8E5XK6boVBoAqByHK6CgTGmA8aY04ZY+rGmK8aY97Q4fgRY8y/Ncac\nX3jMSWPMO7s7ZZHtzzUQBAFEUTdzDJpUKttruSBRLud6WiGo11UhEFlO5y3OSxhj3gf8OvDDwGPA\nw8CnjDF3WmuvLnO8D3wGuAj8A+A8cAswvYbzFtnW0g42Sj/6OKBc3p6BIG2FIG0giCJLq9XCS9sL\nWqTPpQ4ExAHgY9baRwGMMT8CvBv4APAvljn+HwGjwButta2F+17u4nVF+kYURURR50CQvNGlDQTW\nNsnnh7s8u81VKOSw1qEX8YJKBa6+5qPI8rJZf6HqEikQiCyRaslg4dP+UeCzyX027iDyGeBNKzzs\nu4CvAB81xlw0xjxljPkZY4z2L8jAiqKIdrt3FYLt2JQokTQncpW+QqABRyLLSVshmAA84NKS+y8B\nh1d4zCHg7cDHgb8H3AF8dOF5finl64v0hWTJoNNlh0kgSLOHwFqLMeG2u8Igkculn2eQJhBowJHI\n8rpZMliOAVbqNZohDgw/vFBN+LoxZj/wIToEgocffpiRkZEb7jt27BjHjh1b+xmLbKJksFGnqwC6\nqRCEYUA2u/16ECR83yeTaTmv86cJBJp4KP3m+PHjHD9+/Ib7ZmZmunqutIHgKtACdi+5fxevrRok\nLgCBvbE5+bPAHmNM1lq74v/MRx55hCNHjqQ8RZGtL83oY4BSyf25ky6F27lCkPQi8Lxix+MrlTg4\ntduQ6bAQmVQItGQg/WK5D8knTpzg6NGjqZ8r1Tq+tTYEHgceSu4z8Uech4Avr/CwvwZuX3LfYeDC\namFApJ+lGX1cLEKa/W/btSlRIulWGEVub9pJ9aTmsA/RGIO1nioEIsvoZmPfR4AfNsa83xhzF/Bb\nQAn4HQBjzKPGmF9ZdPy/A8aNMb9hjLnDGPNu4GeA31zbqYtsX2kCQfqmRAG+b/D9zl0Qt6LrgaA3\nA46M0cRDkeWk3kNgrf0jY8wE8AvESwdPAO+w1l5ZOOQAEC06/hVjzN8FHgGeBM4t/Hq5SxRFBkI8\nYKdXkw7eaf14AAAgAElEQVQDRke3X5fCRDabxfcNQZBuwFGy36ITazXxUGQ5XW0qtNZ+lPhKgeX+\n7O3L3Pc/gG/v5rVE+lE82KjQ8bhqNX2XwjAMqFS253IBJO2LfWq1dBUC10AAWVUIRJahXgAim6DZ\njDr2IIDuKwSl0vYNBACFgu+8h6CbJQPNMxB5LQUCkU3gGgjm57vpUhiQz2/vQFAuu7cvTrtkoImH\nIstTIBDZBL2sEECwba8wSMTti93etHM58P10zYmaTVUIRJZSIBDZYNZawrClQLCK+AoJtwqBMfH3\nyLVCkM36CgQiy1AgENlgrpMOIf2mwlYrwvPafRII3Mv65XK6CkGjoUAgspQCgcgGSxsIumlbvF17\nECSSAUc3NjhdWTcjkHWlgciNFAhENphrIAgCCMN0gWC7dylM+L6P56XrVphmyUDzDEReS4FAZIO1\nWi2nQJB84u2mQtAPgSBN++JknoELzTMQWZ4CgcgGc60QdBMIoigkn8+Qza7XINPNkQw4arXcKwQa\ngSyyNgoEIhvMNRAkn3jTbCqMooBCYXvvH4DrSwZpehFoyUBkbRQIRDZYFEVY63WcNZC8waVdMiiX\nt/dyAVyfZ5BmycC1QpDJeESRlgxEllIgENlgURRhjNsVBpAuELRaIcXi9q8QABSLfqolA9cKQRzE\nNM9AZCkFApEN5jr6uJs9BP3QtjhRLOZSVQiazfiqDBcagSzyWgoEIhvMNRBUq1AogOelefZw219h\nkCiV0g840ghkke4pEIhssDSBIO3oYwi2fVOiRD7v0273ZsCRlgxEXkuBQGSDNZsRxnT+2J+2S2G7\n3caYVt9UCNK0L047AjmT0TwDkaUUCEQ2WK8mHSZdCvulQpAmECTfp3TzDLRkILKYAoHIButdIAj7\nYo5BoptAkKZboSoEIjdSIBDZYK6BYH6+u0DQT0sGnmdptTq/caddMshmfep1VQhEFlMgENlA1lqC\noNWT0cdR1B+TDhNp5hl4XnxFRpoKQRi2nKcpigwCBQKRDdRqtYgi27Mlg3w+SybTH/+t0048TDPg\nSO2LRV6rP35yiGwTrnMMIH2FIAwDSqX+qA5A+omHaQccqX2xyI0UCEQ2UNpAMKhti+F6IHBtX9zN\nCGRVCESuUyAQ2UCugSAI4ja8aQNBP0w6TGQyGXI5rydLBp7nq0IgsoQCgcgGarVaToGguzkGYd/M\nMUgUi+7ti9MuGahCIHIjBQKRDeRaIehm0qExYd9cYZDoXSDwaLczCgQiiygQiGygKIqwNtPxSoAk\nEKTZVGht/8wxSBQKvlMfAki3ZBDTgCORxRQIRDZQmsFG4F4hSOYY9FsgyOd9rF3/CgFoBLLIUgoE\nIhsoiiKMcetSCO6BoN/aFiey2SxpBhxVq+Daa0gjkEVupEAgsoHiJYP1rxC0Wv0ZCNLOM2i1oNFw\ne25jfMJQFQKRhAKByAZKs2RQKMQted2eV4GgmwFHmngocp0CgcgGajYjMplezDEI8bz+DATxgKNW\nx2OT71eaXgSNhioEIgkFApEN1MvRx75vFtbc+0cyz8ClW2HaiYeqEIjcSIFAZAP1avRxv7UtTmSz\nWed5BmkrBNmsT7OpCoFIQoFAZAP1skLQT22LE2kmHibfrzQVgjC0uvRQZIECgcgG6mUg6McKwfUB\nR53ftItFyGTcA4FGIIvcSIFAZINEUUQU2Z4Egna7PysEnufh+xmnCoEx8fcs7cRD9SIQiSkQiGyQ\ntKOP01xlAP03xyBRKGSdRyCn6VaYzcYTD1UhEIkpEIhskLSBIE2FoL8DQboBR6oQiHRHgUBkg6QJ\nBGmvMuj3QNCLAUdxIDAKBCILFAhENohrIAgCCMM0bYtbZDLtPg4EvVkyAA04EllMgUBkg7gGgvRz\nDKK+bFuc8H0fY3ozAlkDjkSuUyAQ2SDxYKMMmczq/+2SNzTXTYWtVn+2LU5ks9mejUAGVQhEEgoE\nIhskHn3c+U07bYWgXwcbJdIMOEpbITDGJwhUIRABBQKRDeM66TD5hJsmEHgefTfHIBEHgghrbcdj\n0wYCzTMQuU6BQGSDxEsGbpccQrpA0I+DjRLJPAOXKw2Syw4dhiMC8cTDel2BQAQUCEQ2TLxksP6B\noF8HGyXSzDNI9l3U627PrQFHItcpEIhskHo9JJNxCwSFArh+4O/XwUaJ6yOQ3SoEkK5bYb0eOi1H\niPQ7BQKRDdKrwUatVtTXgSDNCORuJh5qwJFITIFAZIM0mxHZbOc37rRdClutkEKhP/cPQLqJh8mS\ngevGwmSegXoRiCgQiGyYXlUI+rltMUAmk8H3M07dCtNXCBQIRBJdBQJjzAeNMaeMMXVjzFeNMW9w\nfNz3GmPaxpj/r5vXFdmu2u02QdBSIOiS64CjbioEWjIQiaUOBMaY9wG/Dvw88ADwJPApY8xEh8fd\nAvxL4AtdnKfIttbLwUbGRAMRCFyWDHI58P10A45UIRCJdVMheBj4mLX2UWvtSeBHgBrwgZUeYIzJ\nAB8H/h/gVDcnKrKdXQ8Ebp0KXdsWx7vjo77tQZAoFLLOI5ArFfclg7iNtOYZiEDKQGDivqtHgc8m\n99n4J9JngDet8tCfBy5ba/9TNycpst1FUUQUuVUI0iwZJF0KB6FCYG1vBhyBr0Aggksf1RtNAB5w\nacn9l4DDyz3AGPNm4AeB16c+O5E+EYah85JB2kDQz3MMEvGAo4bTsWkHHGnioUhsveqMBnhNZw9j\nTAX4PeAfW2un0j7pww8/zMjIyA33HTt2jGPHjnV7niKbIu0eAvdJh/09+jiRZsBRNxMPFQhkuzp+\n/DjHjx+/4b6ZmZmunittILgKtIDdS+7fxWurBgC3AbcAf2qMMQv3ZQCMMQFw2Fq74p6CRx55hCNH\njqQ8RZGtJ4oi2u0MnuetelwQQBhq9PFS8R6J3iwZxPMM3KoPIlvNch+ST5w4wdGjR1M/V6o9BDYe\nSv448FBy38Ib/UPAl5d5yLPAfcD9xEsGrwc+AXxu4ddnU5+xyDYUfwLtzaTDbLZ/Jx0mfN/HGLeJ\nh2krBEn7YpFB181PkY8Av2uMeRx4jPiqgxLwOwDGmEeBV6y1P2utDYBnFj/YGDNNvBfx2bWcuMh2\n4jr6OPlk61ohiKKQcjnL9QJcf1o8z6BTt8duKgQagSzSRSCw1v7RQs+BXyBeOngCeIe19srCIQdw\nre2JDIg4ELi1LYY0kw6jvp50mMhms69OPOwUCJIRyO7PfX3AUb8HK5HVdFVntNZ+FPjoCn/29g6P\n/cFuXlNkOwuCMNXo4zQVgny+v5cLIN08g7RLBr6fe7VbYb/vxRBZjWYZiGyARiNyakqUvJGl2VQ4\naBWCTiqV65szXXieTxiqW6GIAoHIBmg0QudLDo2BUsn1mSNyuf4PBGkrBJB+4mEQBGs4Q5HtT4FA\nZAMEgfukw1IJMo7/M63t/8FGkG7iYVJdcV02SAYcqUIgg06BQGQD1Ouh85KB63JBLOz7Sw4TvZp4\n6HlZWi2jQCADT4FApMdarRZRZDvujgeNPl6N68TD5PvnWiGIryxQt0IRBQKRHgvD0HmwUdq2xZ5n\nBygQuE08TLtkAGCtAoGIAoFIjyVzDNa7QhAHgv5vW5xwnXiYbMhMO/FQmwpl0CkQiPRYmkmHaSoE\ng9K2OBFPPOz8Kd7zoFhMVyHIZHI0m6oQyGBTIBDpsWTJwKVCMD+fbo7BIFUI0kw8TNu+OJv1qVZV\nIZDBpkAg0mPxkoFxvuxQo4+Xl2biYTftizXPQAadAoFIj7lOOoT0FQLf7zxSuV/0duJhjlotdHpu\nkX6lQCDSY3Eg6Pwpvt2GWi1d2+JCYTD2D8CNEw876WbJIIrswhAqkcGkQCDSY66TDms1sDZdhaBQ\nGIzlAkg3z6CbCkEYqn2xDDYFApEeiycdrv9goygajMFGiWSegWsvgvQVArUvlsGmQCDSY/FgI7ce\nBOAeCKyNBqpC0MslA9/PacCRDDwFApEei+cYuPUgAPclg0EZbJTIZrMLEw/Xf8kgnmeQUSCQgaZA\nINJj9Xro3KUQ0gw3GpzBRhBPPMzlPOclg/n5eE+GK2NyWjKQgaZAINJD1lqazci5KRGkCwSDVCGA\ndAOO2m1oNNyf21q1L5bBpkAg0kNpuhRWq+D7kMt1ft52u40xrQEMBL0bcGRMjmZTgUAGlwKBSA9d\nn3ToViFQl8LVFYu+82WHkG5joeflqNUUCGRwKRCI9FDaOQZpLjkcpDkGiXzex6V9cRII0lQIfD+n\neQYy0BQIRHoomXS4/qOPB2vSYcL3faeJh0mwSteLIEe9rk2FMrgUCER6KA4EboON5ubSjz4etApB\nHIB6Ewh8P0cQtHWlgQwsBQKRHgrDEGuzGGM6Hjs3B8PDbs8bBwIzkBUCl0BQKEAmo/bFImkoEIj0\nUBiGGONw2QAwOwtDQ27PG88xcAsa/cT3fTKZNu12e9XjjFG3QpG0FAhEeiiuELiV9dNUCOJJh4O1\nXADX2xdrwJHI+lMgEOmhRiNwGmwE6fcQDNJgo0Sa9sVJt0JXnufRbmdpNptrOEOR7UuBQKSHXNsW\nhyHU6+kqBIMYCNJMPCyX0y0ZxHKqEMjAUiAQ6aFaLcT3O+8hmJuLb133EBgTDdwVBtDbJYOYAoEM\nLgUCkR6q1wOnLoVJIHCtEAziHAOIlwx83zi3L05bIfC8PNWqlgxkMCkQiPRIFEWEoXVaMkgCgese\nAmuDgQwEELcvdh2BnDYQZLNqXyyDS4FApEeCICCKSLVk4FIhGNTBRgnXiYdpNxUC5HJ55udVIZDB\npEAg0iNhGBKG8afOTmZn41uXPQSD2qUwkWbAUdoKge/naTbVrVAGkwKBSI8EQeA8x2BuLu6u5zL6\nOJljMKiBoFDwabfdAkGtBq2W+3OrF4EMMgUCkR6JlwyMcyDQHAM3ru2Lk+WXNMsGuVyeMES9CGQg\nKRCI9EhcdnZrW5x2jsEgjj5OuAaC0dH4dmYmzXMrEMjgUiAQ6ZG47Oz2pp12jkEulxm4wUaJeARy\n55L+yEh8myYQGGOwNqdAIANJgUCkR+JA4F4hcA0EgzrHIJEMOGp12BzQTSCI5RUIZCApEIj0SK0W\nOF1hAOkCQRgGlEqDHQhc5hlUKvHUw+npdM9vTJ56XYFABo8CgUiPVKvpAkGaPQSDOMcg4TrPwPPi\n72naCkEuV1AvAhlICgQiPVKrBU5NiSDdHgJrQ/L5wQ4ErvMMRkbSBwLfzzM72+jy7ES2LwUCkR6I\noohms+1UIWi340vjXAMBhORcGhb0qTQTD0dG0i8Z+H6eRqNFFHXuhijSTxQIRHqg2WwShvGbSyfz\n83EoSDbBdTa4cwwAPM8jn/ec5hmMjl7vAukqlysQBNBoqEogg0WBQKQH0swxSD7BugQCa+3Ajj5e\nrFj0CcPOlx52s4dAvQhkUCkQiPRAEATOcwySN6ykkc5qWq0Iz7MDvWQA7vMMulsyyBFFGVUIZOAo\nEIj0QBAEtNtZPM/reGwSCFwqBGEYDHTb4kSplHNaMuhmU2HcnCivQCADR4FApAficrPbp/jp6fh6\neZfLDpPBRoNeIcjl3LoVjo5CvQ7pZxUVFAhk4CgQiPRAHAg6byiEOBAMDcXXzXeiCkHMdZ5Bt90K\ns9kCc3MKBDJYFAhEeiBuSuQWCGZm3PYPQHypXT4/uHMMEnGFpDfzDOLnL6gXgQwcBQKRHqhWm85d\nCqen0wSCYKDnGCR838eYFu12e9Xj1hIIqtWw47wEkX6iQCCyzqy1zM83nXoQQPxm5dqDIAwDyuXB\n3j8AcYXA9+OAtJokaKW90iCfL9JsQr1e7/IMRbafrgKBMeaDxphTxpi6Mearxpg3rHLsDxljvmCM\nmVz4+svVjhfZ7sIwJAgsuZz7HgLXCkGrFVIqKRDkcjmnboWFAvh++kCg5kQyiFIHAmPM+4BfB34e\neAB4EviUMWZihYe8Ffh94G3AG4GzwKeNMXu7OWGRrS5Nl0JIt4fA2oBcTksGSfviTs2JjIGxMZia\nSvv8OaLIU4VABko3FYKHgY9Zax+11p4EfgSoAR9Y7mBr7T+01v6WtfYb1trngR9aeN2Huj1pka2s\n2WwSBG6BwNr406vrpEMIBv6SQ3BfMoA4EFy71s2rFBUIZKCkCgTGGB84Cnw2uc9aa4HPAG9yfJoy\n4AOTaV5bZLtoNptEUcapbXGjEV8j71ohUCCIGWOcuxWOj8NkFz9tjClSrSoQyOBIWyGYADzg0pL7\nLwF7HJ/jw8A54hAh0nfidWf3/QOQpm1xW4FgQbGYc64QdBMI8vki09MKBDI41utiZgPYjgcZ89PA\n/wa81Tq0GXv44YcZWbL9+tixYxw7dqzb8xTpuTRNidLMMUiaEikQxEoltwFH3S4Z5PNFZmcbtNtt\nMhldkCVb0/Hjxzl+/PgN982kvc52QdpAcBVoAbuX3L+L11YNbmCM+RDwU8BD1tqnXV7skUce4ciR\nIylPUWRzzc83yGZLTscmm91cAkEUBfi+AkGiWMzRbrsFgpkZaLXcukEm8vkS1Wp86WG5XF7DmYr0\nznIfkk+cOMHRo0dTP1eq2GutDYHHWbQh0BhjFn7/5ZUeZ4z5SeCfAe+w1n499VmKbCOzsw1yuYLT\nsdeuxTvhd+zofKwqBDdy7VY4Pg7tdve9CGq1WncnKLLNdFMH+wjww8aY9xtj7gJ+CygBvwNgjHnU\nGPMrycHGmJ8CfpH4KoSXjTG7F74UuaXvtNtt5ueDVIFgdNTtk2sUBWpbvIhrIBgbi2/T7iOILz3M\n6koDGRipA4G19o+Afwr8AvB14HXEn/yvLBxygBs3GP4o8VUF/y9wftHXP+3+tEW2pkajQRDgHAgm\nJ+NPsC7CMFBTokVyuRzGRB3bFyff3+4uPSypQiADo6uPGtbajwIfXeHP3r7k97d28xoi21ESCEZH\n3SsEroEgitS2eLF8Pk8uB2HYJJ8vrnhcsj+jmysNstkSMzPVLs9QZHvR1lmRdVSv1wlD49yl8Nq1\n6yXtTqKoSbns9ryDIGlf3OlKA9+PZ0V0EwgKhTLXrqlCIINBgUBkHTUaDawtEO+17SzNkoGaEt0o\nbbfC7noRlKjVWpppIANBgUBkHcUb0NyWC6yN36RcKwTQJJ9XhSDh+z75fIYwbHY8dnwcrl5N/xrF\nYplGA6pVLRtI/1MgEFlHMzN1fH/l9ezFZmchitwqBO12G2MiVQiWKJVyTs2Jdu6EK1c6HvYa8dRD\nT4FABoICgcg6mplprLrBbbGkhO0SCMKwSS6HKgRLVCp5pwrB7t1w+XJ3r2FtWYFABoICgcg6aTab\n1Got50CQXAbnGgh8X4FgqXI579StcOfOOIAFnQ99jVyuwuTkfBdnJ7K9KBCIrJN6vU6zGW9Ec5EE\nApc9BOpSuLxcLoe1bhUC6G7ZoFiscO1arWO/A5HtToFAZJ3UajWCwDg3JbpyBYaHweU9PgybFAqe\nuhQuEVdMOgeCXbvi224DQa1mtWwgfU+BQGSd1Go1rC04T8a7fPn6J9dOwrBJpaLlgqXy+Tye16LV\nilY9bufO+PbSqiPYllcolKnXDfPzWjaQ/qZAILJO5udrGOO2XABxIEg+uXYSBA2Gh90qD4Mkn8/j\n+xAEq1cJCoW4OVE3Gws9z6PdLjE3N9flWYpsDwoEIutkaqpGPu8+s+vSJfdAYG2TYlEVgqUWty/u\nZNeu7q808P0hJicVCKS/KRCIrINWq8XMTINCwa1CYG0cCFyXDNSUaHlxIDAEQedOgmsJBMXiEJcv\nz2tjofQ1BQKRdVCtVmk04vVmt+OhXnerEMRNiQIKBS0ZLGWMoVzOOVcIutlDAFAuD1OtWi0bSF9T\nIBBZB9VqlXrd/ZLDixfjW5cKgZoSrW54uOBUIdi3D86fh24+5BeLFer1DLOzs12cocj2oEAgsg6q\n1SrtdhHP85yOT0rXLhWCIGiQy6EKwQrK5TytVudAcOAAhGF3lx7Gw6qGmZ6eSf9gkW1CgUBkHczM\nzJPJVJyPv3QJslm3pkRJIFCFYHlxUOq8ZLB/f3x77lx3r1MsjnDxogKB9C8FApF1cOXKPMViukCw\naxe4tCwIggaVSt65v8GgKRQKGNPEWrvqcXv2xN/vV17p7nXK5RGmp0NqtVp3TyCyxeknjMga1et1\n5uaiVIHglVeuf2LtRD0IVlcsFsnlbMd9BL4fh4Lz57t7nXJ5hPl5w/T0dHdPILLFKRCIrNH8/Dz1\nOpRKQ86POXfOPRC0Wg0qFQWClRQKBXI5nDYW7t/f/ZKB53lYO8zk5FR3TyCyxSkQiKzR7OwsYZjH\n990GD7Xb8adU10AAdYpFtwmKgyjpRdBs1jseu39/90sGAKXSDs6dm+q4PCGyHSkQiKzR9PQcnjfs\nfPyVK/EY3gMHOh/barXUg6CDTCbD8HDeuUJw/jy0Wt29VqWyg6mpSP0IpC8pEIisgbWWixdnKZXc\nA0FSsnapEARBg3weVQg6GB0tOlUIDh6Mw1jSByKtuEFRlmvJ7GqRPqJAILIG8/PzzM21KZdHnB/z\nyivxbve9ezsf22zWFAgclMtFrO0cCA4dim+/9a3uXscYQzY7xsWLCgTSfxQIRNZgenqaWi2T6gqD\nc+fi3e7ZbOdjm8065XKWXM5tf8KgigNT50CwY0c89bDbQAAwPDzB+fPzNBqdlyhEthMFApE1mJqa\nBoZT9Qg4cwZuucXt2GazzuioqgOdlEolfL/VcQyyMXDrrXDqVPevNTw8zuxshivdtDwU2cIUCES6\nZK3l/PkZSqUdqR73rW/Fb0ouoqjGyIjbfIRBViqVKBTiJZZObr11bRWCuD31GBcuKBBIf1EgEOnS\n3Nwc09MRQ0PugWB+Pr7KwDUQQI1SSYGgk0KhQLGYodHoHAgOHYqXbZqdux2vaHR0Fy+/PEu93nmZ\nQmS7UCAQ6dLk5CTVajZVQ6KkVO0SCMIwIJsNFQgcGGMYHS3SaFQ7HnvbbXEviLVUCUZGJpidzXKx\n28sVRLYgBQKRLl26dI1sdmxhEp6bU6fA8+Dmmzsf22zWKBSgXC6v4SwHx9hYmTDsXCG47ba4jfGz\nz3b/WplMBt/fxenTF9WkSPqGAoFIF5rNJufOzTE8PJHqcS+9FDck8v3Ox9brVUqljC45dBQHp84V\nglwO7rgDnnlmba83Pr6X8+eb6kkgfUOBQKQLV65cYWYmw/Cww/ziRZ57Dg4fdju2Xp9nbKyUqgIx\nyMrlMtls2PFKA4B77llbhQDi2RWNxjBnzqyhF7LIFqJAINKF8+cvY8wYnufQTGBBEMQVgrvvdjs+\niqrs2KHlAleVSoViMQ5Sndx9d9zCeGqNc4rGx2/iW9+aVitj6QsKBCIp1Wo1Xn55lpGRXake9+KL\nEEVugSBel56nUnFveDToCoUCQ0NZp0Bwzz3x7dNPr+01R0YmmJkpcurUmbU9kcgWoEAgktLFixeZ\nmckyMpJu/8DJk/HegaR97moajRr5fJuhIfcrGAR27qxQr3f+tL5nT9w6+sSJtb2eMYaxsVt47rmr\nqhLItqdAIJJCu93mpZcuUCjsSdWdEOJPo3fc4bqhcI5SCVUIUhodHaLddntjfvBB+NrX1v6aO3bs\nZna2zPPPv7T2JxPZRAoEIilcunSJCxdCJiYcRhUuYi18/etw//1ux1ers0xMlMi6DDyQVw0PD+P7\nTaeNhUePwtmzcOnS2l7TGMPOnbfx3HPTXL58eW1PJrKJFAhEHFlreeGFl2m3d5LPp7sU8PTpeAPb\nkSNuxwfBLDt3uo9Ultjw8DDlMtRqsx2PPXIknjq5HlWC4eExgmAnTz31ImEYrv0JRTaBAoGIo4sX\nL3L6dJ3dux0nEy1y4kS8VHDvvZ2PbbVaeF6VkRH3kcoSy+fzjI8XqFZnOh47NATf9m3wxS+uz2vv\n338Hp0+3ee6559fnCUU2mAKBiIMoinjmmVPA7lSjjhOPPRa/+RQKnY+tVmcol60CQZf27Bml0Zh2\nOvZtb4srBDOd80NHvp9jfPwwTz55hXPnzq39CUU2mAKBiINTp05x5kyLPXscLhFYYn4+rhC85S2u\nx0+zY0dOMwy6NDo6iufNE0WdS/dvfWu8v+NLX1qv194JHOBrX3uRqbU2ORDZYAoEIh1MTk7y5JPn\nGBo6RC6XT/34r3417j/gGgjq9Un27083Ulmu27FjB8PDMDfX+Q15bCze6PmpT63f6+/bdxuTkzv4\n6le/qUsRZVtRIBBZRaPR4PHHn2VuboyJiX1dPcfnPw933QW7HPoYxRMO5xkbS9cSWa7L5/Ps3Vth\ndtZtxsB3fRc89VTcRXI9GGO4+eZ7OX++zJe//CQz67EeIbIBFAhEVhCGISdOPMWZMx433XR3VzMF\nrl6NKwTvfKfb8TMzVxkdNQoEa7RnzzhRdM1pEuFb3gITE/Bf/sv6vb7neRw8+DrOnavwxS8+qcsR\nZVtQIBBZRhAEPP74kzz7bMCBA68jm3XoJrSMT34yvrrgoYfcjp+bu8qBAyP4Lt2LZEU7d+5kaChy\nWjbIZuG974VPf3rtPQkW87wsBw++jsnJnfzVXz3DCy+8QLvdXr8XEFlnCgQiS8zPz/OVr5zgm98M\n2LfvfgqF7jb3BQH8yZ/A298OLg0HwzDAmCn27k03I0Feq1KpsG9fiampi07H/4N/AOUyPPro+p5H\nJpPh5pvvxpg7+NKXLvDlL3+N6Wm3KyBENpoCgcgCay0vv/wyn//8CV580efmm49QLHY/bfDP/zxu\nRnTsmNvxU1OXGB837Ny5s+vXlOtuvnkP7fZVp6sNikX4gR+IKzprHYu8nJ0797Nnz1Gef97n059+\ngm9845tUq9X1fyGRNVAgkIFnreXq1at85Stf46/+6hSzs/u59dYHyOUcmgasYH4ePv7xuDpw001u\n5zA3d57bbtup5YJ1snfvXiYm4Nq1C07Hv/e9cPvt8C//ZVzdWW/FYplbb72fbPZuHntsnk9+8m94\n8uSiavEAAA69SURBVMmnmJqactrrINJrCgQysKIo4ty5c3z5y3/Dpz/9TZ57LsfOnUfZv/+21IOL\nlvrt34ZaDf7xP3Y7fmbmKsPDdQ4cSDcjQVbm+z533rmb+flXaLVaHY/3PPjJn4RXXoF//a/j/gTr\nLZ6OuJvbbvufMOYuvva1Bp/85JN88YuPcfr0aWq12vq/qIgjTU6RgdJoNJicnOTKlWucOTPJ5CRY\nO87OnYepVNanM+BXvhLvWP/gB90uNbTWcu3aaR54YAfDw5pfsJ5uueUWTp68yJUrr7BnT+eW07ff\nDj/xE/DhD8P+/e7LPWnFwWAPY2N7mJ+f4fTpC7zwwlmGh0+zZ0+JvXvHGBsbY2RkBM/zenMSIkso\nEEjfarfb1Go1ZmdnmZ2d5dKlGa5erTM3Z2i1hhkevo39+3fh+7l1e80XX4Rf+RX49m+PN6q5uHr1\nHKOjVe644651Ow+JFQoFvu3bDvCFL5yh2dzlNJTqne+Ec+fg3//7eOng/e+HLq44dVapjFCpjNBu\n38nc3CSnTl3j+eevUCi8QqVi2LOnwtjYMENDQ1QqFUql0porWCLLUSDoI8ePH+dYrz7SbGFhGNJo\nNKjX69RqNWq1GtPTNa5erVKrWep1Q7tdJp8fo1IZ5aabduB51//pf/azx3noobV/3559Fn7mZ2Df\nvvjW5Wd2o1Fjfv4Ub3nLfoaGhtZ8DhtlO/1bO3jwIOfOXeWFF57h1lsfcHoz/cAHIJeLl35efBE+\n9CFYj9ESq/1by2QyjIxMMDIyAST/NqY5eXKGVmuKTOYcxSIUi4YdO4qMjpYol0sUi0UKhQKFQoF8\nPt93YWE7/Vvb7roKBMaYDwIfAvYATwL/h7X2b1Y5/n8FfgE4CDwP/LS19i+6eW1ZWT/9x2m1WkRR\nRBiGhGFIEASv3gZBQL3eZG6uyfx8k0ajRRBAswmtlg+U8P1hCoW9VCoVdu6srFp2/dzn1hYIWq34\n8sKPfQzuuAN+9VfdLjOMopBz577JXXflOXQo/YyEzbSd/q15nscDD9zD3NzXOXPmGQ4evLdjkylj\n4B/+Qzh0CH7t1+Jf/+APwrveBfn03atflebfWqFQolAovdohs9WKqNerNBpVzpyp8sILNeAyxjTJ\n5Sy5XNzzolTyqVTylMs5CoU8vu+Ty+XwfR/f98lms6/eZrPZrhpubaTt9G9tu0sdCIwx7wN+Hfhh\n4DHgYeBTxpg7rbVXlzn+TcDvA/838OfA9wF/Yox5wFr7zFpOfjOEYUiz2cQY4/QF3PDr7cxae8NX\nu91+ze1KX61W6zW3URTRarUIwxbNZkQQxLeNRkgUWaIofrNttSAMod3OADkghzF5crkyvp8nlysw\nPFwgny/e8Mm/11qteHTuf/7Pcdvb7/5u+NEfjT9ZdhIEDc6efYqDByOOHHlA68Q9NjQ0xBvfeC9f\n+tI3OXXqG9x88z1Ozabe/Gb43d+F//Af4N/8m/jX7353PCXx9tt7u5SwlOdlX11eWKzdbhOGTYKg\nQRg2mZxsculSkygKsLYKBBgTYkyLbDbePJnceh74vkculyWX88jlvIXfe3he/JXJZF69Xekr+Rm3\n0q+BFX82Lr5d+muIf+502hS69CqNxb9Pfr3c7dJfr3bfcj//8vk8O3b0z9yRbn56Pgx8zFr7KIAx\n5keAdwMfAP7FMsf/n8BfWGs/svD7nzfG/F3gx4Ef6+L1N9Vjj32ds2drGMOrX8Cyv198f/xrgzGQ\nyVz/D5HJLH8L5tXHXb/v+nMs/n3i2rVpvvCFx1Y898X/Sdrt5B998g8fwNJu21fvi38d3954/Gu/\n2u3X/vrGW4MxHtZmAO+Gr0zGJ5Mp4HnZG77yeZ9sNv7yPH9LvGlOT8dLA1/9ajwhb3ISHngAfvM3\n4Z57Oj/eWsvk5EWmp1/i9tuzvOEN91Msdl7XlrUbHx/nrW99PX/zN09z5sxjjIzcytjYno4l9rEx\n+Kmfgu//fvjjP4Y//VP4/d+H3bvhda+Lx1ofPhxfXroZAyozmQz5fLHj/ohWq0WrFdFqhURRSKsV\nEUVxEJ+djV7983a7RbvdAgKgDbSANsa0sba1cF974WfZjT/7ln7B6j8bF98uldx/8eIkn/jEF5c9\nptOVIMmfL71d/OfLHbP4/uXuS3627d4N73rX21Y/iW0kVSAwxvjAUeBXkvustdYY8xngTSs87E3E\nFYXFPgV8d5rX3ipqtZBqdYzdu28BlqbKlZPl4vtjN96/+DZ5nuX/jGV/D1Cv+5w9O97x77BcGo9v\nX1vRSO6/Md1nXg01xmQW3bf018knCG/LV0harbh3wNwczM7Gv56dhStX4OJFuHABXn75emvbPXvi\nHgPf+Z1w552dn7/ZrDM9fYX5+QuMjNT59m/fwx133E42q208G2l0dJS3vvUNvPjiS5w8+TynTp2m\nUNjF8PA45fLIquFg/374J/8EfuzH4Otfj0PhN78Jn/1s/AYB8UyEffvi27Gx+HbHjrgLYrkM1Wr8\nb6lcjpshZbMbV2VIPvHDGtY8FrleHWwv/Gy7Xilc7mfj0p+Fi39eLn7O16pg7d033HP95xPL3n/j\nr5d+oFpalViuarG0mvHa309OXiQMX3D7Zm0TaX8aTRB/rFva8fsScHiFx+xZ4fg9q7xOAeDZXrQM\nW4OzZ+FP/uQKtVqDSiUCXpsil9639M/S3Lfa8y33mEuXIv7sz2aW/bNOz9PpuLTn0ukxy6XvxRWF\nThWH5asQy/95FMVLDotvk1+HIQTBDH/n75xY9u9TKMQ/1Ccm4k+Dt9wCt94K4+PXfxidPBn/UGy3\nk09gEVEUEIYBQVCn3a6RywVUKhkOHNjB7t27qNdrfOMb31j9m7mFzczMcOLE8t+z7WL3bh/Pu8KF\nC89x9mxIo2GwtogxBXK5PNlsjmw2SyYTV6wWh9vh4QzveIfhHe+I965cvHg9OF69GvcyePppmJmB\nRmPxq87wfd934/fN9+OvbPbGXydfmUxc2jdm+dtMZvmvxZ/KF+ec5JN98uvkdqVP9ksf43L8Sl77\nBr768QAXLjT44z8+1/Gxqz1X2vNyeZ1abY79+89y001b7//BovfOVN3VTJoOWcaYvcA54E3W2v+x\n6P5/AbzFWvvtyzymCbzfWvuHi+77MeDnrLXLzpM1xnzf/9/e/YZYUYVxHP/+EiujwBelZFIgghUU\nZkQRqJShlJSUFIq+MZSM/ggmgoVYUGQlVlYi9s8MwwwqCgqjRMEtLf++KULQskX7o4aFmVk+vTiz\nu3fV3Z27sJ65+vvAfbHDucOzw9yZZ86ccx5gRenAzMzM7HiTIuKdso3r7SHYR3qh1P+47f04sReg\nxc91tof0SmES8APwdyftzMzMrL1zSbP6Vtfzpbp6CAAkbQA2RsSM4m8Bu4FFEfHcSdqvBPpExLia\nbU3A9ohouEGFZmZmp6PujGhaCLwlaTNt0w7PA5YBSFoONEfEo0X7F4F1kmaSph1OJA1MLLnKu5mZ\nmfW0uhOCiFgl6ULSQkP9gW3AmIj4rWgyEPi3pv1XkiYCTxWfHcC4RlyDwMzM7HRV9ysDMzMzO/2c\nXotem5mZWbc4ITAzM7PGSAgkjZW0QdJfkg5Iej93TI1A0tmStkk6Junq3PFUmaTLJL0maWdxnu2Q\n9HixOqfVkPSApF2SDhe/y+tyx1RVkuZI+lrSH5J+kfSBpBJrW1qL4hgek7Sw69ZnNkkDJL0taV9x\nHdsuaVjZ71c+IZA0HlgOvA5cBdxIKpZkXXsWaKZ2LWTryOWkNU6nAVeSZs9MJw2EtUJNcbN5wDWk\naqeri4HGdqLhwEvA9cAtQG/gM0kuYFFCkWxOI51n1glJfYEm4AgwBrgCeAT4vfQ+qjyoUFIv0uJE\ncyNiWd5oGoukW4EFwHjgW2BoRDTuWrkZSJoFTI+IwbljqYoO1iH5ibQOycmKm1mNInH6FRgREetz\nx1Nlks4HNgP3A3OBrRExM29U1SVpPmkV4ZHd3UfVewiGAQMAJG2RtEfSJ5JK1JU7c0nqDywFJgOH\nM4fTyPoCB3IHURU1xc2+aNkW6Ymis+Jm1l5fUo+dz6uuvQJ8HBFrcgfSIG4HNklaVbye2iJpaj07\nqHpCMIjUjTuPtO7BWFL3x7qie8RO7k1gcURszR1Io5I0mFSie0nuWCqks+JmnRUrM1p7U14A1nsd\nls5JmgAMBebkjqWBDCL1pnwPjCZduxZJmlx2B1kSAklPF4NEOvr8Vwy8aYnvyYj4sLjBTSFl2Hfn\niD2XssdM0sPABcAzLV/NGHZ2dZxrtd+5BPgUeDci3sgTeUMRHqdSxmLS+JQJuQOpMkkDSYnT5Ig4\nmjueBnIWsDki5kbE9ohYCrxKShJKyVWMfQHpKbYzOyleFwCttRwj4h9JO4FLeyi2qipzzHYBNwE3\nAEfUvm7nJkkrImJKD8VXVWXPNSCN0gXWkJ7i7uvJwBpQd4qbGSDpZeA2YHhE7M0dT8VdC1wEbFbb\nRawXMELSg8A5UeXBb/nspeZeWfgOuKvsDrIkBBGxH9jfVbuiXsIRYAjwZbGtN6mK0489GGLl1HHM\nHgIeq9k0gFTx6h5S7YkzStnjBq09A2uAb4B7ezKuRhQRR4vf5CjgI2jtBh8FLMoZW5UVycA4YGRE\n7M4dTwP4nDSjrNYy0s1tvpOBDjWR7pW1hlDHvTJXD0EpEfGnpCXAE5KaSf/YbFL35HtZg6uoiGiu\n/VvSIVKX7s6I2JMnquqTdDGwljSrZTbQr+XhJCL89Num0+Jm1p6kxaSCbncAh4oBvwAHI8Kl3U8i\nIg6RZka1Kq5j+yPi+Cdga/M80CRpDrCKNNV1KnUUEqx0QlCYBRwlrUXQB9gI3BwRB7NG1VicUXdt\nNGlQziDSNDpoezfeK1dQVVOiuJm1N510Dq09bvsU0jXNyvE1rAsRsUnSncB80jTNXcCMiFhZdh+V\nXofAzMzMTo2qTzs0MzOzU8AJgZmZmTkhMDMzMycEZmZmhhMCMzMzwwmBmZmZ4YTAzMzMcEJgZmZm\nOCEwMzMznBCYmZkZTgjMzMwM+B8QyfzewY+28wAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.fill_between(x.squeeze(), *lgam.prediction_intervals(x, width=0.95).T, alpha=0.25)\n", "plt.plot(x, lgam.predict_proba(x))" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(x, lgam.predict_proba(x))\n", "plt.scatter(x, obs)" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(lgam._b)" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(lgam.partial_dependence(np.sort(x, axis=0))[0])" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0.97140000000000004" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lgam.accuracy(x, obs)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Multiple Features" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": false }, "outputs": [], "source": [ "n = 10000\n", "x = np.random.rand(n, 5) * 10 - 5\n", "cat = np.random.randint(0,4, n)\n", "x = np.c_[x, cat]\n", "\n", "log_odds = (-0.5*x[:,0]**2) + 5 +(-0.5*x[:,1]**2) + np.mod(x[:,-1], 2)*-30\n", "p = 1/(1+np.exp(-log_odds)).squeeze()\n", "\n", "obs = (np.random.rand(len(x)) < p).astype(np.int)" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "LogisticGAM(lam=0.6, n_iter=100, n_knots=20, spline_order=4, \n", " callbacks=[Deviance(), Diffs(), Accuracy()], tol=0.0, \n", " penalty_matrix='auto')" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# lgam = GAM(distribution='binomial', link='logit', lam=0.6, n_iter=200, n_knots=20, spline_order=4, penalty_matrix='auto', tol=1e-4)\n", "lgam = LogisticGAM(lam=0.6, n_iter=100, n_knots=20, spline_order=4, penalty_matrix='auto', tol=1e-4)\n", "lgam.fit(x, obs)" ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhQAAAFkCAYAAAB4sKK5AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzs3Xd4U3UbxvHvSZruRQeFUlr2BtlTQJChKKAoS1GQ8QIK\nMkQURRFUFGUpCqIoKCgiKCqKgqBsZBSBssso0L33yDrvH4ep7DZJW57PdeUqJKc5T5o2ufObiqqq\nCCGEEEIUhs7RBQghhBCi5JNAIYQQQohCk0AhhBBCiEKTQCGEEEKIQpNAIYQQQohCk0AhhBBCiEKT\nQCGEEEKIQpNAIYQQQohCk0AhhBBCiEKTQCGEEEKIQrN5oFAUJVhRlKWKoiQripKrKMoBRVEa2/q8\nQgghhLAfJ1veuaIovsB2YCPQFUgGqgNptjyvEEIIIexLseXmYIqivAu0UlW1vc1OIoQQQgiHs3WX\nR3dgr6Io3ymKkqAoyj5FUYba+JxCCCGEsDNbt1DkASowC1gFtADmAv9TVXXZNY73R+saiQLybVaY\nEEIIUfq4ApWAdaqqptj75LYOFAXAblVV215x3QdAU1VV21zj+CeAr21WkBBCCFH6Pamq6jf2PqlN\nB2UCccDRf113FOh1neOjAJYtW0bt2rVtWJa40rhx45gzZ46jy7iryM/c/uRnbn/yM7evo0ePMmDA\nALjwXmpvtg4U24Ga/7quJnD2OsfnA9SuXZvGjWVmqb34+PjIz9vO5Gduf/Iztz/5mTuMQ4YM2HpQ\n5hygpaIokxRFqXqhS2Mo8JGNzyuEEEIIO7JpoFBVdS/wKNAfiABeBcaoqvqtLc8rhBBCCPuydZcH\nqqquBdba+jxCCCGEcBzZy0PQv39/R5dw15Gfuf3Jz9z+5Gd+d7HptNHbdWGPj/Dw8HAZyCOEEELc\nhn379tGkSROAJqqq7rP3+aWFQgghhBCFJoFCCCGEEIUmgUIIIYQQhSaBQgghhBCFJoFCCCGEEIUm\ngUIIIYQQhSaBQgghhBCFJoFCCCGEEIUmgUIIIYQQhSaBQgghhBCFJoFCCCGEEIUmgUIIIYQQhSaB\nQgghhBCFJoFCCCGEEIUmgUIIIYQQhSaBQgghhBCFJoFCCCGEEIUmgUIIIYQQhSaBQgghhBCFJoFC\nCCGEEIUmgUIIIYQQhSaBQgghhBCFJoFCCCGEEIUmgUIIIYQQhSaBQgghhBCFJoFCCCGEEIUmgUII\n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\nVAAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(lgam.partial_dependence(np.sort(x, axis=0))[0]);" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nfhKeHD81dgAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(lgam.partial_dependence(np.sort(x, axis=0))[0][:,-1]);\n", "plt.plot(lgam.partial_dependence(np.sort(x, axis=0), quantiles=np.linspace(.1, .9, 4))[1][-1]);" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "81.090903524784522" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lgam._statistics['edof']" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2190.99197222\n", "2192.36760394\n" ] } ], "source": [ "print lgam._statistics['AIC']\n", "print lgam._statistics['AICc']" ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ -7.22314921e+00, -5.76511804e+00, -5.57873643e+00,\n", " -4.88360526e+00, -3.38467372e+00, -1.50542057e+00,\n", " -4.66174440e-01, 9.67681736e-01, 2.05296453e+00,\n", " 3.43623348e+00, 3.44999597e+00, 3.77632890e+00,\n", " 4.19217841e+00, 4.36604087e+00, 3.42113074e+00,\n", " 3.51783541e+00, 3.83930732e+00, 2.10659663e+00,\n", " 9.51131659e-01, 5.04498083e-01, -2.10580707e+00,\n", " -3.53879379e+00, -5.03133955e+00, -5.69032385e+00,\n", " -5.85508074e+00, -5.48686223e+00, -5.24148127e+00,\n", " -4.41073648e+00, -3.63839095e+00, -2.33059316e+00,\n", " -2.00086258e-01, 4.63491907e-01, 1.36372881e+00,\n", " 3.01291560e+00, 4.11926100e+00, 4.11032485e+00,\n", " 4.31850191e+00, 3.77620148e+00, 3.74612931e+00,\n", " 3.25469931e+00, 2.86210123e+00, 2.37586011e+00,\n", " 1.38149382e+00, -4.25198420e-01, -1.84611618e+00,\n", " -3.85297628e+00, -4.40822987e+00, -4.91656629e+00,\n", " -5.25062120e+00, -2.49534201e-01, -5.77389386e-01,\n", " -2.69548715e-01, -5.27220506e-01, -2.11311752e-01,\n", " -8.39042197e-02, -7.25716575e-01, -2.52831775e-01,\n", " -2.08470305e-01, -4.43281447e-01, -5.39530172e-02,\n", " -4.94874101e-01, -1.87821705e-01, -4.52666542e-01,\n", " -1.47111116e-02, -7.43056627e-02, -2.28840499e-01,\n", " 1.30194797e-01, -2.70409679e-01, -7.22408705e-01,\n", " -9.83070060e-02, -8.85019767e-01, -4.53948846e-01,\n", " 1.33131665e-01, -1.42114488e+00, -4.23313030e-01,\n", " -4.03786406e-01, -6.12641212e-01, -3.64670723e-01,\n", " 5.80045552e-03, 3.97037522e-01, -2.26130322e-01,\n", " -1.95797756e-01, -5.06858959e-01, -8.13886855e-01,\n", " 2.90615778e-01, 9.38270146e-02, -8.61770616e-01,\n", " 2.66436934e-01, -2.66799999e-01, -8.58722564e-01,\n", " 2.48847663e-01, -3.77709017e-01, -4.92526831e-01,\n", " -2.47878423e-01, -3.24445344e-01, -3.44904325e-01,\n", " 2.17273175e-01, -3.01911746e-01, -1.13498407e-01,\n", " -4.04290311e-01, -4.04781780e-01, -1.83317086e-01,\n", " -4.80015781e-01, -2.07781180e-01, -3.40742701e-01,\n", " -1.83177581e-01, -1.63592033e-01, -1.68222991e-01,\n", " -4.21764505e-01, -3.39243340e-01, -1.01138926e-01,\n", " -4.45917245e-01, -1.12588092e-01, -8.64518155e-01,\n", " 1.25487323e-01, 1.71936269e-02, -3.91578144e-01,\n", " -3.59021209e-01, -1.34599576e-01, -5.98155493e-01,\n", " -6.45972600e-01, 4.47681355e+00, -4.47135541e+00,\n", " 4.45017695e+00, -4.45563526e+00])" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lgam._b" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(lgam.logs['accuracy'])" ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(lgam.logs['deviance'])" ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nX/YAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(lgam.logs['diffs'])" ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Model Statistics\n", "-----------------\n", "edof 81.091\n", "AIC 2190.992\n", "AICc 2192.368\n", "UBRE 2.365\n", "\n", "Pseudo-R^2\n", "----------------------\n", "mcfadden 0.771\n", "mcfadden_adj 0.752\n", "cox_snell 0.494\n", "nagelkerke 0.842\n" ] } ], "source": [ "lgam.summary()" ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0.95550000000000002" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lgam.accuracy(x, obs)" ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "LogisticGAM(lam=0.6, n_iter=100, n_knots=20, spline_order=4, \n", " callbacks=[Deviance(), Diffs(), Accuracy()], tol=1e-05, \n", " penalty_matrix='auto')" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "LogisticGAM()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "o" ] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.12" }, "toc": { "toc_cell": false, "toc_number_sections": true, "toc_threshold": 6, "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 0 } PKTJpygam/tests/__init__.pyPK"J;- - pygam/tests/conftest.py# -*- coding: utf-8 -*- import pytest import pandas as pd import numpy as np from pygam import * @pytest.fixture def mcycle(): # y is real # recommend LinearGAM motor = pd.read_csv('datasets/mcycle.csv', index_col=0) X = motor.times.values y = motor.accel return X, y @pytest.fixture def coal(): # y is counts # recommend PoissonGAM coal = pd.read_csv('datasets/coal.csv', index_col=0) y, x = np.histogram(coal.values, bins=150) X = x[:-1] + np.diff(x)/2 # get midpoints of bins return X, y @pytest.fixture def faithful(): # y is counts # recommend PoissonGAM faithful = pd.read_csv('datasets/faithful.csv', index_col=0) y, x = np.histogram(faithful.values, bins=200) X = x[:-1] + np.diff(x)/2 # get midpoints of bins return X, y @pytest.fixture def wage(): # y is real # recommend LinearGAM wage = pd.read_csv('datasets/wage.csv', index_col=0) X = wage[['year', 'age', 'education']].values X[:,-1] = np.unique(X[:,-1], return_inverse=True)[1] y = wage['wage'].values return X, y @pytest.fixture def trees(): # y is real. # recommend InvGaussGAM, or GAM(distribution='gamma', link='log') trees = pd.read_csv('datasets/trees.csv', index_col=0) y = trees.Volume.values X = trees[['Girth', 'Height']].values return X, y @pytest.fixture def default(): # y is binary # recommend LogisticGAM default = pd.read_csv('datasets/default.csv', index_col=0) default = default.values default[:,0] = np.unique(default[:,0], return_inverse=True)[1] default[:,1] = np.unique(default[:,1], return_inverse=True)[1] X = default[:,1:] y = default[:,0] return X, y @pytest.fixture def cake(): # y is real # recommend LinearGAM cake = pd.read_csv('datasets/cake.csv', index_col=0) X = cake[['recipe', 'replicate', 'temperature']].values X[:,0] = np.unique(cake.values[:,1], return_inverse=True)[1] X[:,1] -= 1 y = cake['angle'].values return X, y @pytest.fixture def hepatitis(): # y is real # recommend LinearGAM hep = pd.read_csv('datasets/hepatitis_A_bulgaria.csv').astype(float) # eliminate 0/0 mask = (hep.total > 0).values hep = hep[mask] X = hep.age.values y = hep.hepatitis_A_positive.values / hep.total.values return X, y PKpK pygam/tests/test_GAM_methods.py# -*- coding: utf-8 -*- import sys import numpy as np import pytest from pygam import * @pytest.fixture def mcycle_gam(mcycle): X, y = mcycle gam = LinearGAM().fit(X,y) return gam def test_LinearGAM_pdeps_shape(wage): """ check that we get the expected number of partial dependence functions """ X, y = wage gam = LinearGAM().fit(X, y) pdeps = gam.partial_dependence(X) assert(X.shape == pdeps.shape) def test_LinearGAM_prediction(mcycle, mcycle_gam): """ check that we the predictions we get are correct shape """ X, y = mcycle preds = mcycle_gam.predict(X) assert(preds.shape == y.shape) def test_LogisticGAM_accuracy(default): """ check that we can compute accuracy correctly """ X, y = default gam = LogisticGAM().fit(X, y) preds = gam.predict(X) acc0 = (preds == y).mean() acc1 = gam.accuracy(X, y) assert(acc0 == acc1) def test_PoissonGAM_exposure(coal): """ check that we can fit a Poisson GAM with exposure, and it scales predictions """ X, y = coal gam = PoissonGAM().fit(X, y, exposure=np.ones_like(y)) assert((gam.predict(X, exposure=np.ones_like(y)*2) == 2 *gam.predict(X)).all()) def test_PoissonGAM_loglike(coal): """ check that our loglikelihood is scaled by exposure predictions that are twice as large with twice the exposure should have lower loglikelihood """ X, y = coal exposure = np.ones_like(y) gam_high_var = PoissonGAM().fit(X, y * 2, exposure=exposure * 2) gam_low_var = PoissonGAM().fit(X, y, exposure=exposure) assert gam_high_var.loglikelihood(X, y * 2, exposure * 2) < gam_low_var.loglikelihood(X, y, exposure) def test_large_GAM(coal): """ check that we can fit a GAM in py3 when we have more than 50,000 samples """ X = np.linspace(0, 100, 100000) y = X**2 gam = LinearGAM().fit(X, y) assert(gam._is_fitted) def test_summary(mcycle, mcycle_gam): """ check that we can get a summary if we've fitted the model, else not """ X, y = mcycle gam = LinearGAM() try: gam.summary() except AttributeError: assert(True) mcycle_gam.summary() assert(True) def test_more_splines_than_samples(mcycle): """ check that gridsearch returns the expected number of models """ X, y = mcycle n = len(X) gam = LinearGAM(n_splines=n+1).fit(X, y) assert(gam._is_fitted) def test_deviance_residuals(mcycle, mcycle_gam): """ for linear GAMs, the deviance residuals should be equal to the y - y_pred """ X, y = mcycle res = mcycle_gam.deviance_residuals(X, y) err = y - mcycle_gam.predict(X) assert((res == err).all()) def test_conf_intervals_return_array(mcycle, mcycle_gam): """ make sure that the confidence_intervals method returns an array """ X, y = mcycle conf_ints = mcycle_gam.confidence_intervals(X) assert(conf_ints.ndim == 2) def test_conf_intervals_quantiles_width_interchangable(mcycle, mcycle_gam): """ getting confidence_intervals via width or specifying quantiles should return the same result """ X, y = mcycle conf_ints_a = mcycle_gam.confidence_intervals(X, width=.9) conf_ints_b = mcycle_gam.confidence_intervals(X, quantiles=[.05, .95]) assert(np.allclose(conf_ints_a, conf_ints_b)) def test_conf_intervals_ordered(mcycle, mcycle_gam): """ comfidence intervals returned via width should be ordered """ X, y = mcycle conf_ints = mcycle_gam.confidence_intervals(X) assert((conf_ints[:,0] <= conf_ints[:,1]).all()) def test_partial_dependence_on_univar_data(mcycle, mcycle_gam): """ partial dependence with univariate data should equal the overall model if fit intercept is false """ X, y = mcycle gam = LinearGAM(fit_intercept=False).fit(X,y) pred = gam.predict(X) pdep = gam.partial_dependence(X) assert((pred == pdep.ravel()).all()) def test_partial_dependence_on_univar_data2(mcycle, mcycle_gam): """ partial dependence with univariate data should NOT equal the overall model if fit intercept is false """ X, y = mcycle gam = LinearGAM(fit_intercept=True).fit(X,y) pred = gam.predict(X) pdep = gam.partial_dependence(X) assert((pred != pdep.ravel()).all()) def test_partial_dependence_feature_doesnt_exist(mcycle, mcycle_gam): """ partial dependence should raise ValueError when requesting a nonexistent feature """ X, y = mcycle try: mcycle_gam.partial_dependence(X, feature=10) except ValueError: assert(True) def test_summary_returns_12_lines(mcycle_gam): """ check that the summary method works and returns 16 lines like: Model Statistics ------------------------- edof 12.321 AIC 1221.082 AICc 1224.297 GCV 611.627 loglikelihood -597.22 deviance 120.679 scale 510.561 Pseudo-R^2 -------------------------- explained_deviance 0.8 McFadden 0.288 McFadden_adj 0.273 """ if sys.version_info.major == 2: from StringIO import StringIO if sys.version_info.major == 3: from io import StringIO stdout = sys.stdout #keep a handle on the real standard output sys.stdout = StringIO() #Choose a file-like object to write to mcycle_gam.summary() assert(len(sys.stdout.getvalue().split('\n')) == 16) def test_is_fitted_predict(mcycle): """ test predict requires fitted model """ X, y = mcycle gam = LinearGAM() try: gam.predict(X) except AttributeError: assert(True) def test_is_fitted_predict_mu(mcycle): """ test predict_mu requires fitted model """ X, y = mcycle gam = LinearGAM() try: gam.predict_mu(X) except AttributeError: assert(True) def test_is_fitted_dev_resid(mcycle): """ test deviance_residuals requires fitted model """ X, y = mcycle gam = LinearGAM() try: gam.deviance_residuals(X, y) except AttributeError: assert(True) def test_is_fitted_conf_intervals(mcycle): """ test confidence_intervals requires fitted model """ X, y = mcycle gam = LinearGAM() try: gam.confidence_intervals(X) except AttributeError: assert(True) def test_is_fitted_pdep(mcycle): """ test partial_dependence requires fitted model """ X, y = mcycle gam = LinearGAM() try: gam.partial_dependence(X) except AttributeError: assert(True) def test_is_fitted_summary(mcycle): """ test summary requires fitted model """ X, y = mcycle gam = LinearGAM() try: gam.summary() except AttributeError: assert(True) def test_set_params_with_external_param(): """ test set_params sets a real parameter """ gam = GAM(lam=1) gam.set_params(lam=420) assert(gam.lam == 420) def test_set_params_with_hidden_param(): """ test set_params should not set any params that are not exposed to the user """ gam = GAM() gam.set_params(_lam=420) assert(gam._lam != 420) def test_set_params_with_phony_param(): """ test set_params should not set any phony param """ gam = GAM() gam.set_params(cat=420) assert(not hasattr(gam, 'cat')) def test_set_params_with_hidden_param_deep(): """ test set_params can set hidden params if we use the deep=True """ gam = GAM() assert(gam._lam != 420) gam.set_params(_lam=420, deep=True) assert(gam._lam == 420) def test_set_params_with_phony_param_force(): """ test set_params can set phony params if we use the force=True """ gam = GAM() assert(not hasattr(gam, 'cat')) gam.set_params(cat=420, force=True) assert(gam.cat == 420) def test_get_params(): """ test gam gets our params """ gam = GAM(lam=420) params = gam.get_params() assert(params['lam'] == 420) def test_get_params_hidden(): """ test gam gets our params only if we do deep=True """ gam = GAM() params = gam.get_params() assert('_lam' not in list(params.keys())) params = gam.get_params(deep=True) assert('_lam' in list(params.keys())) # TODO test linear gam pred intervals PKTJ7C pygam/tests/test_GAM_params.py# -*- coding: utf-8 -*- import numpy as np import pytest from pygam import * def test_expand_params(cake): """ check that gam expands lam, dtype, n_splines, fit_linear, fit_splines penalties, spline_order """ X, y = cake m = X.shape[1] gam = LinearGAM().fit(X, y) for param in ['dtype', 'n_splines', 'spline_order', 'fit_linear', 'fit_splines', 'penalties',]: assert(len(getattr(gam, '_' + param)) == m) assert(len(gam._lam) == (m + gam.fit_intercept)) def test_lam_non_neg_array_like(cake): """ lambda must be a non-negative float or array of floats """ X, y = cake try: gam = LinearGAM(lam=-1).fit(X, y) except ValueError: assert(True) try: gam = LinearGAM(lam=['hi']).fit(X, y) except ValueError: assert(True) def test_wrong_length_param(cake): """ If input param is iterable, then it must have have length equal to the number of features. """ X, y = cake m = X.shape[1] n_splines = [20] * (m+1) gam = LinearGAM(n_splines=n_splines) try: gam.fit(X, y) except ValueError: n_splines = [20] * (m) gam = LinearGAM(n_splines=n_splines).fit(X, y) assert(True) def test_penalties_must_be_or_contain_callable_or_auto(mcycle): """ penalty matrix must be/contain callable or auto, otherwise raise ValueError """ X, y = mcycle gam = LinearGAM(penalties='continuous') try: gam.fit(X, y) except ValueError: gam = LinearGAM(penalties='auto').fit(X, y) assert(True) # now do iterable gam = LinearGAM(penalties=['continuous']) try: gam.fit(X, y) except ValueError: gam = LinearGAM(penalties=['auto']).fit(X, y) assert(True) def test_line_or_spline(mcycle): """ a line or spline must be fit on each feature """ X, y = mcycle gam = LinearGAM(fit_linear=False ,fit_splines=False) try: gam.fit(X, y) except ValueError: gam = LinearGAM(fit_linear=False ,fit_splines=True).fit(X, y) assert(True) def test_linear_regression(mcycle): """ should be able to do linear regression """ X, y = mcycle gam = LinearGAM(fit_linear=True, fit_splines=False).fit(X, y) assert(gam._is_fitted) def test_compute_stats_even_if_not_enough_iters(default): """ should be able to do linear regression """ X, y = default gam = LogisticGAM(max_iter=1).fit(X, y) assert(hasattr(gam, 'statistics_')) # TODO categorical dtypes get no fit linear even if fit linear TRUE # TODO categorical dtypes get their own number of splines # TODO can force continuous dtypes on categorical vars if wanted PKJNjer66pygam/tests/test_GAMs.py# -*- coding: utf-8 -*- import pytest from pygam import * def test_can_build_sub_models(): """ check that the inits of all the sub-models are correct """ LinearGAM() LogisticGAM() PoissonGAM() GammaGAM() InvGaussGAM() assert(True) def test_LinearGAM_uni(mcycle): """ check that we can fit a Linear GAM on real, univariate data """ X, y = mcycle gam = LinearGAM().fit(X, y) assert(gam._is_fitted) def test_LinearGAM_multi(wage): """ check that we can fit a Linear GAM on real, multivariate data """ X, y = wage gam = LinearGAM().fit(X, y) assert(gam._is_fitted) def test_LogisticGAM(default): """ check that we can fit a Logistic GAM on real data """ X, y = default gam = LogisticGAM().fit(X, y) assert(gam._is_fitted) def test_PoissonGAM(coal): """ check that we can fit a Poisson GAM on real data """ X, y = coal gam = PoissonGAM().fit(X, y) assert(gam._is_fitted) def test_InvGaussGAM(trees): """ check that we can fit a InvGauss GAM on real data """ X, y = trees gam = InvGaussGAM().fit(X, y) assert(gam._is_fitted) def test_GammaGAM(trees): """ check that we can fit a Gamma GAM on real data """ X, y = trees gam = GammaGAM().fit(X, y) assert(gam._is_fitted) def test_CustomGAM(trees): """ check that we can fit a Custom GAM on real data """ X, y = trees gam = GAM(distribution='gamma', link='log').fit(X, y) assert(gam._is_fitted) # TODO check dicts: DISTRIBUTIONS etc PKJ bbpygam/tests/test_core.py# -*- coding: utf-8 -*- import numpy as np import pytest from pygam.core import * def test_Core_class(): """ test attributes of core class """ c = Core() assert(c._name == None) c = Core(name='cat', line_width=70, line_offset=3) assert(c._name == 'cat') assert(c._line_width == 70) assert(c._line_offset == 3) def test_nice_repr(): """ test a simple repr for a fake object """ param_kvs = {} out = nice_repr('hi', param_kvs, line_width=30, line_offset=5, decimals=3) assert(out == "hi()") def test_nice_repr_more_attrs(): """ test a simple repr for a fake object with more attrs """ param_kvs = {'color': 'blue', 'n_ears': 3, 'height':1.3336} out = nice_repr('hi', param_kvs, line_width=60, line_offset=5, decimals=3) assert(out == "hi(color='blue', height=1.334, n_ears=3)") PKJ!pygam/tests/test_gridsearch.py# -*- coding: utf-8 -*- import numpy as np import pytest from pygam import * def test_gridsearch_returns_scores(mcycle): """ check that gridsearch returns the expected number of models """ n = 5 X, y = mcycle gam = LinearGAM() scores = gam.gridsearch(X, y, lam=np.logspace(-3,3, n), return_scores=True) assert(len(scores) == n) def test_gridsearch_returns_extra_score_if_fitted(mcycle): """ check that gridsearch returns an extra score if our model is pre-fitted """ n = 5 X, y = mcycle gam = LinearGAM().fit(X, y) scores = gam.gridsearch(X, y, lam=np.logspace(-3,3, n), return_scores=True) assert(len(scores) == n + 1) def test_gridsearch_keep_best(mcycle): """ check that gridsearch returns worse model if keep_best=False """ n = 5 X, y = mcycle gam = LinearGAM(lam=1000000).fit(X, y) score1 = gam.statistics_['GCV'] scores = gam.gridsearch(X, y, lam=np.logspace(-3,3, n), keep_best=False, return_scores=True) assert(np.min(list(scores.values())) < score1) def test_gridsearch_improves_objective(mcycle): """ check that gridsearch improves model objective """ n = 11 X, y = mcycle gam = LinearGAM().fit(X, y) objective_0 = gam.statistics_['GCV'] gam = LinearGAM().gridsearch(X, y, lam=np.logspace(-3,3, n)) objective_1 = gam.statistics_['GCV'] assert(objective_1 <= objective_0) def test_gridsearch_all_dimensions_same(cake): """ check that gridsearch searches all dimensions of lambda with equal values """ n = 5 X, y = cake scores = LinearGAM().gridsearch(X, y, lam=np.logspace(-3,3, n), return_scores=True) assert(len(scores) == n) assert(X.shape[1] > 1) def test_gridsearch_all_dimensions_independent(cake): """ check that gridsearch searches all dimensions of lambda independently """ n = 3 X, y = cake m = X.shape[1] scores = LinearGAM().gridsearch(X, y, lam=[np.logspace(-3,3, n)]*m, return_scores=True) assert(len(scores) == n**m) assert(m > 1) def test_GCV_objective_is_for_unknown_scale(mcycle, default, coal, trees): """ check that we use the GCV objective only for models with unknown scale & attempting to use it for models with known scale should return ValueError """ lam = np.linspace(1e-3, 1e3, 2) unknown_scale = [(LinearGAM, mcycle), (GammaGAM, trees), (InvGaussGAM, trees)] known_scale = [(LogisticGAM, default), (PoissonGAM, coal)] for gam, (X, y) in unknown_scale: scores1 = list(gam().gridsearch(X, y, lam=lam, objective='auto', return_scores=True).values()) scores2 = list(gam().gridsearch(X, y, lam=lam, objective='GCV', return_scores=True).values()) assert(np.allclose(scores1, scores2)) for gam, (X, y) in known_scale: try: list(gam().gridsearch(X, y, lam=lam, objective='GCV', return_scores=True).values()) except ValueError: assert(True) def test_UBRE_objective_is_for_known_scale(mcycle, default, coal, trees): """ check that we use the UBRE objective only for models with known scale & attempting to use it for models with unknown scale should return ValueError """ lam = np.linspace(1e-3, 1e3, 2) unknown_scale = [(LinearGAM, mcycle), (GammaGAM, trees), (InvGaussGAM, trees)] known_scale = [(LogisticGAM, default), (PoissonGAM, coal)] for gam, (X, y) in known_scale: scores1 = list(gam().gridsearch(X, y, lam=lam, objective='auto', return_scores=True).values()) scores2 = list(gam().gridsearch(X, y, lam=lam, objective='UBRE', return_scores=True).values()) assert(np.allclose(scores1, scores2)) for gam, (X, y) in unknown_scale: try: list(gam().gridsearch(X, y, lam=lam, objective='UBRE', return_scores=True).values()) except ValueError: assert(True) def test_no_models_fitted(mcycle): """ test no models fitted returns orginal gam """ X, y = mcycle scores = LinearGAM().gridsearch(X, y, lam=[-3, -2,-1], return_scores=True) # scores is not a dict of scores but an (unfitted) gam! assert(not isinstance(scores, dict)) assert(isinstance(scores, LinearGAM)) assert(not scores._is_fitted) PK"JRHO O pygam/tests/test_penalties.py# -*- coding: utf-8 -*- import numpy as np import pytest from pygam import * from pygam.penalties import derivative from pygam.penalties import l2 from pygam.penalties import monotonic_inc from pygam.penalties import monotonic_dec from pygam.penalties import convex from pygam.penalties import concave from pygam.penalties import circular from pygam.penalties import none from pygam.penalties import wrap_penalty from pygam.utils import generate_X_grid def test_single_spline_penalty(): """ check that feature functions with only 1 basis are penalized correctly derivative penalty should be 0. l2 should penalty be 1. monotonic_ and convexity_ should be 0. """ coef = np.array(1.) assert(np.alltrue(derivative(1, coef).A == 0.)) assert(np.alltrue(l2(1, coef).A == 1.)) assert(np.alltrue(monotonic_inc(1, coef).A == 0.)) assert(np.alltrue(monotonic_dec(1, coef).A == 0.)) assert(np.alltrue(convex(1, coef).A == 0.)) assert(np.alltrue(concave(1, coef).A == 0.)) assert(np.alltrue(circular(1, coef).A == 0.)) assert(np.alltrue(none(1, coef).A == 0.)) def test_wrap_penalty(): """ check that wrap penalty indeed reduces inserts the desired penalty into the linear term when fit_linear is True, and 0, when fit_linear is False. """ coef = np.array(1.) n = 2 linear_penalty = -1 fit_linear = True p = wrap_penalty(none, fit_linear, linear_penalty=linear_penalty) P = p(n, coef).A assert(P.sum() == linear_penalty) fit_linear = False p = wrap_penalty(none, fit_linear, linear_penalty=linear_penalty) P = p(n, coef).A assert(P.sum() == 0.) def test_monotonic_inc(hepatitis): """ check that monotonic_inc constraint produces monotonic increasing function """ X, y = hepatitis gam = LinearGAM(constraints='monotonic_inc') gam.fit(X, y) XX = generate_X_grid(gam) Y = gam.predict(np.sort(XX)) diffs = np.diff(Y, n=1) assert(((diffs >= 0) + np.isclose(diffs, 0.)).all()) def test_monotonic_dec(hepatitis): """ check that monotonic_dec constraint produces monotonic decreasing function """ X, y = hepatitis gam = LinearGAM(constraints='monotonic_dec') gam.fit(X, y) XX = generate_X_grid(gam) Y = gam.predict(np.sort(XX)) diffs = np.diff(Y, n=1) assert(((diffs <= 0) + np.isclose(diffs, 0.)).all()) def test_convex(hepatitis): """ check that convex constraint produces convex function """ X, y = hepatitis gam = LinearGAM(constraints='convex') gam.fit(X, y) XX = generate_X_grid(gam) Y = gam.predict(np.sort(XX)) diffs = np.diff(Y, n=2) assert(((diffs >= 0) + np.isclose(diffs, 0.)).all()) def test_concave(hepatitis): """ check that concave constraint produces concave function """ X, y = hepatitis gam = LinearGAM(constraints='concave') gam.fit(X, y) XX = generate_X_grid(gam) Y = gam.predict(np.sort(XX)) diffs = np.diff(Y, n=2) assert(((diffs <= 0) + np.isclose(diffs, 0.)).all()) # TODO penalties gives expected matrix structure # TODO circular constraints PKpK r. . pygam/tests/test_utils.py# -*- coding: utf-8 -*- import numpy as np import pytest from pygam import * from pygam.utils import check_X, check_y, check_X_y # TODO check dtypes works as expected # TODO checkX, checky, check XY expand as needed, call out bad domain @pytest.fixture def wage_gam(wage): X, y = wage gam = LinearGAM().fit(X,y) return gam @pytest.fixture def default_gam(default): X, y = default gam = LogisticGAM().fit(X,y) return gam def test_check_X_categorical_prediction_exceeds_training(wage, wage_gam): """ if our categorical variable is outside the training range we should get an error """ X, y = wage gam = wage_gam eks = gam._edge_knots[-1] # last feature of wage dataset is categorical X[:,-1] = eks[-1] + 1 try: gam.predict(X) assert False except ValueError: X[:,-1] = eks[-1] gam.predict(X) assert(True) def test_check_y_not_int_not_float(wage, wage_gam): """y must be int or float, or we should get a value error""" X, y = wage y_str = ['hi'] * len(y) try: check_y(y_str, wage_gam.link, wage_gam.distribution) assert False except ValueError: check_y(y, wage_gam.link, wage_gam.distribution) assert(True) def test_check_y_casts_to_numerical(wage, wage_gam): """check_y will try to cast data to numerical types""" X, y = wage y = y.astype('object') y = check_y(y, wage_gam.link, wage_gam.distribution) assert y.dtype == 'float' def test_check_y_not_min_samples(wage, wage_gam): """check_y expects a minimum number of samples""" X, y = wage try: check_y(y, wage_gam.link, wage_gam.distribution, min_samples=len(y)+1) assert False except ValueError: check_y(y, wage_gam.link, wage_gam.distribution, min_samples=len(y)) assert True def test_check_y_not_in_doamin_link(default, default_gam): """if you give labels outide of the links domain, check_y will raise an error""" X, y = default gam = default_gam try: check_y(y + .1, default_gam.link, default_gam.distribution) assert False except ValueError: check_y(y, default_gam.link, default_gam.distribution) assert True def test_check_X_not_int_not_float(): """X must be an in or a float""" try: check_X(['hi']) assert False except ValueError: check_X([4]) assert True def test_check_X_too_many_dims(): """check_X accepts at most 2D inputs""" try: check_X(np.ones((5,4,3))) assert False except ValueError: check_X(np.ones((5,4))) assert True def test_check_X_not_min_samples(): try: check_X(np.ones((5)), min_samples=6) assert False except ValueError: check_X(np.ones((5)), min_samples=5) assert True def test_check_X_y_different_lengths(): try: check_X_y(np.ones(5), np.ones(4)) assert False except ValueError: check_X_y(np.ones(5), np.ones(5)) assert True # # def test_b_spline_basis_clamped_what_we_want(): PKYJœ%pygam/tests/.cache/v/cache/lastfailed{ "test_GAM_methods.py::test_LinearGAM_pdeps_shape": true, "test_GAM_methods.py::test_LinearGAM_prediction": true, "test_GAM_methods.py::test_LogisticGAM_accuracy": true, "test_GAM_methods.py::test_conf_intervals_return_array": true, "test_GAM_methods.py::test_deviance_residuals": true, "test_GAM_methods.py::test_more_splines_than_samples": true, "test_GAM_methods.py::test_summary": true }PK2JFLEEpygam-0.3.0.dist-info/LICENSE GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. {one line to give the program's name and a brief idea of what it does.} Copyright (C) {year} {name of author} This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: {project} Copyright (C) {year} {fullname} This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . PK!H١Wdpygam-0.3.0.dist-info/WHEEL HM K-*ϳR03rOK-J,/RH,Q0343 /, (-JLR()*M ILR(4KM̫#DPK!HxjCpygam-0.3.0.dist-info/METADATAKo0{lEj4V:ikyC-Wp_ 7$~3GLY wBhHqܶV1& s/'jBUN 2iS8}W2Zt?yPc,YT@Jx?Ntd)]>h.i ֻiy!RaUy- NV,s9&ҚU]ܘ-l#?XwTlV+m[ۯ3˹|yE2=$5ZZ5b<`X\?Y PK!H#^pygam-0.3.0.dist-info/RECORDǒH< ta @B7BzUvԳ= ʤg܍ 0P8/ܚ.2H(FAgTk/t9cԏ}=%/9@S؜VjD8Z;&g>v"O( : jzXd,)|mۢs izvg\a<m(\ڞ`&7":qv$sd+wSip}- [TsLK~^bΣhJ"i0h4P3ʩO L`xiUl 1Uw ''mPEJYf PVsd5c X!U 6P8/0*u \8ut۟rG!A?V*e@ C0JBT#蕻Yx t$jliF ςޢ ʓ9 :,ymٖ`` sؕ8Z-((n)t%#nQwE;OEFyNz8ljiBn͞4se%౔+iBIs2=oB%gMq@\%^v<͍E umit( {SމXO Je \/?dλކeTuцG6N¥7T߀!SL^8OanAʮ6`/CNSG"~]Iopgθ=%q[y9ˤd^;]d*UADHt<"FwW5P%[@)1}*wEP}@l,) (Qs8ŧ #zkf+JlᏫˤ@RF߰߅]>1t]1H]SVi2pl5߫ 鴉bK삆/XaEcoҥ)QQX>hFA5y $[}`h]vfOԑɋ6)bB(BbJ[x͗YP?Ξ'obH !liAzZF ݵ`&1&T%.T1Qr'M$UPxPKiJjmpygam/.DS_StorePK/L/KT1pygam/__init__.pyPKpK%pygam/callbacks.pyPK^JV7,MM /pygam/core.pyPKpKVeI4I4@pygam/distributions.pyPK"Jսtpygam/links.pyPKbJϫI!I!pygam/penalties.pyPK,J.K7lD;;pygam/pygam.pyPK,J.Ku3VRRl`pygam/utils.pyPK fJ 7pygam/.cache/v/cache/lastfailedPKgJ /pygam/.ipynb_checkpoints/pyGAM-checkpoint.ipynbPKTJ/k pygam/tests/__init__.pyPK"J;- - dk pygam/tests/conftest.pyPKpK t pygam/tests/test_GAM_methods.pyPKTJ7C  pygam/tests/test_GAM_params.pyPKJNjer66 pygam/tests/test_GAMs.pyPKJ bbm pygam/tests/test_core.pyPKJ! pygam/tests/test_gridsearch.pyPK"JRHO O % pygam/tests/test_penalties.pyPKpK r. .  pygam/tests/test_utils.pyPKYJœ% pygam/tests/.cache/v/cache/lastfailedPK2JFLEE pygam-0.3.0.dist-info/LICENSEPK!H١Wdsb pygam-0.3.0.dist-info/WHEELPK!HxjCc pygam-0.3.0.dist-info/METADATAPK!H#^d pygam-0.3.0.dist-info/RECORDPKi