1 votos

La distancia de Mahalanobis da resultados contradictorios

He generado 100 series temporales de muestra, cada una de ellas de 24 elementos, y cada una con una distribución exponencial con una escala diferente para cada uno de los 24 puntos temporales. Este es el parámetro de escala por punto de tiempo:

enter image description here

Mis 100 series temporales tienen este aspecto:

enter image description here

Esta es la matriz de covarianza de la muestra:

enter image description here

Este es el primer día:

enter image description here

Ahora voy a crear artificialmente dos nuevos días: Uno en el que añado una cantidad a un punto de tiempo en el que la varianza es generalmente alta (el día2 obtiene un aumento a las 8), y otro en el que añado la misma cantidad a un punto de tiempo en el que la varianza es baja (el día3 obtiene el mismo aumento a las 2).

Esperaré que la distancia dist(día1, día2) sea mucho menor que dist(día1, día3), porque el aumento del día2 se produjo en una región de alta varianza (las 8 de la mañana).

enter image description here enter image description here

Pero la salida que obtengo es:

mahalanobis(day1, day2, Sigma)  # should be "small"
62.9029

mahalanobis(day1, day3, Sigma)  # should be larger
15.0200

¿Por qué la distancia dist(día1, día2) es mayor que dist(día1, día3)?

Editar: Código Python para reproducir las cifras y los resultados:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

one_day_length = 24
n_days = 400

x = np.array(range(one_day_length))
scales = 0.2 + 2 * np.sin(x / 5) ** 2

# plt.plot(scales)

np.random.seed(20181106)
one_random_day = np.random.exponential(scale=scales, size=one_day_length)

# plt.plot(one_random_day)

random_days = pd.DataFrame([np.random.exponential(scale=scales, size=one_day_length) for _ in range(n_days)])

# random_days.head(20).T.plot(legend=False)

Sigma = random_days.cov()

from scipy.spatial.distance import mahalanobis

day1 = random_days.iloc[0]

# plt.plot(day1)
# plt.title('Day 1')

# plt.imshow(Sigma)

mahalanobis(day1, day1, Sigma)  # 0 of course

day2 = day1.copy()
day2[9] += 30
# plt.plot(day2)
# plt.title('Day 2 (8am += 30)')

day3 = day1.copy()
day3[2] += 30
# plt.plot(day3)
# plt.title('Day 3 (2am += 30)')

mahalanobis(day1, day2, Sigma)  # should be "small", but is 64.61
mahalanobis(day1, day3, Sigma)  # should be larger, but is 15.02

4voto

SHU Puntos 18

El extraño resultado se debe a un error de programación - según https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.spatial.distance.mahalanobis.html el mahalanobis -La función en cuestión toma como entrada la matriz de covarianza inversa. Fijando el código como, por ejemplo,

invSigma = np.linalg.inv(Sigma.values)
mahalanobis(day1, day2, invSigma)  # 14.41
mahalanobis(day1, day3, invSigma)  # 61.93

produce resultados que coinciden con las expectativas.

De hecho, ya que estamos aquí añadiendo $\Delta=30$ a $j$ del vector (día1), manteniendo los demás elementos constantes, la distancia de Mahalanobis se simplifica como \begin{equation} \sqrt{(\mathbf{x}+\Delta\mathbf{e}_j-\mathbf{x})^T\,V^{-1}\,(\mathbf{x}+\Delta\mathbf{e}_j-\mathbf{x})} = |\Delta|\,\sqrt{(V^{-1})_{j,j}}. \end{equation}

En el marco de la pregunta, la matriz de covarianza es bastante cercana a la diagonal, ya que se trata de una covarianza muestral de datos producidos a partir de una distribución en la que los componentes son independientes, y por tanto $(V^{-1})_{j,j}$ está cerca de $V_{j,j}^{-1}$ . Por lo tanto, la expectativa de OP de que la modificación de un componente con alta varianza debería producir una menor distancia de Mahalanobis es correcta. En presencia de correlación, el elemento diagonal de $(V^{-1})$ mide la varianza residual controlando las demás variables ( https://stats.stackexchange.com/a/73499/24669 ). Es decir, el orden de las distancias podría haber sido diferente si el punto de alta varianza 8 am estuviera altamente correlacionado con otros componentes.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X