mirror of
https://github.com/TheAlgorithms/Python.git
synced 2024-11-24 13:31:07 +00:00
65 lines
1.7 KiB
Python
65 lines
1.7 KiB
Python
|
"""
|
||
|
Hinge Loss
|
||
|
|
||
|
Description:
|
||
|
Compute the Hinge loss used for training SVM (Support Vector Machine).
|
||
|
|
||
|
Formula:
|
||
|
loss = max(0, 1 - true * pred)
|
||
|
|
||
|
Reference: https://en.wikipedia.org/wiki/Hinge_loss
|
||
|
|
||
|
Author: Poojan Smart
|
||
|
Email: smrtpoojan@gmail.com
|
||
|
"""
|
||
|
|
||
|
import numpy as np
|
||
|
|
||
|
|
||
|
def hinge_loss(y_true: np.ndarray, y_pred: np.ndarray) -> float:
|
||
|
"""
|
||
|
Calculate the mean hinge loss for y_true and y_pred for binary classification.
|
||
|
|
||
|
Args:
|
||
|
y_true: Array of actual values (ground truth) encoded as -1 and 1.
|
||
|
y_pred: Array of predicted values.
|
||
|
|
||
|
Returns:
|
||
|
The hinge loss between y_true and y_pred.
|
||
|
|
||
|
Examples:
|
||
|
>>> y_true = np.array([-1, 1, 1, -1, 1])
|
||
|
>>> pred = np.array([-4, -0.3, 0.7, 5, 10])
|
||
|
>>> hinge_loss(y_true, pred)
|
||
|
1.52
|
||
|
>>> y_true = np.array([-1, 1, 1, -1, 1, 1])
|
||
|
>>> pred = np.array([-4, -0.3, 0.7, 5, 10])
|
||
|
>>> hinge_loss(y_true, pred)
|
||
|
Traceback (most recent call last):
|
||
|
...
|
||
|
ValueError: Length of predicted and actual array must be same.
|
||
|
>>> y_true = np.array([-1, 1, 10, -1, 1])
|
||
|
>>> pred = np.array([-4, -0.3, 0.7, 5, 10])
|
||
|
>>> hinge_loss(y_true, pred)
|
||
|
Traceback (most recent call last):
|
||
|
...
|
||
|
ValueError: y_true can have values -1 or 1 only.
|
||
|
"""
|
||
|
|
||
|
if len(y_true) != len(y_pred):
|
||
|
raise ValueError("Length of predicted and actual array must be same.")
|
||
|
|
||
|
# Raise value error when y_true (encoded labels) have any other values
|
||
|
# than -1 and 1
|
||
|
if np.any((y_true != -1) & (y_true != 1)):
|
||
|
raise ValueError("y_true can have values -1 or 1 only.")
|
||
|
|
||
|
hinge_losses = np.maximum(0, 1.0 - (y_true * y_pred))
|
||
|
return np.mean(hinge_losses)
|
||
|
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
import doctest
|
||
|
|
||
|
doctest.testmod()
|