La fórmula habitual de la distancia euclidiana que todo el mundo utiliza es
$$d(x,y):=\sqrt{\sum (x_i - y_i)^2}$$
Ahora bien, por lo que sé, las sumas de cuadrados suelen venir con algunos problemas en cuanto a la precisión numérica.
Existe una fórmula obviamente equivalente:
$$d(x,y):= c \sqrt{\sum \left(\frac{x_i - y_i}{c}\right)^2}$$
Donde parece ser una práctica común elegir $c = \max_i |x_i - y_i|$ .
Para 2d, esto se simplifica a una fórmula de la forma $d(x,y):= c \sqrt{1 + \frac{b}{c}^2}$
Algunas preguntas aquí:
- ¿Cuál es la ganancia de precisión al hacer esto, en particular para las altas dimensionalidades?
- ¿Cuánto incrementa los costes de computación?
- ¿Es esta elección de $c$ ¿Optima?
-
Para calcular $c$ Esto requiere dos pases sobre los datos. Sin embargo, debería ser posible en una sola pasada, empezando por $c_0=1$ y ajustarlo cuando sea necesario para obtener una precisión óptima.
Por ejemplo, dejemos $c_0=1$ , $c_i=\max_{j\leq i} |x_i-y_i|$ . Entonces $$S_i:=\sum_{j\leq i} \left(\frac{x_i - y_i}{c_i}\right)^2 = \sum_{j\leq i-1} \left(\frac{x_i - y_i}{c_{i-1}}\right)^2 \cdot \frac{c_{i-1}^2}{c_i^2}+\left(\frac{x_i - y_i}{c_i}\right)^2 = S_{i-1} \cdot \left(\frac{c_{i-1}}{c_i}\right)^2+\left(\frac{x_i - y_i}{c_i}\right)^2$$ Esto debería permitir el cálculo en una sola pasada de esta fórmula, ¿verdad?
¿Algún comentario en particular sobre el coste computacional y las ventajas de precisión de calcular la distancia euclidiana de esta manera? ¿Por qué todo el mundo utiliza la forma ingenua, es la ganancia de precisión demasiado pequeña para la baja dimensionalidad y el coste computacional asociado demasiado alto?
P.D. Al menos a mi entender, la fórmula habitual debería ser precisa hasta el rango de valores de sqrt(Double.MAX_VALUE)
a sqrt(Double.MIN_NORMAL)
que cubre alrededor de e+-154
como máximo dividido por la dimensionalidad - así que incluso para 1000 dimensiones, eso debería estar bien para la mayoría de los usos de una función de distancia ...