34 votos

Cómo representar una variable no limitada como un número entre 0 y 1

Quiero representar una variable como un número entre 0 y 1. La variable es un entero no negativo sin límite inherente. Mapeo 0 a 0 pero ¿qué puedo mapear a 1 o a números entre 0 y 1?

Podría utilizar el historial de esa variable para proporcionar los límites. Esto significaría que tengo que replantear las estadísticas antiguas si el máximo aumenta. ¿Tengo que hacer esto o hay otros trucos que debería conocer?

0 votos

¿Qué aspecto tienen sus datos? ¿Están acotados los valores?

0 votos

@spencer Este foro acoge (IMHO) a todo el mundo. Estás perfectamente bien. ¿Puede usted por favor un poco más de detalles acerca de sus datos? ¿Son tus datos no negativos? ...

0 votos

Mis datos serán no negativos y no tienen límite.

40voto

Anthony Cramp Puntos 126

Un truco muy común para hacerlo (por ejemplo, en el modelado conexionista) es utilizar el tangente hiperbólica tanh como la "función de aplastamiento". Esta función ajusta automáticamente todos los números en el intervalo entre -1 y 1. Lo que en tu caso restringe el rango de 0 a 1. En r y matlab se obtiene a través de tanh() .

Otra función de aplastamiento es la función logística (gracias a Simon por el nombre), proporcionada por $ f(x) = 1 / (1 + e ^{-x} ) $ que restringe el rango de 0 a 1 (con 0 asignado a 0,5). Por lo tanto, tendrías que multiplicar el resultado por 2 y restar 1 para que tus datos encajen en el intervalo entre 0 y 1.

Aquí hay un simple código R que traza ambas funciones (tanh en rojo, logístico en azul) para que puedas ver cómo ambas se aplastan:

x <- seq(0,20,0.001)
plot(x,tanh(x),pch=".", col="red", ylab="y")
points(x,(1 / (1 + exp(-x)))*2-1, pch=".",col="blue")

0 votos

Gracias por su respuesta. Eso resuelve el problema de los límites. Para mis datos se va a 1 muy rápidamente para mis datos, así que supongo que la siguiente cosa que tengo que hacer es escalar esta información para concentrarse en el rango interesante que podría hacer sobre la base de la historia de la misma sin temor a dejar el límite, sólo golpear el límite.

30voto

Berek Bryan Puntos 349

Como a menudo, mi primera pregunta iba a ser " por qué quieres hacer esto", entonces he visto que ya has respondido a esto en los comentarios a la pregunta: " Estoy midiendo el contenido a través de muchas dimensiones diferentes y quiero ser capaz de hacer comparaciones en términos de lo relevante que es un determinado contenido. Además, quiero que los valores de estas dimensiones sean explicables y fáciles de entender. "

No hay ninguna razón para normalizar los datos de manera que el máximo sea 1 y el mínimo sea cero para lograr esto, y mi opinión es que esto sería una mala idea en general . Los valores máximos o mínimos podrían ser muy fácilmente valores atípicos que no son representativos de la distribución de la población. @osknows comentario de despedida sobre utilizando $z$ -puntos de vista es una idea mucho mejor . $z$ -Las puntuaciones estándar normalizan cada variable utilizando su desviación estándar en lugar de su rango. La desviación estándar está menos influenciada por los valores atípicos. Para utilizar $z$ -es preferible que cada variable tenga una distribución más o menos normal, o al menos una distribución más o menos simétrica (es decir, que no esté muy sesgada), pero si es necesario se puede aplicar alguna transformación de datos primero para conseguirlo; la transformación a utilizar podría determinarse encontrando la que mejor se ajuste Transformación Box-Cox .

11voto

Noam Gal Puntos 155

Cualquier función sigmoidea funcionará:

0 votos

Erf no es una función muy práctica, siempre que no se quiera utilizar más bien por su derivado.

0 votos

Terminé usando una función logística simple con algunos pequeños ajustes: (1 / (1 + java.lang.Math.exp(-1 * (factor * i)) - 0.5) * 2. Elegí un factor de 0,05 que parece funcionar bien para i entre 0 y unos pocos cientos.

0 votos

1,0/(1,0+exp(-1,69897*(x-media(x))/sd(x)) es una aproximación a la pnorm

4voto

Además de las buenas sugerencias de Henrik y Simon Byrne, podrías utilizar f(x) = x/(x+1). A modo de comparación, la función logística exagerará las diferencias a medida que x crezca. Es decir, la diferencia entre f(x) y f(x+1) será mayor con la función logística que con f(x) = x/(x+1). Usted puede o no querer ese efecto.

2voto

user1920468 Puntos 21

Otro enfoque personalizable que puede explorar es simplemente dividir todos los valores por el valor máximo y llevarlo a la potencia de un valor de forma positiva ( $\gamma$ ) que mejor satisfaga sus objetivos de transformación. Véase el ejemplo siguiente en R, en el que la línea discontinua es el caso simple de dividir x por max(x) :

scaled_power_transform <- function(x, gamma=0.25)
{
    ## x must be nonnegative
    stopifnot(all(x >= 0))
    ## scale to [0, 1]
    x_scaled <- x / max(x)
    ## customise the shape
    x_scaled <- x_scaled^gamma
    return(invisible(x_scaled))
}

x <- seq(0, 1000)

plot(x = x,  y = scaled_power_transform(x, gamma = 0.1), col = 'blue',  
     type = 'l', lwd = 2, ylab = 'x transformed')
lines(x, x/max(x), lty = 2)
lines(x = x, y = scaled_power_transform(x, gamma = 0.5), col = 'green', 
      type = 'l', lwd = 2)
lines(x = x, y = scaled_power_transform(x, gamma = 2), col = 'red',   
      type = 'l', lwd = 2)

legend(x = 0.6*max(x), y=0.3, 
       legend = c(expression(paste(gamma,'= 0.1')), 
                  expression(paste(gamma,'= 0.5')), 
                  expression(paste(gamma,'= 2.0'))), 
       pch = rep('*', 3), col = c('blue', 'green', 'red'))

Creado el 2020-10-10 por el paquete reprex (v0.3.0)

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