Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
143 changes: 143 additions & 0 deletions bluemath_tk/core/metrics.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
import numpy as np


def bias(X_true: np.ndarray, X_pred: np.ndarray) -> float:
"""
Calculate the BIAS.

Parameters
----------
X_true : np.ndarray
True values.
X_pred : np.ndarray
Predicted values.

Returns
-------
float
The BIAS value.
"""

if len(X_true) != len(X_pred):
raise ValueError("X_true and X_pred must have the same length")

return float(sum(X_true - X_pred) / len(X_true))


def si(X_true: np.ndarray, X_pred: np.ndarray) -> float:
"""
Calculate the Scatter Index (SI).

Parameters
----------
X_true : np.ndarray
True values.
X_pred : np.ndarray
Predicted values.

Returns
-------
float
The Scatter Index value.
"""

if len(X_true) != len(X_pred):
raise ValueError("X_true and X_pred must have the same length")

return float(
np.sqrt(
sum(((X_true - X_true.mean()) - (X_pred - X_pred.mean())) ** 2)
/ sum(X_true**2)
)
)


def mse(X_true: np.ndarray, X_pred: np.ndarray) -> float:
"""
Calculate Mean Squared Error (MSE).

Parameters
----------
X_true : np.ndarray
True values.
X_pred : np.ndarray
Predicted values.

Returns
-------
float
Mean squared error.
"""

if len(X_true) != len(X_pred):
raise ValueError("X_true and X_pred must have the same length")

return float(np.mean((X_true - X_pred) ** 2))


def mae(X_true: np.ndarray, X_pred: np.ndarray) -> float:
"""
Calculate Mean Absolute Error (MAE).

Parameters
----------
X_true : np.ndarray
True values.
X_pred : np.ndarray
Predicted values.

Returns
-------
float
Mean absolute error.
"""

if len(X_true) != len(X_pred):
raise ValueError("X_true and X_pred must have the same length")

return float(np.mean(np.abs(X_true - X_pred)))


def rmse(X_true: np.ndarray, X_pred: np.ndarray) -> float:
"""
Calculate Root Mean Squared Error (RMSE).

Parameters
----------
X_true : np.ndarray
True values.
X_pred : np.ndarray
Predicted values.

Returns
-------
float
Root mean squared error.
"""

return float(np.sqrt(mse(X_true, X_pred)))


def r2(X_true: np.ndarray, X_pred: np.ndarray) -> float:
"""
Calculate the R² score.

Parameters
----------
X_true : np.ndarray
True values.
X_pred : np.ndarray
Predicted values.

Returns
-------
float
The R² score.
"""

if len(X_true) != len(X_pred):
raise ValueError("X_true and X_pred must have the same length")

return float(
1.0 - np.sum((X_true - X_pred) ** 2) / np.sum((X_true - X_true.mean()) ** 2)
)
Loading
Loading