scipy.special.huber#

scipy.special.huber(delta, r, out=None) = <ufunc 'huber'>#

Huber-Verlustfunktion.

\[\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{sonst} \end{cases}\end{split}\]
Parameter:
deltandarray

Eingabearray, das den quadratischen vs. linearen Verlust-Umschaltpunkt angibt.

rndarray

Eingabearray, das möglicherweise Residuen darstellt.

outndarray, optional

Optionales Ausgabe-Array für die Funktionswerte

Rückgabe:
skalar oder ndarray

Die berechneten Werte der Huber-Verlustfunktion.

Siehe auch

pseudo_huber

glatte Approximation dieser Funktion

Hinweise

huber ist nützlich als Verlustfunktion in der robusten Statistik oder im maschinellen Lernen, um den Einfluss von Ausreißern im Vergleich zum üblichen Fehlerquadrat zu reduzieren; Residuen mit einer Magnitude größer als delta werden nicht quadriert [1].

Typischerweise repräsentiert r Residuen, die Differenz zwischen einer Modellvorhersage und Daten. Dann, für \(|r|\leq\delta\), ähnelt huber dem Fehlerquadrat und für \(|r|>\delta\) dem absoluten Fehler. Auf diese Weise erzielt der Huber-Verlust oft eine schnelle Konvergenz bei der Modellanpassung für kleine Residuen, ähnlich der Fehlerquadrat-Verlustfunktion, und reduziert dennoch den Einfluss von Ausreißern (\(|r|>\delta\)) wie die absolute Fehlerfunktion. Da \(\delta\) der Grenzwert zwischen quadratischen und absoluten Fehlerregimen ist, muss er für jedes Problem sorgfältig abgestimmt werden. huber ist auch konvex, was ihn für gradientenbasierte Optimierung geeignet macht.

Hinzugefügt in Version 0.15.0.

Referenzen

[1]

Peter Huber. „Robust Estimation of a Location Parameter“, 1964. Annals of Statistics. 53 (1): 73 - 101.

Beispiele

Importieren Sie alle notwendigen Module.

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

Berechnen Sie die Funktion für delta=1 bei r=2

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

Berechnen Sie die Funktion für verschiedene delta, indem Sie ein NumPy-Array oder eine Liste für delta bereitstellen.

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

Berechnen Sie die Funktion an verschiedenen Punkten, indem Sie ein NumPy-Array oder eine Liste für r bereitstellen.

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

Die Funktion kann für verschiedene delta und r berechnet werden, indem für beide Arrays mit kompatiblen Formen für Broadcasting bereitgestellt werden.

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

Plotten Sie die Funktion für verschiedene 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