Минимизация функции путем изменения параметров с помощью scipy - PullRequest
0 голосов
/ 16 октября 2018

Я хочу минимизировать следующее уравнение, изменяя параметры B0, B1, B2, B3, T1, T2.Переменная у просто еще одна переменная для вычисления целевой функции.Мне просто нужна помощь, чтобы минимизировать эту функцию (используемую как целевую функцию) путем изменения параметров, но я не могу получить результаты.Я попробовал с scipy, но я не изменил параметры.Запустив функцию, я получаю желаемый результат:

funcion_opt(B0, B1, B2, B3, T1, T2)
output:  64.30571361326217

Но когда я минимизирую, я получаю следующий результат:

res = optimize.minimize(funcion_opt, parameters, args=(beta0, beta1, beta2, 
beta3, tau1, tau2))
output: funcion_opt() takes 6 positional arguments but 7 were given

Я знаю, что ошибкаспособ ввести параметры и там, где мне нужна помощь.Извините, если это не совсем понятно.

Небольшой пример моей проблемы:

y = np.array([98.494500, 97.828500, 97.610000, 97.314000, 97.014500, 
92.959000, 96.696222])
def objective(b0, b1, b2, b3, t1, t2):
    return (y * b0 + b1) - ( y * b2 + b3) + t1 + t2
    x0 = np.array([0.03, -0.03, 0, 0, 1, 1]) #Initial values of b0, b1...
    result = minimize(objective, x0, args=(b0, b1, b2, b3, t1, t2))

Я знаю, что входные данные в функции неправильные, переменные, которые являются постоянными, это y, и я хочуизменить значения параметров b0, b1, b2, b3, t1, t2.Поэтому мне нужна функция минимизации, которая возвращает функцию и, настраивая параметры, минимизирует ошибку.Так что, возможно, ошибка в настройке целевой функции.

Это фиктивная функция, оригинальная - сумма квадратичных ошибок.После этого мне нужно минимизировать функцию tat, изменяя значения параметров внутри возвращаемых b0, b1, b2, b3, t1, t2, потому что в функции эти параметры установлены как.Коэффициент дисконтирования не имеет значения. Мне просто нужно, как изменить параметры на те, которые минимизируют целевую функцию:

Когда я пытаюсь минимизировать, получаю вывод, что ошибка та же, а параметры не изменились.Любая помощь с этим будет высоко ценится.Заранее спасибо.

1 Ответ

0 голосов
/ 16 октября 2018

Ваша проблема в передаче (b0, b1, b2, b3, t1, t2) в виде аргументов - это должен быть вектор оптимизации, поэтому он должен быть передан только в форме начального x0 (что вы и сделали).Поскольку вы удалили y из функции objective, нет необходимости в args (для передачи постоянных параметров оптимизируемой функции).

Это то, что, на мой взгляд, должно выглядеть при использовании objective function после исправления (я сделал его полным с импортом и всем, чтобы вы могли запустить его без изменений) :

import numpy as np
from scipy.optimize import minimize

y = 10.0

def objective(b0, b1, b2, b3, t1, t2):
    return (y * b0 + b1) - ( y * b2 + b3) + t1 + t2

def objective_proxy(x):
    return objective(*x)

x0 = np.array([0.03, -0.03, 0, 0, 1, 1])
result = minimize(objective_proxy, x0)

Когда вы попробуете это с оригинальной функцией (у которой было y как последний параметр), вы можете передать y в args сейчас, потому что это константа и результат будет выглядеть следующим образом:

y_value = np.array([98.494500, 97.828500, 97.610000, 97.314000, 97.014500, 
92.959000, 96.696222])

def function_opt(b0, b1, b2, b3, t1, t2, y):
    ...
    ...
    return ...

def function_opt_proxy(x, y):
    args = list(x) + [y]
    return function_opt(*args)


x0 = np.array([0.03, -0.03, 0, 0, 1, 1]) #Initial values of b0, b1...
result = minimize(function_opt_proxy, x0, args=(y_value,)

Обратите внимание, что я изменил y на y_valueчтобы избежать путаницы между function_opt параметром.

исправлено:

Я добавил прокси-функцию, которая заботится о расширении параметров от итерируемых до отдельных параметров.

...