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.

1voto

Paul G Puntos 1615

Hay dos formas de ponerlo en práctica que yo utilizo habitualmente. Siempre trabajo con datos en tiempo real, así que esto supone una entrada continua. Aquí hay algo de pseudo-código:

Utilizando un minmax entrenable:

define function peak:
    // keeps the highest value it has received

define function trough:
    // keeps the lowest value it has received

define function calibrate:
    // toggles whether peak() and trough() are receiving values or not

define function scale:
    // maps input range [trough.value() to peak.value()] to [0.0 to 1.0]

Esta función requiere que se realice una fase de entrenamiento inicial (mediante calibrate() ) o que vuelva a entrenar a determinados intervalos o según determinadas condiciones. Por ejemplo, imagina una función como ésta:

define function outBounds (val, thresh):
    if val > (thresh*peak.value()) || val < (trough.value() / thresh):
        calibrate()

El pico y la depresión normalmente no son valores de recepción, pero si outBounds() recibe un valor que es más de 1,5 veces el pico actual o menos que el valle actual dividido por 1,5, entonces calibrate() que permite que la función se recalibre automáticamente.

Utilizando un mínimo histórico:

var arrayLength = 1000
var histArray[arrayLength]

define historyArray(f):
    histArray.pushFront(f) //adds f to the beginning of the array

define max(array):
    // finds maximum element in histArray[]
    return max

define min(array):
    // finds minimum element in histArray[]
    return min

define function scale:
    // maps input range [min(histArray) to max(histArray)] to [0.0 to 1.0]

main()
historyArray(histArray)
scale(min(histArray), max(histArray), histArray[0])
// histArray[0] is the current element

0 votos

Todo esto se puede implementar en Max/MSP/Jitter con los objetos [peak] y [trough] para el primer ejemplo y con [jit.3m] para el segundo.

1voto

Mi post anterior tiene un método para clasificar entre 0 y 1. Asesoramiento sobre la correlación de entrada del clasificador

Sin embargo, la clasificación que he utilizado, Tmín/Tmáx utiliza el mínimo/máximo de la muestra, pero es posible que el mínimo/máximo de la población le resulte más apropiado. También busque las puntuaciones z

1voto

Chris Puntos 116

Para añadir a las otras respuestas que sugieren pnormas...

Para un método potencialmente óptimo de selección de parámetros sugiero esta aproximación para pnorm.

1.0/(1.0+exp(-1.69897*(x-mean(x))/sd(x)))

pnormish

Esto es esencialmente la Normalización Softmax.

Referencia Pnorm en un apuro

0voto

JasonDavis Puntos 2126

Una opción muy sencilla es dividir cada número de los datos por el número mayor de los mismos. Si tienes muchos números pequeños y unos pocos muy grandes, puede que esto no transmita bien la información. Pero es relativamente fácil; si crees que se pierde información significativa al graficar los datos de esta manera, podrías probar una de las técnicas más sofisticadas que otros han sugerido.

0voto

Hay una fórmula sencilla para la normalización en $[0,1]$ :

$$ x' = \begin{cases} \frac{1}{ 1 + 1 / x } & \text{if } x > 0\\ 0 & \text{else} \end{cases} $$

$$\lim_{x\rightarrow0} x' = 0$$

$$\lim_{x\rightarrow\infty} x' = 1$$

$$\lim_{x\rightarrow1} x' = 0.5$$

¿Existe un nombre para esta función?

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