Source code for mechanoChemML.workflows.systemID.systemID

"""
Zhenlin Wang 2019
systemID workflow
"""

import numpy as np
from sklearn import linear_model
from sklearn.metrics.pairwise import cosine_similarity

import h5py as h5
from mechanoChemML.src import stepwiseRegression as ST

[docs]def getlist_str(option, sep=',', chars=None): """Return a list from a ConfigParser option. By default, split on a comma and strip whitespaces.""" list0 = [(chunk.strip(chars)) for chunk in option.split(sep)] list0 = [x for x in list0 if x] return list0
[docs]def getlist_int(option, sep=',', chars=None): """Return a list from a ConfigParser option. By default, split on a comma and strip whitespaces.""" list0 = option.split(sep) list0 = [x for x in list0 if x] if (len(list0)) > 0: return [int(chunk.strip(chars)) for chunk in list0] else: return []
[docs]def getlist_float(option, sep=',', chars=None): """Return a list from a ConfigParser option. By default, split on a comma and strip whitespaces.""" list0 = option.split(sep) list0 = [x for x in list0 if x] if (len(list0)) > 0: return [float(chunk.strip(chars)) for chunk in list0] else: return []
[docs]class systemID: """ Class of system ID """ def __init__(self): self.parse_sys_args() self.read_config_file() self.results={ 'model':[0], 'prefactor':np.zeros(0), 'loss':np.zeros(0), 'cos_similiarity':np.zeros(0), 'sum_cos_similiarity':np.zeros(0) }
[docs] def debugger(self): import logging logger = logging.getLogger('root') FORMAT = "[%(filename)s:%(lineno)s - %(funcName)20s() ] %(message)s" logging.basicConfig(format=FORMAT) logger.setLevel(logging.DEBUG) self.logger = logger
[docs] def read_config_file(self): """ """ from configparser import ConfigParser, ExtendedInterpolation config = ConfigParser(interpolation=ExtendedInterpolation()) config.read(self.args.configfile) config['TEST']['FileName'] = self.args.configfile self.config = config
[docs] def parse_sys_args(self): import argparse, sys, os parser = argparse.ArgumentParser(description='Run Variational System Identification', prog="'" + (sys.argv[0]) + "'") parser.add_argument('configfile', type=str, help='configuration file') args = parser.parse_args() self.args = args
[docs] def setup_model(self): F_criteria=getlist_float(self.config['StepwiseRegression']['F_criteria']) F_switch=[] if len(F_criteria)>1: F_switch=getlist_int(self.config['StepwiseRegression']['F_switch'] ) basis_drop_strategy=self.config['StepwiseRegression']['basis_drop_strategy'] regression_method=self.config['StepwiseRegression']['regression_method'] anchor_index=getlist_int(self.config['StepwiseRegression']['anchor_index'] ) if len(anchor_index)==0 : anchor_index=[-1] alpha_lasso=0 alpha_ridge=0 ridge_cv=[-1] n_jobs=1 if regression_method=='ridge': alpha_ridge=self.config['StepwiseRegression'].getfloat('alpha_ridge') elif regression_method=='lasso': alpha_lasso=self.config['StepwiseRegression'].getfloat('alpha_lasso') elif regression_method=='ridge_cv': ridge_cv=getlist_float(self.config['StepwiseRegression']['ridge_cv']) elif regression_method!='linear_regression': print('bad regression_method') exit() return ST.stepwiseR(F_criteria=F_criteria,F_switch=F_switch,basis_drop_strategy=basis_drop_strategy,anchor_index=anchor_index,alpha_lasso=alpha_lasso,alpha_ridge=alpha_ridge, ridge_cv=ridge_cv,n_jobs=n_jobs)
[docs] def identifying(self,basis): print('\n-------------- Identifying -------------- ') strategy=self.config['VSI']['identify_strategy'] if strategy=='specified_target': target_index=self.config['VSI'].getint('target_index') self.results['model']=self.stepwise_regression(basis,target_index) self.results['prefactor']=self.results['model'].gamma_matrix[:,-1] self.results['loss']=self.results['model'].loss[-1] elif strategy=='confirmation_of_consistency': self.confirmation_of_consistency(basis)
[docs] def stepwise_regression(self,basis,target_index): model=self.setup_model() y=basis[:,target_index] _,n_base_orign=basis.shape basis_index=np.delete(np.arange(n_base_orign),target_index) theta_matrix=basis[:,basis_index] model.stepwiseR_fit(theta_matrix,y) return model
[docs] def confirmation_of_consistency(self,basis): print('\n-------------- running confirmation_of_consistency... -------------- ') _,n_base_orign=basis.shape self.results['model']=[self.stepwise_regression(basis,key) for key in range(n_base_orign)] self.results['prefactor']=np.zeros((n_base_orign,n_base_orign)) self.loss=np.zeros(n_base_orign) for i in range(n_base_orign): basis_id_theta=np.delete(np.arange(n_base_orign),i) self.results['prefactor'][basis_id_theta,i]=self.results['model'][i].gamma_matrix[:,-1] self.results['prefactor'][i,i]=-1 self.loss[i]=self.results['model'][i].loss[-1] self.results['cos_similiarity']=cosine_similarity(np.transpose(self.results['prefactor'])) self.results['sum_cos_similiarity']=np.sum(np.abs(self.results['cos_similiarity']),0)