89 votos

¿Cómo normalizar los datos entre -1 y 1?

He visto la fórmula de normalización min-max pero esta normaliza los valores entre 0 y 1. ¿Cómo puedo normalizar mis datos entre -1 y 1? Tengo tanto valores negativos como positivos en mi matriz de datos.

1 votos

Si estás trabajando en R, consulta este hilo para ver algunas opciones. En particular, un comentario en la respuesta aceptada tiene esta función donde se configura 'newMax' a 1 y 'newMin' a -1 y se ejecuta la función en tus datos.

0 votos

Puede encontrar la referencia en Wikipedia de la siguiente manera: en.wikipedia.org/wiki/Normalization_(statistics)

0 votos

Ejemplo de Javascript, tomado de aquí. function convertRange( valor, r1, r2 ) { return ( valor - r1[ 0 ] ) * ( r2[ 1 ] - r2[ 0 ] ) / ( r1[ 1 ] - r1[ 0 ] ) + r2[ 0 ]; } convertRange( 328.17, [ 300.77, 559.22 ], [ 1, 10 ] ); >>> 1.9541497388276272

193voto

James Puntos 1294

Con: $$ x' = \frac{x - \min{x}}{\max{x} - \min{x}} $$ normalizas tu característica $x$ en $[0,1]$.

Para normalizar en $[-1,1]$ puedes usar:

$$ x'' = 2\frac{x - \min{x}}{\max{x} - \min{x}} - 1 $$

En general, siempre puedes obtener una nueva variable $x'''$ en $[a,b]$:

$$ x''' = (b-a)\frac{x - \min{x}}{\max{x} - \min{x}} + a $$

Y en caso de que quieras devolver una variable a su valor original puedes hacerlo porque estas son transformaciones lineales y por lo tanto invertibles. Por ejemplo:

$$ x = (x''' - a)\frac{(\max{x} - \min{x})}{b-a} + \min{x} $$

Un ejemplo en Python:

import numpy as np
x = np.array([1, 3, 4, 5, -1, -7])
# meta: rango [0, 1]
x1 = (x - min(x)) / (max(x) - min(x))
print(x1)
>>> [0.66666667 0.83333333 0.91666667 1. 0.5 0.]

Un ejemplo en JavaScript:

// meta: rango [0, 1]
const array = [1,3,4,5,-1,-7];
const minX = Math.min(...array);
const maxX = Math.max(...array);
const normalizedArray = array.map(x => (x-minX) / (maxX-minX));
console.log(normalizedArray);

16 votos

Honestamente, no tengo citas para esto. Es simplemente una transformación lineal de una variable aleatoria. Echa un vistazo al efecto de las transformaciones lineales en el soporte de una variable aleatoria.

0 votos

¿Tienes mejores métodos para hacer esto?

0 votos

@GoingMyWay ¿mejor desde qué punto de vista?

-3voto

BadCash Puntos 138

Probé con datos generados aleatoriamente, y

\begin{equation} X_{out} = (b-a)\frac{X_{in} - \min{X_{in}}}{\max{X_{in}} - \min{X_{in}}} + a \end{equation}

no conserva la forma de la distribución. Realmente me gustaría ver la derivación adecuada de esto usando funciones de variables aleatorias.

El enfoque que sí conservó la forma para mí fue usando:

\begin{equation} X_{out} = \frac{X_{in} - \mu_{in}}{\sigma_{in}} \cdot \sigma_{out} + \mu_{out} \end{equation}

donde

\begin{equation} \sigma_{out} = \frac{b-a}{6} \end{equation}

(Admito que usar 6 es un poco sucio) y

\begin{equation} \mu_{out} = \frac{b+a}{2} \end{equation}

y

$a$ y $b$ son el rango deseado; entonces según la pregunta original serían $a=-1$ y $b=1$.

Llegué a este resultado con este razonamiento

\begin{equation} Z_{out} = Z_{in} \end{equation}

\begin{equation} \frac{X_{out} - \mu_{out}}{\sigma_{out}} = \frac{X_{in} - \mu_{in}}{\sigma_{in}} \end{equation}

3 votos

¿Estás seguro de que esto garantiza que los datos transformados estarán dentro de los límites? En R, prueba: set.seed(1); scale(rnorm(1000))*.333. Obtengo un máximo de 1.230871. Tu método parece ser solo un ajuste en la estandarización de datos, en lugar de normalizarlos como se solicitó. Ten en cuenta que la pregunta no pide un método que preserve la forma de la distribución (lo cual sería un requisito extraño para normalización).

3 votos

No estoy seguro de cómo la transformación original podría fallar en preservar la forma de los datos. Es equivalente a restar una constante y luego dividir por una constante, que es lo que hace tu propuesta, y que no cambia la forma de los datos. Tu propuesta asume que todos los datos caen dentro de tres desviaciones estándar de la media, lo cual puede ser algo razonable con muestras pequeñas, aproximadamente distribuidas de manera normal, pero no con muestras grandes o no normales.

1 votos

@Noah No es equivalente restar y dividir por constantes, porque el mínimo y el máximo de los datos son variables aleatorias. De hecho, para la mayoría de las distribuciones subyacentes son bastante variables - más variables que el resto de los datos - por lo tanto, usarlos para cualquier forma de estandarización generalmente no es una buena idea. En esta respuesta no está claro qué significan $a$ y $b o cómo podrían estar relacionados con los datos.

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