#constraints #scipy-optimize-minimize
#ограничения #scipy-optimize-minimize
Вопрос:
Я запускаю написанный мной код на Python, который предполагает использование scipy.optimize.minimize method =’trust-constr’. Оптимизация включает в себя набор линейных ограничений, которые я передаю на Python с помощью scipy.optimize.LinearConstraint, где я передаю матрицу (матрицу коэффициентов переменных) и два вектора (нижняя и верхняя границы для каждого из ограничений) чисел.
Три раза все прошло нормально, каждый раз с разными начальными значениями параметров, но на четвертый раз произошел сбой из-за NaN. После нескольких часов поиска я обнаружил проблему: функция минимизации (что неудивительно) включает в себя многократный вызов функции, подлежащей минимизации. Однажды, когда она была вызвана, в глубине операции минимизации (конечно, задолго до начальной точки x0), один из аргументов, переданных целевой функции, имел значение nan.
Мне было интересно, как trust-costr пересматривает, по каким значениям оценивать целевую функцию, и почему он мог выбрать nan в качестве значения для одной из переменных?
Извините за отсутствие воспроизводимого примера. Я не уверен, как просто воспроизвести эту проблему.
Редактировать: Вот вывод консоли, начиная с фатального вызова для минимизации и далее
result=minimize(objective,x0,method=’trust-constr’,constraints=[prob_constraints],options={‘xtol’:10**(-10)}).x
Файл «C:Users (мое имя)Anaconda3libsite-packagesscipyoptimize_minimize.py «, строка 612, в minimize callback= обратный вызов, **параметры)
Файл «C:Users (мое имя)Anaconda3libsite-packagesscipyoptimize_trustregion_constrminimize_trustregion_constr.py «, строка 519, в _minimize_trustregion_constr factorization_method)
Файл «C:Users (мое имя)Anaconda3libsite-packagesscipyoptimize_trustregion_constrtr_interior_point.py «, строка 329, в tr_interior_point factorization_method, trust_lb, trust_ub, подзадача.масштабирование)
Файл «C:Users (мое имя)Anaconda3libsite-packagesscipyoptimize_trustregion_constrequality_constrained_sqp.py «, строка 121, в equality_constrained_sqp lb_t, ub_t)
Файл «C:Users (мое имя)Anaconda3libsite-packagesscipyoptimize_trustregion_constrqp_subproblem.py «, строка 499, в projected_cg r = Z.точка(H.точка(x) c)
Файл «C:Users (мое имя)Anaconda3libsite-packagesscipysparselinalginterface.py «, строка 370, в точке возвращает self.matvec(x)
Файл «C:Users (мое имя)Anaconda3libsite-packagesscipysparselinalginterface.py «, строка 227, в matvec y = self._matvec(x)
Файл «C:Users (мое имя)Anaconda3libsite-packagesscipysparselinalginterface.py «, строка 479, в _matvec возвращает self.__matvec_impl(x)
Файл «C:Users (мое имя)Anaconda3libsite-packagesscipyoptimize_trustregion_constrprojections.py «, строка 193, в null_space aux2 = scipy.linalg.solve_triangular(R, aux1, lower=False)
Файл «C:Users (мое имя)Anaconda3libsite-packagesscipylinalgbasic.py «, строка 336, в solve_triangular b1 = _asarray_validated(b, check_finite=check_finite)
Файл «C:Users (мое имя)Anaconda3libsite-packagesscipy_lib_util.py «, строка 239, в _asarray_validated a = toarray(a)
Файл «C:Users (мое имя)Anaconda3libsite-packagesnumpylibfunction_base.py «, строка 498, в asarray_chkfinite «массив не должен содержать inf или NAN»)
Ошибка значения: массив не должен содержать inf или NAN
Ответ №1:
Одно из возможных объяснений того, что trust-costr пытается оценить nan
значения в вашей целевой функции, заключается в том, что в какой-то момент оптимизации ваша целевая функция вернулась nan
к trust-costr.
Это «отложило бы» алгоритм, который затем попытался бы оценить ваши функции при nan
Возможно, вам захочется изучить ограничение вашей проблемы оптимизации, чтобы предотвратить использование алгоритма в местах, где ваша целевая функция подвержена возврату nans