Как передать массив входных параметров в scipy.optimize.minimize? - PullRequest
3 голосов
/ 22 мая 2019

Я хочу использовать scipy.optimize.minimize для определения набора параметров путем минимизации функции ошибок.

Функция с именем «error» возвращает квадрат ошибки для функции, которую я пытаюсь найтиz1, z2, z3 (параметры) для.

У меня есть массив значений x (называемых «b» в функции) и y (называемых «действительными» в функции).

Приведенный ниже код работает нормально, если я задаю x и y некоторое целое число, но не если я пытаюсь передать массив значений x и y, чтобы они действовали как переменные "b" и "real" вуравнение, которое нужно минимизировать.

Попытка передать массив значений X и Y приводит к ошибке, вставленной ниже.

Есть ли способ передать массивы, чтобы действовать как переменная вуравнение для функции минимизации вместо единственного целого числа?

Вот как выглядит мой код:

import numpy as np
import pandas as pd
from scipy.optimize import minimize

#dataset file, with a column named x,y with 1000 rows
f = pd.read_csv('Test_Data_.txt', sep='\t')

#initial guess
x0 = [1, 2, 3]

#f['x'] and f['y'] are columns with 1000 rows
#x = f['x'].values
#y = f['y'].values

x = 1 #these parameters work fine
y = 4

#a function called inside the function to be minimized
def est(z1, z2, z3, b):

    return z1 * b**2 + z2 * b + z3

#function to minimize
def error(x, real, b):

    return (real - est(x[0], x[1], x[2], b))**2

print(minimize(error, x0, args = ( x, y), method='BFGS', tol=1e-6))

Подача в массив значений x и y приводит к ошибке:

Traceback (most recent call last):
  File "problem1.py", line 24, in <module>
    minimize(error, x0, args = ( np.array(list(f['y'].values)), np.array(list(f['x'].values))), method='BFGS', tol=1e-6)
  File "/usr/local/lib/python3.5/dist-packages/scipy/optimize/_minimize.py", line 595, in minimize
    return _minimize_bfgs(fun, x0, args, jac, callback, **options)
  File "/usr/local/lib/python3.5/dist-packages/scipy/optimize/optimize.py", line 970, in _minimize_bfgs
    gfk = myfprime(x0)
  File "/usr/local/lib/python3.5/dist-packages/scipy/optimize/optimize.py", line 300, in function_wrapper
    return function(*(wrapper_args + args))
  File "/usr/local/lib/python3.5/dist-packages/scipy/optimize/optimize.py", line 730, in approx_fprime
    return _approx_fprime_helper(xk, f, epsilon, args=args)
  File "/usr/local/lib/python3.5/dist-packages/scipy/optimize/optimize.py", line 670, in _approx_fprime_helper
    grad[k] = (f(*((xk + d,) + args)) - f0) / d[k]
ValueError: setting an array element with a sequence.



Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...