гессиан#
- 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.
Смотрите также
Примечания
Предположим, мы хотим вычислить гессиан функции \(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, ...)и вернуть массив формы(...)должны быть включены в старые категории. Значения, которые были в удаленных категориях, будут установлены в NaNddfатрибут результата будет иметь форму(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