1 votos

¿Cómo normalizar e invertir un vector para que sume 1?

Entiendo cómo funciona la normalización. Sumas los valores individuales del vector, divides cada valor por la suma, y voilá... suman 1.

¿Por qué no funciona cuando los restas de 1? Si todos los valores suman 1 después de la normalización, entonces los ratios no deberían funcionar así (1 - X_1).sum() == 1 ?

¿Qué estoy haciendo mal? Básicamente quiero que los valores más pequeños tengan un mayor peso al final. Donde un valor de 0.0 sería 100% (es decir, 1,0).

# Python 3 with NumPy
X = np.array([[ 58.50853002,  74.73077551,  54.46120887,  55.55526553],
              [ 68.14133201,  22.2475803 ,  88.79126866,  86.24927424],
              [ 43.86150599,  75.99344646,  81.90051932,  50.66885662],
              [ 74.81149378,  82.86920509,  36.75953127,  58.42956957]])

# Get 2nd row
X_1 = X[1,:]
# array([ 68.14133201,  22.2475803 ,  88.79126866,  86.24927424])

# Get ratios for row
ratios = X_1/X_1.sum()
#array([ 0.25672106,  0.0838173 ,  0.33451927,  0.32494236])

# Sum to 1
ratios.sum()
# 1.0

# Shouldn't this work? 
(1 - ratios)
# array([ 0.74327894,  0.9161827 ,  0.66548073,  0.67505764])

# But it doesn't...
(1 - ratios).sum()
#3.0

0 votos

No programo, así que no puedo discutir tu código. Pero cuando normalizas un vector, normalmente sumas los cuadrados, sacas la raíz cuadrada. Y dividir por esta norma.

1voto

Gudmundur Orn Puntos 853

No hay ninguna razón para esperar 1 - ratios para dar lugar a un vector donde la suma de los elementos es $1$ .

En particular, si se tiene la matriz inicial $[a,b,c,d]$ con $a + b + c + d = 1$ entonces $1 - [a,b,c,d] = [1-a, 1-b, 1-c, 1-d]$ (donde uso la igualdad en el sentido de numpy). Cuando sumas estos elementos, obtienes $1-a + 1-b + 1-c + 1-d = 4 - (a + b + c + d) = 4 - 1 = 3$ .

Así que siempre obtendrá $(\text{dimension of vector} - 1)$ después de esta operación.

0 votos

Terminé haciendo. (1/X_1) / sum(1/X_1) así que los valores más pequeños tienen un peso mayor al final y todos suman 1. ¿Tiene sentido hacerlo así?

0 votos

No estoy seguro de lo que intentas hacer. Si lo intentas, tendrás que manejar la división por cero de alguna manera.

0 votos

¡buena idea! puedo añadir un pseudo recuento como + 0.000001

1voto

mvw Puntos 13437

Permítame intentar entender lo que está haciendo:

Se suman los valores individuales del vector, se divide cada valor por la suma, y voilá... suman 1.

Primero la suma: $$ S(x) = \sum_i x_i $$ A continuación, la normalización descrita: $$ x' = x / S(x) $$ Así que $$ S(x') = \sum_i x_i' = \sum_i \frac{x_i}{S(x)} = \frac{1}{S(x)} \sum_i x_i = \frac{1}{S(x)} S(x) = 1 $$ Bien, el vector normalizado $x'$ tiene suma unitaria. (Cuidado: si $S(x)$ era cero, te vas a llevar una sorpresa)

¿Por qué no funciona al restarlos a 1? Si todos los valores suman 1 después de la normalización, ¿entonces no deberían funcionar los cocientes de manera que (1 - X_1).sum() == 1?

Bien, si tenemos el nuevo vector $y$ con $$ y_i = 1 - x_i' $$ entonces obtenemos $$ S(y_i) = \sum_i y_i = \sum_i (1-x_i') = \left( \sum_i 1 \right) - \left( \sum_i x_i' \right) = n - S(x') = n - 1 $$ Así que, a menos que $n=2$ (dos componentes en el vector), esto no devolvería un vector $y$ con la suma $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