from optimeed.optimize.optiAlgorithms import MultiObjective_GA as OptimizationAlgorithm
from optimeed.optimize import run_optimization, Real_OptimizationVariable, InterfaceObjCons, OptimizerSettings, OptiHistoric
import numpy as np
[docs]class _Device:
def __init__(self, fitFunction, nbArgs):
self.functionArgs = [0.0]*nbArgs
self.fitFunction = fitFunction
[docs]class _Objective(InterfaceObjCons):
def __init__(self, x_data, y_data, fitCriterion):
self.x_data = x_data
self.y_data = y_data
self.fitCriterion = fitCriterion
[docs] def compute(self, theDevice):
return self.fitCriterion(theDevice.fitFunction, theDevice.functionArgs, self.x_data, self.y_data)
[docs]def leastSquare(function, functionArgs, x_data, y_data):
"""
Least square calculation (sum (y-ŷ)^2)
:param function: Function to fit
:param functionArgs: Arguments of the function
:param x_data: x-axis coordinates of data to fit
:param y_data: y-axis coordinates of data to fit
:return: least squares
"""
return np.sum((y_data - function(x_data, *functionArgs)) ** 2)
[docs]def r_squared(function, functionArgs, x_data, y_data):
"""
R squared calculation
:param function: Function to fit
:param functionArgs: Arguments of the function
:param x_data: x-axis coordinates of data to fit
:param y_data: y-axis coordinates of data to fit
:return: R squared
"""
return -(1 - (np.sum((y_data - function(x_data, *functionArgs)) ** 2))/(np.sum((y_data - np.mean(y_data)) ** 2)))
[docs]def do_fit(fitFunction, x_data, y_data, *args, fitCriterion=leastSquare):
"""
Main method to fit a function
:param fitFunction: the function to fit (link to it)
:param x_data: x-axis coordinates of data to fit
:param y_data: y-axis coordinates of data to fit
:param args: for each parameter: [min, max] admissible value
:param fitCriterion: fit criterion to minimize. Default: least square
:return: [arg_i_optimal, ...], y estimated, error.
"""
print(args)
theDevice = _Device(fitFunction, len(args))
theAlgo = OptimizationAlgorithm()
optimizationVariables = list()
for i, minmax in enumerate(args):
optimizationVariables.append(Real_OptimizationVariable('functionArgs[{}]'.format(i), *minmax)) #
listOfObjectives = [_Objective(x_data, y_data, fitCriterion)]
listOfConstraints = []
theOptiParameters = OptimizerSettings(theDevice, listOfObjectives, listOfConstraints, optimizationVariables, theOptimizationAlgorithm=theAlgo)
theOptiHistoric = OptiHistoric(optiname="fit", autosave=False, create_new_directory=False, performance_datastruct=False)
resultsOpti, convergence = run_optimization(theOptiParameters, theOptiHistoric, max_opti_time_sec=3)
y_est = fitFunction(x_data, *resultsOpti[0].functionArgs)
return resultsOpti[0].functionArgs, y_est, y_data-y_est