У меня есть функция трех переменных, которую я хочу оптимизировать. К сожалению, переменные имеют разные порядки величины, а это означает, что задача очень плохо обусловлена. Я справляюсь с этим, умножая переменную оптимизации на матрицу условий. (В приведенном ниже примере моя матрица обусловления является диагональной, поэтому я реализовал ее как вектор. Могут быть приложения для недиагональных матриц обусловления.)
Код: Выделить всё
import numpy as np
from scipy.optimize import minimize
def penalty(x):
# do stuff
return # result
conditioner = np.array([1000, 1, 0.1])
x0 = np.array([0.003, 1.415, 9.265]) * conditioner
optim_result = minimize(penalty, x0)
bestfit = optim_result.x / conditioner
Есть ли способ сделать это, который не требует ручного применения кондиционера или не требует от меня отслеживать, какие данные обрабатываются (например, bestfit) а какие нет (например, optim_result)?
Думаю, я мог бы поместить часть арифметики в функцию штрафа, вот так:
Код: Выделить всё
def penalty(x):
x_cond = x * conditioner
# do stuff
return # result
но это решает только половину проблемы.
Подробнее здесь:
https://stackoverflow.com/questions/792 ... nditioning