Normalización de [0,5-1] a [0 - 1]


Estoy atrapado aquí, supongo que es un desafío para la mente. Si tengo números en el rango entre 0.5 a 1 ¿cómo puedo normalizarlo para que esté entre 0 a 1?

Gracias por cualquier ayuda, tal vez soy un poco lento ya que he estado trabajando durante las últimas 24 horas seguidas O_O

Author: tweetypi, 2009-09-24

6 answers

Otros te han proporcionado la fórmula, pero no el trabajo. Así es como abordas un problema como este. Usted puede encontrar esto mucho más valioso que solo conocer la respuesta.

Para mapear [0.5, 1] a [0, 1] buscaremos un mapa lineal de la forma x -> ax + b. Requeriremos que los puntos finales se asignen a los puntos finales y que se conserve el orden.

Método uno: El requisito de que los extremos se asignan a las estaciones y que se mantiene el orden implica que 0.5 se asigna a 0 y 1 se asigna a 1

a * (0.5) + b = 0 (1)
a * 1 + b = 1     (2)

Este es un sistema simultáneo de ecuaciones lineales y se puede resolver multiplicando la ecuación (1) por -2 y agregando la ecuación (1) a la ecuación (2). Al hacer esto obtenemos b = -1 y sustituyendo esto de nuevo en la ecuación (2) obtenemos que a = 2. Así el mapa x -> 2x - 1 hará el truco.

Método dos: La pendiente de una recta que pasa por dos puntos (x1, y1) y (x2, y2) es

(y2 - y1) / (x2 - x1).

Aquí vamos a utilizar los puntos (0.5, 0) y (1, 1) para cumplir con el requisito de que los puntos finales se asignen a los puntos finales y que el mapa conserve el orden. Por lo tanto, la pendiente es

m = (1 - 0) / (1 - 0.5) = 1 / 0.5 = 2.

Tenemos que (1, 1) es un punto en la recta y por lo tanto por la forma punto-pendiente de una ecuación de una recta tenemos que

y - 1 = 2 * (x - 1) = 2x - 2

De modo que

y = 2x - 1.

Una vez más vemos que x -> 2x - 1 es un mapa que hará el truco.

 64
Author: jason,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-01 17:32:57

Restar 0.5 (que le da un nuevo rango de 0 - 0.5) y luego multiplicar por 2.

double normalize( double x )
{
    // I'll leave range validation up to you
    return (x - 0.5) * 2;
}
 31
Author: Bill the Lizard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-24 12:36:47

Para añadir otra respuesta genérica.

Si desea mapear el rango lineal [A..B] a [C..D], puede aplicar los siguientes pasos:

Cambia el rango para que el límite inferior sea 0. (subracta A desde ambos límites:

[A..B] -> [0..B-A]

Escala el rango de modo que sea [0..1]. (dividir por el límite superior):

[0..B-A] -> [0..1]

Escala el rango de modo que tenga la longitud del nuevo rango que es D-C. (multiplicar por D-C):

[0..1] ->  [0..D-C]

Cambie el rango para que el límite inferior sea C. (agregue C a la límites):

[0..D-C] -> [C..D]

Combinando esto con una sola fórmula, obtenemos:

       (D-C)*(X-A)
X' =   -----------  + C
          (B-A)

En tu caso, A=0.5, B=1, C=0, D=1 obtienes:

       (X-0.5)
X' =   ------- = 2X-1
        (0.5)

Nota, si tiene que convertir una gran cantidad de X a X', puede cambiar la fórmula a:

       (D-C)         C*B - A*D
X' =   ----- * X  +  ---------  
       (B-A)           (B-A)

También es interesante echar un vistazo a los rangos no lineales. Puede seguir los mismos pasos, pero necesita un paso adicional para transformar el rango lineal en un rango no lineal.

 24
Author: Toon Krijthe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-25 13:23:20

× 2 - 1

Debería hacer el truco

 15
Author: Glenner003,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-24 12:31:27

Lazyweb respuesta: Para convertir un valor x de [minimum..maximum] a [floor..ceil]:

Caso general:

normalized_x = ((ceil - floor) * (x - minimum))/(maximum - minimum) + floor

Para normalizar a [0..255]:

normalized_x = (255 * (x - minimum))/(maximum - minimum)

Para normalizar a [0..1]:

normalized_x = (x - minimum)/(maximum - minimum)
 14
Author: meetar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-10 17:41:14

Siempre puedes usar clamp o saturar dentro de tus matemáticas para asegurarte de que tu valor final esté entre 0-1. Algunos saturan al final, pero he visto que se hace durante un cálculo, también.

 0
Author: Whitney Imura,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-13 23:03:50