32 votos

"Normalizar" los valores para que sumen 1 pero manteniendo sus pesos

No estoy muy seguro de cómo podría llamarse esta operación, pero tengo algunos números, por ejemplo:

  • 40
  • 10

Necesito formatear estos números para que formen la suma 1, pero deben mantener su "peso".

En este caso concreto:

  • 40 se convertiría en 0,80
  • 10 se convertiría en 0,2

Pero si tengo más valores (como 40, 10, 25, 5 por ejemplo), estoy realmente perdido porque no conozco la fórmula.

Si alguien puede ayudar, podría por favor responder con palabras (por ejemplo: "Suma todos los valores y luego divide por...", y no en una fórmula? La verdad es que no se me da nada bien leer fórmulas.

52voto

Rustyn Puntos 5774

¿Por qué no dividir cada número de la muestra por la suma de todos los números de la muestra?

15voto

Sarthak Mittal Puntos 141

Las respuestas proporcionadas aquí no funcionarán en los casos en que el conjunto contenga números negativos.

La función que buscas se llama función softmax. La función softmax se utiliza a menudo en la capa final de un clasificador basado en una red neuronal. Softmax se define como:

$$f_i(x) = \frac{e^{x_i}}{\sum_j e^{x_j}}$$

14voto

Patrick Woo Puntos 71

Actualmente estoy aprendiendo probabilidad en un curso en línea.

Me está enseñando a utilizar este método asombrosamente sencillo, ¡y hasta ahora ha funcionado a la perfección!

Dónde e es un elemento de la lista de números a normalizar:

Calcula un normalizador (multiplicador) así:

normalizer = 1 / (e1 + e2 + e3)

A continuación, multiplica el normalizador a cada elemento de la lista:

((e1 * normalizer) + (e2 * normalizer) + .... + (en * normalizer) ) == 1.0

...y sumarán 1,0.

Así que tomando tu ejemplo de los números 10 y 40:

normalizer = 1 / (10 + 40) = 0.02
(10 * 0.02) = 0.2
(40 * 0.02) = 0.8
(0.2 + 0.8) = 1.0

De ahí obtenemos nuestro 1,0.

Me he adelantado y he escrito un sencillo script en Python que puedes ejecutar en casi cualquier intérprete de Python y jugar con los parámetros y probar los resultados.

# python script
import random as rnd

# number of items in list, change this to as huge a list as you want
itemsInList = 5 

# specify min and max value bounds for randomly generated values
# change these to play around with different value ranges
minVal = 8
maxVal = 20

# creates a list of random values between minVal and maxVal, and sort them
numList = sorted( [rnd.randint(minVal, maxVal) for x in range(itemsInList)] )
print ('initial list is\n{}\n'.format(numList))

# calculate the normalizer, using: (1 / (sum_of_all_items_in_list))
normalizer = 1 / float( sum(numList) )

# multiply each item by the normalizer
numListNormalized = [x * normalizer for x in numList]
print('Normalized list is\n{}\n'.format(numListNormalized))

print('Sum of all items in numListNormalized is {}'.format(sum(numListNormalized)))

Ejecutando el código se obtiene este ejemplo:

initial list is
[9, 12, 15, 16, 19]

Normalized list is
[0.1267605633802817, 0.16901408450704225, 0.2112676056338028, 0.22535211267605634, 0.26760563380281693]

Sum of all items in numListNormalized is 1.0

Espero que te sirva de ayuda.

11voto

Paul J. Davis Puntos 1086

Por la descripción del texto, parece que esto es lo que quieres:

  • calcular la suma de todos los elementos
  • dividir cada elemento por la suma

Tenga en cuenta que, sin embargo, a continuación, su ejemplo $[40, 10]$ se normaliza como $[0.8, 0.2]$ no $[0.75,0.25]$ . Este último no conserva la proporción de ambos elementos.

1voto

LeOn - Han Li Puntos 121

Mi opinión sobre el problema. En primer lugar, con el fin de deshacerse de los números negativos, restar todos los valores en el vector original $\vec{x}$ por el valor mínimo de la misma: $\vec{u}=\vec{x}-\text{min}(\vec{x})$ . Esto garantizará el valor mínimo en $\vec{u}$ será 0. Entonces, los valores finales "normalizados" entre 0 y 1 vienen dados por $$z_i = \frac{\vec{u}_i}{\sum_{j \in \vec{u}} \vec{u}_{j}}.$$

Edición: como se ha señalado en los comentarios, restando el valor mínimo de $\vec{x}$ a partir de todos los valores de $\vec{x}$ sólo debe hacerse si al menos uno de los valores de $\vec{x}$ es negativo. Después de este paso, la suma de los valores del vector final $\vec{z}$ será 1.

Lo que significa calcular ratios con valores negativos está abierto a interpretación. Quizá sea un comportamiento más parecido al de la función softmax en aprendizaje automático, ya que hace que todos los valores sean positivos y sumen 1.

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