Проблема дифференциальной эволюции Scipy RuntimeError - PullRequest
0 голосов
/ 01 апреля 2020

(это долго из-за 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'

Любая помощь приветствуется!

...