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

36

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

covfefe
fuente
1
Si está trabajando en R, vea este hilo para algunas opciones. En particular, un comentario sobre la respuesta aceptada tiene esta función en la que establece 'newMax' en 1 y 'newMin' en -1 y ejecuta la función en sus datos
mtreg
Puede encontrar referencias en Wikipedia de la siguiente manera: en.wikipedia.org/wiki/Normalization_(statistics)
salem
Ejemplo de Javascript, tomado de aquí . función 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
Giuseppe Canale
1
@covfefe si todavía estás cerca, es posible que quieras aceptar una de las respuestas
Simone

Respuestas:

97

Con:

x=xminxmaxxminx
usted normaliza su función x en [0,1] .

Para normalizar en [1,1] puede usar:

x=2xminxmaxxminx1

En general, siempre puede obtener una nueva variable x en [a,b] :

x=(ba)xminxmaxxminx+a
Simone
fuente
15
Honestamente, no tengo citas para esto. Es solo una transformación lineal de una variable aleatoria. Eche un vistazo al efecto de las transformaciones lineales en el soporte de una variable aleatoria.
Simone
-1

Probé en datos generados al azar, y

Xout=(ba)XinminXinmaxXinminXin+a

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

El enfoque que preservó la forma para mí fue usar:

Xout=Xinμinσinσout+μout

dónde

σout=ba6

(Admito que usar 6 es un poco sucio ) y

μout=b+a2

y

a y es el intervalo deseado; así como por pregunta original sería y .ba=1b=1

Llegué al resultado de este razonamiento

Zout=Zin

Xoutμoutσout=Xinμinσin

AL Verminburger
fuente
3
¿Estás seguro de que esto garantiza que los datos transformados se encuentren dentro de los límites? En R, probar: set.seed(1); scale(rnorm(1000))*.333. Tengo un máximo de 1.230871. Su método parece ser solo un ajuste en la estandarización de datos, en lugar de normalizarlos según lo solicitado. Tenga en cuenta que la pregunta no solicita un método que conserve la forma de la distribución (lo que sería un requisito extraño para la normalización).
gung - Restablece a Monica
3
No estoy seguro de cómo la transformación original podría fallar al preservar la forma de los datos. Es equivalente a restar una constante y luego dividirla por una constante, que es lo que hace su propuesta y que no cambia la forma de los datos. Su propuesta supone que todos los datos se encuentran dentro de tres desviaciones estándar de la media, que puede ser algo razonable con muestras pequeñas, distribuidas aproximadamente de manera normal, pero no con muestras grandes o no normales.
Noah
1
@Noah No es equivalente a 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 que no es una buena idea usarlas para cualquier forma de estandarización. En esta respuesta no está claro lo que y media o la forma en que podrían estar relacionados con los datos. ab
whuber
2
@whuber verdadero, pero quise decir que en un conjunto de datos dado (es decir, tratar los datos como fijos), son constantes, de la misma manera que la media de muestra y la desviación estándar de la muestra funcionan como constantes al estandarizar un conjunto de datos. Mi impresión fue que OP quería normalizar un conjunto de datos, no una distribución.
Noah
@Noah, tuve la misma impresión, pero creo que la publicación actual puede estar respondiendo a una interpretación diferente.
whuber