scipy.special.huber#

scipy.special.huber(delta, r, выход=None) = 'huber'>#

Функция потерь Хьюбера.

\[\begin{split}\text{huber}(\delta, r) = \begin{cases} \infty & \delta < 0 \\ \frac{1}{2}r^2 & 0 \le \delta, | r | \le \delta \\ \delta ( |r| - \frac{1}{2}\delta ) & \text{otherwise} \end{cases}\end{split}\]
Параметры:
deltandarray

Входной массив, указывающий точку изменения квадратичной и линейной потерь.

rndarray

Входной массив, возможно, представляющий остатки.

выходndarray, необязательно

Необязательный выходной массив для значений функции

Возвращает:
скаляр или ndarray

Вычисленные значения функции потерь Хубера.

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

pseudo_huber

сглаженная аппроксимация этой функции

Примечания

huber полезен как функция потерь в робастной статистике или машинном обучении для уменьшения влияния выбросов по сравнению с обычной квадратичной функцией потерь; остатки с величиной выше delta не возводятся в квадрат [1].

Обычно, r представляет остатки, разницу между предсказанием модели и данными. Тогда для \(|r|\leq\delta\), huber напоминает квадрат ошибки и для \(|r|>\delta\) абсолютную ошибку. Таким образом, функция потерь Хьюбера часто достигает быстрой сходимости при подгонке модели для малых остатков, как функция квадратичной ошибки, и всё ещё уменьшает влияние выбросов (\(|r|>\delta\)) как абсолютная ошибка потерь. Как \(\delta\) является границей между режимами квадратичной и абсолютной ошибки, его необходимо тщательно настраивать для каждой задачи. huber также является выпуклой, что делает её подходящей для градиентной оптимизации.

Добавлено в версии 0.15.0.

Ссылки

[1]

Питер Хубер. "Робастное оценивание параметра положения", 1964. Annals of Statistics. 53 (1): 73 - 101.

Примеры

Импортируйте все необходимые модули.

>>> import numpy as np
>>> from scipy.special import huber
>>> import matplotlib.pyplot as plt

Вычислить функцию для delta=1 в r=2

>>> huber(1., 2.)
1.5

Вычислить функцию для различных delta предоставляя массив NumPy или список для delta.

>>> huber([1., 3., 5.], 4.)
array([3.5, 7.5, 8. ])

Вычислите функцию в разных точках, предоставив массив NumPy или список для r.

>>> huber(2., np.array([1., 1.5, 3.]))
array([0.5  , 1.125, 4.   ])

Функция может быть вычислена для различных delta и r путем предоставления массивов для обоих с совместимыми формами для вещания.

>>> r = np.array([1., 2.5, 8., 10.])
>>> deltas = np.array([[1.], [5.], [9.]])
>>> print(r.shape, deltas.shape)
(4,) (3, 1)
>>> huber(deltas, r)
array([[ 0.5  ,  2.   ,  7.5  ,  9.5  ],
       [ 0.5  ,  3.125, 27.5  , 37.5  ],
       [ 0.5  ,  3.125, 32.   , 49.5  ]])

Построить график функции для различных delta.

>>> x = np.linspace(-4, 4, 500)
>>> deltas = [1, 2, 3]
>>> linestyles = ["dashed", "dotted", "dashdot"]
>>> fig, ax = plt.subplots()
>>> combined_plot_parameters = list(zip(deltas, linestyles))
>>> for delta, style in combined_plot_parameters:
...     ax.plot(x, huber(delta, x), label=fr"$\delta={delta}$", ls=style)
>>> ax.legend(loc="upper center")
>>> ax.set_xlabel("$x$")
>>> ax.set_title(r"Huber loss function $h_{\delta}(x)$")
>>> ax.set_xlim(-4, 4)
>>> ax.set_ylim(0, 8)
>>> plt.show()
../../_images/scipy-special-huber-1.png