Quiero representar una variable como un número entre 0 y 1. La variable es un número entero no negativo sin límite inherente. Asigno 0 a 0, pero ¿qué puedo asignar a 1 o números entre 0 y 1?
Podría usar el historial de esa variable para proporcionar los límites. Esto significaría que tengo que reformular las estadísticas antiguas si el máximo aumenta. ¿Tengo que hacer esto o hay otros trucos que debería saber?
normalization
Russell Gallop
fuente
fuente
Respuestas:
Un truco muy común para hacerlo (por ejemplo, en el modelado conexionista) es usar la tangente hiperbólica tanh como la "función de aplastamiento". Se ajusta automáticamente a todos los números en el intervalo entre -1 y 1. Lo que en su caso restringe el rango de 0 a 1. En
r
ymatlab
lo obtienes a través detanh()
.Otra función de aplastamiento es la función logística (gracias a Simon por el nombre), proporcionada por , que restringe el rango de 0 a 1 (con 0 asignado a .5). Por lo tanto, tendría que multiplicar el resultado por 2 y restar 1 para ajustar sus datos en el intervalo entre 0 y 1.f(x)=1/(1+e−x)
Aquí hay un código R simple que traza ambas funciones (tanh en rojo, logística en azul) para que pueda ver cómo ambos aplastan:
fuente
Como siempre, mi primera pregunta iba a ser " por qué quieres hacer esto", luego vi que ya respondiste esto en los comentarios a la pregunta: " Estoy midiendo contenido en muchas dimensiones diferentes y quiero ser capaz de hacer comparaciones en términos de cuán relevante es un determinado contenido. Además, quiero mostrar valores a través de estas dimensiones que sean explicables y fáciles de entender " .
No hay ninguna razón para normalizar los datos para que el máximo sea 1 y el mínimo sea cero para lograr esto, y mi opinión es que esta sería una mala idea en general . Los valores máximos o mínimos podrían fácilmente ser valores atípicos que no representan la distribución de la población. La observación de despedida de @osknows sobre el uso de -scoresz es una idea mucho mejor . puntajes z (también conocidos como puntajes estándar) normalizan cada variable usando su desviación estándar en lugar de su rango. La desviación estándar está menos influenciada por los valores atípicos. Para usar zz z -puntos, 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, no sea muy sesgada), pero si es necesario, puede aplicar primero una transformación de datos adecuada para lograr esto; qué transformación usar podría determinarse encontrando la mejor transformación de Box-Cox .
fuente
mad()
función. Y si uno está preocupado por la asimetría, puede usar los rangos de los datos en lugar de las observaciones originales. En R, esto seríarank()
, pero si uno va a usar esto en nuevos datos,ecdf()
sería una mejor alternativa (ecdf(x)
devuelve una nueva función que básicamente da el valor al p -quantile deCualquier función sigmoidea funcionará:
fuente
Además de las buenas sugerencias de Henrik y Simon Byrne, puede usar 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). Puede o no querer ese efecto.
fuente
Mi publicación anterior tiene un método para clasificar entre 0 y 1. Consejos sobre la correlación de entrada del clasificador
Sin embargo, en la clasificación que he usado, Tmin / Tmax usa la muestra min / max, pero es posible que la población min / max sea más apropiada. También busque puntajes z
fuente
Para agregar a las otras respuestas que sugieren pnorm ...
Para un método potencialmente óptimo para seleccionar parámetros, sugiero esta aproximación para pnorm.
Esto es esencialmente la normalización de Softmax.
Pnorm de referencia en una pizca
fuente
Hay dos formas de implementar esto que uso comúnmente. Siempre estoy trabajando con datos en tiempo real, por lo que esto supone una entrada continua. Aquí hay un pseudocódigo:
Usando un minmax entrenable:
Esta función requiere que realices una fase de entrenamiento inicial (mediante el uso
calibrate()
) o que vuelvas a entrenar a ciertos intervalos o de acuerdo con ciertas condiciones. Por ejemplo, imagine una función como esta:Usando un mínimo histórico:
fuente
Una opción muy simple es dividir cada número en sus datos por el número más grande en sus datos. Si tiene muchos números pequeños y algunos muy grandes, esto podría no transmitir bien la información. Pero es relativamente fácil; Si cree que se pierde información significativa cuando grafica los datos de esta manera, puede probar una de las técnicas más sofisticadas que otros han sugerido.
fuente