import numpy as np import torch from torchmetrics import Metric def RSE(pred, true): return np.sqrt(np.sum((true - pred) ** 2)) / np.sqrt( np.sum((true - true.mean()) ** 2) ) def CORR(pred, true): u = ((true - true.mean(0)) * (pred - pred.mean(0))).sum(0) d = np.sqrt(((true - true.mean(0)) ** 2 * (pred - pred.mean(0)) ** 2).sum(0)) return (u / d).mean(-1) def MAE(pred, true): return np.mean(np.abs(pred - true)) def MSE(pred, true): return np.mean((pred - true) ** 2) def RMSE(pred, true): return np.sqrt(MSE(pred, true)) def MAPE(pred, true): return np.mean(np.abs((pred - true) / true)) def MSPE(pred, true): return np.mean(np.square((pred - true) / true)) def metric(pred, true): mae = MAE(pred, true) mse = MSE(pred, true) rmse = RMSE(pred, true) mape = MAPE(pred, true) mspe = MSPE(pred, true) return mae, mse, rmse, mape, mspe class MSELoss(Metric): # Just testing to make sure torch metrics work as expected is_differentiable = True def __init__(self): super().__init__() self.add_state( "sum_squared_errors", default=torch.tensor(0, dtype=float), dist_reduce_fx="sum", ) self.add_state("n_observations", default=torch.tensor(0), dist_reduce_fx="sum") def update(self, preds: torch.Tensor, target: torch.Tensor): assert preds.shape == target.shape self.sum_squared_errors += torch.sum(torch.square(preds - target)) self.n_observations += preds.numel() def compute(self): return self.sum_squared_errors / self.n_observations