scipy.differentiate.

гессиан#

scipy.differentiate.гессиан(f, x, *, допуски=None, maxiter=10, порядок=8, initial_step=0.5, step_factor=2.0)[источник]#

Вычислить гессиан функции численно.

Параметры:
fcallable

Функция, чья матрица Гессе требуется. Сигнатура должна быть:

f(xi: ndarray) -> ndarray

где каждый элемент xi является конечным вещественным числом. Если функция для дифференцирования принимает дополнительные аргументы, оберните её (например, используя functools.partial или lambda) и передать обёрнутый вызываемый объект в hessian. f не должен изменять массив xi. См. примечания относительно векторизации и размерности входных и выходных данных.

xfloat array_like

Точки, в которых вычисляется гессиан. Должны иметь хотя бы одно измерение. См. примечания относительно размерности и векторизации.

допускисловарь чисел с плавающей точкой, опционально

Абсолютная и относительная погрешности. Допустимые ключи словаря:

  • atol - абсолютный допуск на производную

  • rtol - относительный допуск на производную

Итерация остановится, когда res.error < atol + rtol * abs(res.df). По умолчанию atol является наименьшим нормальным числом соответствующего типа данных, и по умолчанию rtol является квадратным корнем точности соответствующего типа данных.

порядокint, по умолчанию: 8

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

initial_stepfloat, по умолчанию: 0.5

(Абсолютный) начальный размер шага для аппроксимации производной конечными разностями.

step_factorfloat, по умолчанию: 2.0

Коэффициент, на который умножается размер шага уменьшенный на каждой итерации; т.е. размер шага на итерации 1 равен initial_step/step_factor. Если step_factor < 1, последующие шаги будут больше начального шага; это может быть полезно, если шаги меньше некоторого порога нежелательны (например, из-за ошибки вычитательной отмены).

maxiterint, по умолчанию: 10

Максимальное количество итераций алгоритма для выполнения. См. Примечания.

Возвращает:
res_RichResult

Объект, похожий на экземпляр scipy.optimize.OptimizeResult со следующими атрибутами. Описания написаны так, как будто значения будут скалярами; однако, если f возвращает массив, выходные данные будут массивами той же формы.

successлогический массив

True где алгоритм успешно завершился (статус 0); False в противном случае.

statusцелочисленный массив

Целое число, представляющее статус завершения алгоритма.

  • 0 : Алгоритм сошелся к заданным допускам.

  • -1 : Оценка ошибки увеличилась, поэтому итерация была прекращена.

  • -2 : Достигнуто максимальное количество итераций.

  • -3 : Встречено неконечное значение.

ddfмассив float

Гессиан f в x, если алгоритм завершился успешно.

ошибкамассив float

Оценка ошибки: величина разницы между текущей оценкой гессиана и оценкой на предыдущей итерации.

nfevцелочисленный массив

Количество точек, в которых f было вычислено.

Каждый элемент атрибута связан с соответствующим элементом ddf. Например, элемент [i, j] of nfev является количеством точек, в которых f был оценен для вычисления элемента [i, j] of ddf.

Смотрите также

derivative, jacobian

Примечания

Предположим, мы хотим вычислить гессиан функции \(f: \mathbf{R}^m \rightarrow \mathbf{R}\), и мы присваиваем переменной m положительное целочисленное значение \(m\). Если мы хотим вычислить гессиан в одной точке, то:

  • аргумент x должен быть массивом формы (m,)

  • аргумент f должен быть векторизован для принятия массива формы (m, ...). Первая ось представляет \(m\) входы \(f\); оставшиеся оси, обозначенные многоточиями, предназначены для вычисления функции в нескольких абсциссах за один вызов.

  • аргумент f должен возвращать массив формы (...).

  • атрибут dff результирующего объекта будет массивом формы (m, m), матрица Гессе.

Эта функция также векторизована в том смысле, что гессиан может быть вычислен в k точки в одном вызове. В этом случае, x будет массивом формы (m, k), f примет массив формы (m, ...) и вернуть массив формы (...)должны быть включены в старые категории. Значения, которые были в удаленных категориях, будут установлены в NaN ddf атрибут результата будет иметь форму (m, m, k). Обратите внимание, что ось, связанная с k точки включены в оси, обозначенные (...).

В настоящее время, hessian реализован путём вложенных вызовов jacobian. Все опции, переданные в hessian используются как для внутренних, так и для внешних вызовов, за одним исключением: rtol используется во внутреннем jacobian вызов затягивается в 100 раз с ожиданием, что внутреннюю ошибку можно игнорировать. Следствием является то, что rtol не должно быть установлено менее чем в 100 раз больше точности dtype x; в противном случае выдается предупреждение.

Ссылки

[1]

Матрица Гессе, Википедия, https://en.wikipedia.org/wiki/Hessian_matrix

Примеры

Функция Розенброка отображает из \(\mathbf{R}^m \rightarrow \mathbf{R}\); реализация в SciPy scipy.optimize.rosen векторизован для приёма массива формы (m, ...) и вернуть массив формы .... Предположим, мы хотим вычислить гессиан в [0.5, 0.5, 0.5].

>>> import numpy as np
>>> from scipy.differentiate import hessian
>>> from scipy.optimize import rosen, rosen_hess
>>> m = 3
>>> x = np.full(m, 0.5)
>>> res = hessian(rosen, x)
>>> ref = rosen_hess(x)  # reference value of the Hessian
>>> np.allclose(res.ddf, ref)
True

hessian векторизован для вычисления гессиана в нескольких точках за один вызов.

>>> rng = np.random.default_rng()
>>> x = rng.random((m, 10))
>>> res = hessian(rosen, x)
>>> ref = [rosen_hess(xi) for xi in x.T]
>>> ref = np.moveaxis(ref, 0, -1)
>>> np.allclose(res.ddf, ref)
True