Distancia

Distancias (V): el colofón irónico-especulativo

Remato la serie sobre distancias con una entrega especulativa. Según se la mire, o bien nunca se ha hecho esa cosa o bien nunca ha dejado de hacerse.

El problema es que ninguna de las propuestas desgranadas por ahí, incluidas las de mis serie, responde eficazmente la gran pregunta:

¿Son más próximos un individuo y una individua de 33 años o una individua de 33 y otra de 45?

La respuesta es contextual, por supuesto, y en muchos de esos contextos habría que tener en cuenta las interacciones entre variables, que es a lo que apunta la pregunta anterior.

Distancias (IV): la solución rápida y sucia

Prometí (d)escribir una solución rápida y sucia para la construcción de distancias cuando fallan las prêt à porter (euclídeas, Gower, etc.).

Está basada en la muy socorrida y casi siempre falsa hipótesis de independencia entre las distintas variables $latex x_1, \dots, x_n$ y tiene la forma

$$ d(x_a, x_b) = \sum_i \alpha_i d_i(x_{ia}, x_{ib})$$

donde los valores $latex \alpha_i$ son unos pesos que me invento (¡eh!, Euclides también se inventó que $latex \alpha_i = 1$ y nadie le frunció el ceño tanto como a mí tú ahora) tratando de que ponderen la importancia relativa que tiene la variable $latex i$ en el fenómeno que me interesa.

Distancias (III): la gran pregunta

Dejemos atrás los puntos en el plano. Olvidemos al Sr. Gower. La gran pregunta a la que uno se enfrenta al construir una distancia es en términos de qué se espera proximidad entre sujetos. Y eso genera una cadena de subpreguntas del tipo:

¿Son más próximos un individuo y una individua de 33 años o una individua de 33 y otra de 45?

Las dos entradas restantes de la serie (una sucia, rápida y práctica; la otra más especulativa) van sobre opciones disponibles para atacar (nótese que digo atacar y no resolver) el problema.

Distancias (II): las distancias no son distancias

Una distancia, Wikipedia dixit, sobre un conjunto $latex X$ es una función $latex d$ definida sobre $latex X \times X$ que toma valores en los reales $latex \ge 0$ y que cumple:

  1. $d(a,b) = 0 \iff a = b$
  2. $d(a,b) = d(b,a)$
  3. $d(a,c) \le d(a, b) + d(b, c)$

En la práctica, sin embargo, he encontrado violaciones tanto de (1) como de (2). ¿A alguien se le ocurren ejemplos?

Sin embargo, (3) se mantiene. Sin (3) todo se volvería una locura. De hecho, obtener resultados razonable usando distancias significa particularmente que esas distancias cumplen (3).

Distancias (I): el planteamiento del problema

Me han pedido (vía Twitter) que desarrolle cosas que tengo por ahí desperdigadas (p.e., en las notas de esos cursos que ya no daré y puede que en algunas entradas viejunas de este blog) sobre distancias.

¿Por qué son importantes las distancias? Por un principio que no suele ser explicitado tanto como merece en ciencia de datos: si quieres saber algo sobre un sujeto, busca unos cuantos parecidos y razona sobre ellos.

Análisis estadístico de formas y perfiles

Siempre me intrigó cómo podía realizarse el análisis estadístico de cosas que no son tablas. Por ejemplo, formas.

momocs_botellas

Nótese que tales medidas deberían presentar invariancias frente a rotaciones, dilataciones, simetrías, etc.

Quien alimente también semejantes dudas podrá saciarlas (parcialmente, claro) aquí y aquí, donde, entre otras cosas, se enseña cómo extraer variables de toda la vida que resumen ese tipo de perfiles a través de, por ejemplo, aplicaciones muy particulares de la transformada de Fourier.

Voronois con distintas distancias

Especulando sobre la diferencia en la práctica entre distintas métricas ($latex l_1$, $latex l_2$, $latex l_\infty$, etc.), construi una serie de diagramas de Voronoi usado métricas arbitrarias.

En la Wikipedia se comparan gráficamente $latex l_1$, $latex l_2$ (o euclídea y Manhattan). Mi código,

library(data.table)
library(reshape2)
library(grid)

n <- 20
dim.image <- 1000
puntos <- data.frame(id = 1:n,
                      x0 = runif(n) * dim.image,
                      y0 = runif(n) * dim.image)
colores <- rainbow(n)

voronoi <- function(p){
  tmp <- data.table(expand.grid(
      x = 1:dim.image,
      y = 1:dim.image, id = 1:n), key = "id")
  tmp <- merge(tmp, puntos, by = "id")

  distancia <- function(a, b, c, d, p)
    (abs(a-c)^p + abs(b-d)^p)^(1/p)

  tmp$distancia <- distancia(tmp$x,
    tmp$y, tmp$x0, tmp$y0, p)
  tmp[, rank := rank(distancia, ties = "random"),
    by = c("x", "y")]

  rejilla <- tmp[tmp$rank == 1,]
  rejilla$x0 <- rejilla$y0 <-
    rejilla$distancia <- rejilla$rank <- NULL

  rejilla$color <- colores[rejilla$id]

  imagen <- as.matrix(dcast(rejilla, x ~ y, value.var = "color")[,-1])

  grid.raster(imagen)
}

permite usar más en función del parámetro p.