(это долго из-за 3 определенных функций).
Я пытаюсь угадать некоторые начальные параметры, используя scipy.optimize.differential_evolution
. Для этого я использую функцию SumOfSquaredError , которой требуется , кроме независимой переменной, также зависимой переменной . Я пытаюсь избежать использования глобальных переменных , потому что эта функция будет использоваться в программе несколько раз, в разных сценариях ios.
Не создавая глобальную переменную y, я создаю все эти проблемы. Я не могу заставить его работать. Это то, что я называю в основной программе:
geneticParameters = \
generate_Initial_Parameters(x, y_eff, c=None)
fittedParameters, pcov = scipy.optimize.curve_fit(
powerfunc, x, y_eff, geneticParameters)
Где x
и y_eff
- это numpy массивы (7,1). И я пытаюсь ввести переменную y
для SumSquaredError в виде arg=(y,)
, который предположительно позволяет мне определить np.sum((y-val)**2.0
. Вот как определяются функции:
# Power function
def powerfunc(x, a, b, c=None):
"""
Power function. If c=None then there is no zero order parameter.
Returns: Power law applied to the independent variable
"""
if c is None:
return a*np.power(x, b)
else:
return a*np.power(x, b)+c
# Loss function
def sumSquaredError(x, parameterTuple):
"""
Function for the genetic algorithm to minimize (sum of squared error).
Parameters: x, y, parameterTuple
----------
Returns: Squared difference between experimental data and predicted data
"""
# do not print warnings by genetic algorithm
warnings.filterwarnings("ignore")
val = powerfunc(x, *parameterTuple)
return np.sum((y - val) ** 2.0)
def generate_Initial_Parameters(x, y, c=None):
"""
Generate initial parameters based on SciPy's genetic algorithm.
Returns: x, the solution array; result.x
"""
parameterBounds = []
parameterBounds.append([0., 10.]) # search bounds for a
parameterBounds.append([0., 5.]) # search bounds for b
if c is None:
result = scipy.optimize.differential_evolution(
func=sumSquaredError(x, parameterBounds),
bounds=parameterBounds, args=(y,),
seed=3)
else:
parameterBounds.append([-400, +400]) # search bounds for c
# "seed" the numpy random number generator for repeatable results
result = scipy.optimize.differential_evolution(
func=sumSquaredError(x, parameterBounds),
bounds=parameterBounds, args=(y,),
seed=3)
return result.x
Вот стек:
Traceback (most recent call last):
File "/home/josep/anaconda3/lib/python3.7/site-packages/scipy/optimize/_differentialevolution.py", line 878, in _calculate_population_energies
parameters_pop[0:nfevs]))
File "/home/josep/anaconda3/lib/python3.7/site-packages/scipy/optimize/_differentialevolution.py", line 1265, in __call__
return self.f(x, *self.args)
TypeError: 'numpy.float64' object is not callable
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/josep/Escritorio/Apunts/Doctorat/Doctorat Industrial/RheoDx/RheoExperimental/BetaTalassemia/pv_to_normalized_viscosity.py", line 534, in <module>
generate_Initial_Parameters(x, y_eff, c=None)
File "/home/josep/Escritorio/Apunts/Doctorat/Doctorat Industrial/RheoDx/RheoExperimental/BetaTalassemia/pv_to_normalized_viscosity.py", line 321, in generate_Initial_Parameters
seed=3)
File "/home/josep/anaconda3/lib/python3.7/site-packages/scipy/optimize/_differentialevolution.py", line 306, in differential_evolution
ret = solver.solve()
File "/home/josep/anaconda3/lib/python3.7/site-packages/scipy/optimize/_differentialevolution.py", line 745, in solve
self.population[self.feasible]))
File "/home/josep/anaconda3/lib/python3.7/site-packages/scipy/optimize/_differentialevolution.py", line 883, in _calculate_population_energies
raise RuntimeError("The map-like callable must be of the"
RuntimeError: The map-like callable must be of the form f(func, iterable), returning a sequence of numbers the same length as 'iterable'
Любая помощь приветствуется!