From d7a7817122d2c4b4b022d4a714feaea6c5374bfa Mon Sep 17 00:00:00 2001 From: uttam12331 Date: Thu, 6 Aug 2026 16:05:52 +0530 Subject: [PATCH] Use per-dimension mean in mahalanobis metric The Mahalanobis distance centers X on the reference distribution's mean vector (per-column centroid), but `np.mean(reference_distribution)` with no axis collapses the 2D array to a single scalar grand mean, broadcast across all features. `np.cov(reference_distribution.T)` already treats each column as a variable, confirming the per-column intent. As a result a point sitting on the distribution's own centroid reported a large nonzero distance. Use `np.mean(reference_distribution, axis=0)` and add a doctest showing a centroid point has distance 0. --- metrics/mahalanobis/mahalanobis.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/metrics/mahalanobis/mahalanobis.py b/metrics/mahalanobis/mahalanobis.py index a2cad4996..0a53077b8 100644 --- a/metrics/mahalanobis/mahalanobis.py +++ b/metrics/mahalanobis/mahalanobis.py @@ -54,6 +54,10 @@ >>> results = mahalanobis_metric.compute(reference_distribution=[[0, 1], [1, 0]], X=[[0, 1]]) >>> print(results) {'mahalanobis': array([0.5])} + >>> # a point on the reference distribution's centroid has distance 0 + >>> results = mahalanobis_metric.compute(reference_distribution=[[0, 10], [4, 10], [0, 14], [4, 14]], X=[[2, 12]]) + >>> print(results) + {'mahalanobis': array([0.])} """ @@ -88,7 +92,7 @@ def _compute(self, X, reference_distribution): ) # Get mahalanobis distance for each prediction - X_minus_mu = X - np.mean(reference_distribution) + X_minus_mu = X - np.mean(reference_distribution, axis=0) cov = np.cov(reference_distribution.T) try: inv_covmat = np.linalg.inv(cov)