2017-09-11 2 views
0

Je suis confus par deux méthodes par lesquelles un réseau est normalisé et doivent somme totale à 1,0:deux méthodes pour normaliser tableau à la somme totale de 1,0

Array pour être normalisée:

array([ 1.17091033, 1.13843561, 1.240346 , 1.05438719, 1.05386014, 
     1.15475574, 1.16127814, 1.07070739, 0.93670444, 1.20450255, 
     1.25644135]) 

Méthode 1:

arr = np.array(values/min(values)) 
array([ 1.25003179, 1.21536267, 1.32415941, 1.12563488, 1.12507221, 
     1.23278559, 1.23974873, 1.14305788, 1.00000000, 1.28589392, 
     1.34134236]) 

arr1 = arr/sum(arr) # Sum total to 1.0 
array([ 0.09410701, 0.09149699, 0.09968761, 0.08474195, 0.08469959, 
     0.09280865, 0.09333286, 0.08605362, 0.07528369, 0.09680684, 
     0.1009812 ]) 

Méthode 2:

arr = np.array((values - min(values))/(max(values) - min(values))) 
array([ 0.73249564, 0.63092863, 0.94966065, 0.3680612, 0.3664128 , 
     0.68197101, 0.70237028, 0.41910379, 0.0000000, 0.83755771, 
     1.00000000]) 

arr2 = arr/sum(arr) # Sum total to 1.0 
array([ 0.10951467, 0.09432949, 0.14198279, 0.05502845, 0.054782 , 
     0.10196079, 0.10501066, 0.06265978, 0.00000000, 0.12522239, 
     0.14950897]) 

Quelle est la méthode correcte? Et pourquoi?

+2

Le 'arr/sum (arr)' est la normalisation (et il est le bon) . Les deux autres sont des "scalings" et celui que vous devriez utiliser dépend du contexte. – MSeifert

+1

L'appel de 'sum' sur un tableau est généralement une mauvaise idée; vous devriez utiliser 'np.sum' à la place, ce qui est plus rapide et gère mieux les tableaux multidimensionnels. – user2357112

+0

Merci @ user2357112 – artDeco

Répondre

2

Les deux méthodes modifient values dans un tableau dont la somme est 1, mais elles le font différemment.

1ère méthode: mise à l'échelle ne

La première étape de la méthode 1 du tableau des échelles de sorte que la valeur minimale devient 1. Cette étape n'est pas nécessaire et ne fonctionnera pas si values a un élément 0.

>>> import numpy as np 
>>> values = np.array([2, 4, 6, 8]) 
>>> arr1 = values/values.min() 
>>> arr1 
array([ 1., 2., 3., 4.]) 

La seconde étape du procédé 1 à l'échelle la matrice de telle sorte que sa somme devient 1. Ce faisant, il écrase tout changement effectué par la première étape. Vous n'avez pas besoin arr1:

>>> arr1/arr1.sum() 
array([ 0.1, 0.2, 0.3, 0.4]) 
>>> values/values.sum() 
array([ 0.1, 0.2, 0.3, 0.4]) 

2ème méthode: offset + mise à l'échelle

La première étape de la méthode 2 décalages et échelles du tableau de sorte que le minimum devient 0 et le maximum devient 1:

>>> arr2 = (values - values.min())/(values.max() - values.min()) 
>>> arr2 
array([ 0.  , 0.33333333, 0.66666667, 1.  ]) 

La deuxième étape de la méthode 2 met à l'échelle le tableau de sorte que la somme devienne 1. Le décalage de l'étape 1 est toujours appliqué, mais la mise à l'échelle de l'étape 1 est écrasée. Notez que l'élément minimum est 0:

>>> arr2/arr2.sum() 
array([ 0.  , 0.16666667, 0.33333333, 0.5  ]) 

Vous pouvez obtenir ce résultat directement à partir values avec:

>>> (values - values.min())/(values - values.min()).sum() 
array([ 0.  , 0.16666667, 0.33333333, 0.5  ]) 
+0

Merci @Eric Duminil pour votre explication détaillée qui est le plus utile en effet. Je vérifie pour comprendre comment les méthodes devraient être appliquées pour le résultat requis. Apprécier ton aide :) – artDeco