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_huberglatte Approximation dieser Funktion
Hinweise
huberist 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
huberdem 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.huberist 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=1beir=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()