scipy.optimize.least_squares, LinearOperator для аргумента ‘jac’

#python #python-3.x #scipy #scipy-optimize #scipy-optimize-minimize

#python #python-3.x #scipy #scipy-оптимизировать #scipy-оптимизировать-минимизировать

Вопрос:

Я пытаюсь понять документацию по scipy.optimize.least_squares функции:

https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.least_squares.html

Возможности ввода немного запутанны, и документация не очень понятна по всем из них. В нем говорится, что аргумент jac может быть вызываемым, возвращающим a LinearOperator .

  1. Я полагаю, предоставленный LinearOperator должен представлять якобиан как линейный оператор, отображающий сдвиги переменных в остаточные сдвиги. Или наоборот?
  2. Какие операции мне нужно реализовать для LinearOperator ? Только matvec или matmat также?
  3. Действительно ли предоставление a LinearOperator вместо полной матрицы Якоби что-нибудь ускоряет? Или полная матрица все равно строится из оператора? (И да, в моем примере оценка LinearOperator намного быстрее, чем построение всей матрицы Якоби.)

Ответ №1:

  1. least_squares ожидает якобиан исходных функций (переменная сдвигается на сдвиги значений). Если вы знаете якобиан для остатков, вам, вероятно, следует переключиться на fmincon или другую процедуру оптимизации и работать с остатками. Одним из основных преимуществ метода наименьших квадратов является возможность эффективно говорить на языке оригинальных функций вместо остатков.
  2. least_squares вызывает matmat , matvec , rmatvec , но LinearOperator сам может реализовать matmat from matvec , если только matvec это предусмотрено (и наоборот). Но он не может быть реализован rmatvec без rmatvec or rmatmat .
  3. В большинстве случаев требуется только результат J(x).T.dot(f) , и полная матрица не хранится. Тем не менее, я заметил некоторую числовую разницу между матрицей и операторами якобианами.