Scipy.least_squares выдает «ValueError: остатки не конечны в начальной точке». когда первоначальная оценка функции ошибоPython

Программы на Python
Ответить
Anonymous
 Scipy.least_squares выдает «ValueError: остатки не конечны в начальной точке». когда первоначальная оценка функции ошибо

Сообщение Anonymous »

Я использую алгоритм минимизации scipy.least_squares, чтобы подогнать сложную модель к некоторым данным. Сама модель использует прямой метод Эйлера для решения дифференциального уравнения при трех различных наборах начальных условий, каждый из которых соответствует набору данных, которые я пытаюсь подогнать. Функция ошибок вычисляет разницу между данными и результатами моделирования для каждого набора начальных условий и объединяет их. Цель состоит в том, чтобы оптимизировать 4 параметра, все из которых являются положительными. Когда я запускаю алгоритм наименьших квадратов, он возвращает ошибку «ValueError: остатки не конечны в начальной точке». Однако мое тестирование показало, что это не так.
Для простоты я опустил детали самой модели, но у меня есть предопределенная функция errfunc, которая принимает массив параметров. в качестве первого аргумента и наборы данных t (время) и y в качестве дополнительных аргументов. Эта функция возвращает одномерный массив остатков (модель-данные), который состоит из объединения остатков для каждого набора начальных условий. Мой код для запуска оптимизации выглядит примерно так:

Код: Выделить всё

param = np.array([param1_init, param2_init, param3_init, param4_init])

result = least_squares(errfunc, param, bounds=(0,np.inf), args=(t_data1, y_data1, t_data2, y_data2, t_data3, y_data3))

Насколько я понимаю, эта ошибка указывает на то, что при первой оценке значения функции ошибок были возвращены некоторые значения NaN или бесконечные значения. Однако я знаю, что это не так: когда я сам запускаю функцию ошибки в начальной точке, она возвращает такой конечный массив, что

Код: Выделить всё

residual = errfunc(param, t_data1, y_data1, t_data2, y_data2, t_data3, y_data3)
print(np.all(np.isfinite(residual)))

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

Код: Выделить всё

plt.plot(residual)
возвращает:
Графики остатков при начальных значениях параметров
Мой вопрос заключается в том, есть ли что-то, что я не учел, что могло бы будет возвращать эту ошибку?
Для очень похожей на эту модели оптимизация работает отлично. Единственное отличие модели — это дополнительный член в дифференциальном уравнении и дополнительный параметр для оптимизации. Моя единственная мысль заключается в том, что очень большие и маленькие значения параметров могут играть роль. Дополнительный параметр, который я ввел, имеет очень маленькое положительное значение (обычно около 1e-29), но, как я показал, значения по этой шкале дают разумные результаты модели. Может ли это повлиять на алгоритм наименьших квадратов и привести к возникновению этой ошибки?

Подробнее здесь: https://stackoverflow.com/questions/753 ... he-initial
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»