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()