|
|
|
|
|
from scipy.stats import pearsonr, spearmanr |
|
|
import torch.nn.functional as F |
|
|
import torch |
|
|
from scipy.stats import kendalltau |
|
|
import scipy.stats as stats |
|
|
|
|
|
|
|
|
def nash_sutcliffe_efficiency(observed, predicted): |
|
|
|
|
|
observed = observed.cpu() |
|
|
predicted = predicted.cpu() |
|
|
|
|
|
|
|
|
numerator = torch.sum((observed - predicted) ** 2) |
|
|
denominator = torch.sum((observed - torch.mean(observed)) ** 2) |
|
|
|
|
|
|
|
|
nse = 1 - (numerator / denominator) |
|
|
return nse.item() |
|
|
|
|
|
def pearson_correlation(y_true, y_pred): |
|
|
y_true = y_true.view(-1).cpu().numpy() |
|
|
y_pred = y_pred.view(-1).cpu().numpy() |
|
|
|
|
|
return pearsonr(y_true, y_pred)[0] |
|
|
|
|
|
def spearman_correlation(y_true, y_pred): |
|
|
y_true = y_true.view(-1).cpu().numpy() |
|
|
y_pred = y_pred.view(-1).cpu().numpy() |
|
|
|
|
|
return spearmanr(y_true, y_pred).correlation |
|
|
|
|
|
def mse(y_true, y_pred): |
|
|
|
|
|
y_true = y_true.cpu() |
|
|
y_pred = y_pred.cpu() |
|
|
|
|
|
return torch.mean((y_true - y_pred) ** 2).item() |
|
|
|
|
|
def mae(y_true, y_pred): |
|
|
|
|
|
y_true = y_true.cpu() |
|
|
y_pred = y_pred.cpu() |
|
|
|
|
|
return torch.mean(torch.abs(y_true - y_pred)).item() |
|
|
|
|
|
def percentage_error(y_true, y_pred): |
|
|
|
|
|
y_true = y_true.cpu() |
|
|
y_pred = y_pred.cpu() |
|
|
|
|
|
return 100 * torch.mean((y_pred - y_true) / (y_true + 1e-6)).item() |
|
|
|
|
|
def percentage_bias(y_true, y_pred): |
|
|
|
|
|
y_true = y_true.cpu() |
|
|
y_pred = y_pred.cpu() |
|
|
|
|
|
return 100 * torch.sum(y_pred - y_true) / (torch.sum(y_true) + 1e-6) |
|
|
|
|
|
def kendall_tau(y_true, y_pred): |
|
|
y_true = y_true.view(-1).cpu().numpy() |
|
|
y_pred = y_pred.view(-1).cpu().numpy() |
|
|
|
|
|
return kendalltau(y_true, y_pred).correlation |
|
|
|
|
|
def r2_score(y_true, y_pred): |
|
|
|
|
|
y_true = y_true.cpu() |
|
|
y_pred = y_pred.cpu() |
|
|
|
|
|
ss_total = torch.sum((y_true - torch.mean(y_true)) ** 2) |
|
|
ss_residual = torch.sum((y_true - y_pred) ** 2) |
|
|
|
|
|
return 1 - (ss_residual / (ss_total + 1e-6)).item() |
|
|
|
|
|
def spatial_correlation(y_true, y_pred): |
|
|
|
|
|
y_true_flat = y_true.view(-1).cpu() |
|
|
y_pred_flat = y_pred.view(-1).cpu() |
|
|
|
|
|
|
|
|
numerator = torch.sum(y_pred_flat * y_true_flat) |
|
|
|
|
|
|
|
|
denominator = torch.sqrt(torch.sum(y_pred_flat ** 2) * torch.sum(y_true_flat ** 2)) |
|
|
|
|
|
|
|
|
correlation = numerator / (denominator) |
|
|
|
|
|
return correlation.item() |