"""This module contains bilinear models(Functions) """ import sys # add library sys.path.append('/home/flatberg/fluents/fluents/lib') import time from fluents.workflow import Function from fluents.dataset import Dataset from fluents import plots, dataset, workflow, logger import scipy from engines import * from cx_stats import leverage, variances, hotelling from cx_utils import mat_center from validation import * import blmplots import engines class Model(Function): """Base class of bilinear models. """ def __init__(self,id='johndoe',name='JohnDoe'): Function.__init__(self,id,name) self.name = name self._options = None self._data = {} self._dataset = {} self._packers = {} self.model = {} def clear(self): """ Clears model paramters """ self.model = {} self._data = {} self._packers = {} class PCA(Model): def __init__(self,id='pca',name='PCA'): Model.__init__(self,id,name) self._options = PcaOptions() def pre_validation(self, amax, n_sets, val_engine): """Model calculations for maximum number of components. """ rmsep = val_engine(self.model['E0'], amax, n_sets) self.model['rmsep'] = rmsep self.model['aopt'] = rmsep.argmin() def confidence(self, aopt, n_sets, alpha, p_center, crot, strict, cov_center ): """Returns a confidence measure for model parameters. Based on aopt. """ aopt = self.model['aopt'] jk_segments = pca_jkP(self.model['E0'], aopt, n_sets) Pcal = self.model['P'][:,:aopt] tsq = hotelling(jk_segments, Pcal, p_center, cov_center, alpha, crot, strict) self.model['p_tsq'] = tsq def make_model(self, amax, mode, scale): """Model on optimal number of components. """ dat = pca(self.model['E0'], amax, scale, mode) # explained variance var_x, exp_var_x = variances(self.model['E0'], dat['T'], dat['P']) dat['var_x'] = var_x dat['exp_var_x'] = exp_var_x #fixme### do_lev_s = False do_lev_v = False ##### if do_lev_s: # sample leverages tnorm = scipy.apply_along_axis(norm, 0, dat['T']) # norm of T-columns s_lev = leverage(amax, tnorm) dat['s_lev'] = s_lev if do_lev_v: # variable leverages v_lev = leverage(amax, dat['P']) dat['v_lev'] = v_lev self.model.update(dat) def as_dataset(self, param, dtype='dataset'): """Return model parameter as Dataset. """ if not param in self.model.keys(): return DX = self._dataset['X'] #input dataset dim_name_0, dim_name_1 = DX.get_dim_name() # samples ids_0 = [dim_name_0, DX.get_identifiers(dim_name_0, sorted=True)] # vars ids_1 = [dim_name_1, DX.get_identifiers(dim_name_1, sorted=True)] # components (hidden) pc_ids = ['_comp_a', map(str,range(self.model['aopt'])) ] pc_ids_opt = ['_comp_o', map(str, range(self.model['aopt'])) ] zero_dim = ['_doe', ['0']] # null dim, vector (hidden) match_ids = {'E':[ids_0, ids_1], 'E0':[ids_0, ids_1], 'P':[ids_1, pc_ids], 'T':[ids_0, pc_ids], 'W':[ids_1, pc_ids], 'p_tsq':[ids_1, zero_dim], 'rmsep':[pc_ids, zero_dim], 'var_leverages':[ids_1, zero_dim], 'sample_leverages':[pc_ids, zero_dim], 'exp_var_x': [pc_ids, zero_dim], 'var_x': [pc_ids, zero_dim], } out = Dataset(self.model[param], match_ids[param], name=param) return out def get_out_plots(self, options): out=[] for plt in options['out_plots']: #try: out.append(plt(self)) #except: # print plt #logger.log('debug', 'Plot: %s failed') %plt return out def run(self, data): """Run pca with present options. """ self.clear() options = self._options self._dataset['X'] = data self._data['X'] = data.asarray().astype('