Я хочу использовать 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.