web-dev-qa-db-fra.com

Numpy: données moyennes nulles et normalisation

J'ai vu dans le didacticiel (il n'y avait aucune explication supplémentaire) que nous pouvons traiter les données à une moyenne nulle avec x -= np.mean(x, axis=0) et normaliser les données avec x /= np.std(x, axis=0). Quelqu'un peut-il élaborer sur ces deux éléments de code, la seule chose que je tire de la documentation est que np.mean calcule la moyenne arithmétique, la moyenne le long d'un axe spécifique et que np.std le fait pour l'écart-type.

7
econ

C'est ce qu'on appelle zscore .

SciPy a un utilitaire pour cela:

>>> from scipy import stats
>>> stats.zscore([ 0.7972,  0.0767,  0.4383,  0.7866,  0.8091,
...                0.1954,  0.6307,  0.6599,  0.1065,  0.0508])
array([ 1.1273, -1.247 , -0.0552,  1.0923,  1.1664, -0.8559,  0.5786,
        0.6748, -1.1488, -1.3324])
6
Jonas Adler

Suivez les commentaires dans le code ci-dessous

import numpy as np

# create x
x = np.asarray([1,2,3,4], dtype=np.float64)

np.mean(x) # calculates the mean of the array x
x-np.mean(x) # this is euivalent to subtracting the mean of x from each value in x
x-=np.mean(x) # the -= means can be read as x = x- np.mean(x)

np.std(x) # this calcualtes the standard deviation of the array
x/=np.std(x) # the /= means can be read as x = x/np.std(x)
4
Clock Slave

Je conclus de la syntaxe donnée que votre tableau est multidimensionnel. Par conséquent, je vais d'abord aborder le cas où votre x est juste un tableau linéaire:

np.mean(x) calculera la moyenne, en diffusant x-np.mean(x), la moyenne de x sera soustraite de toutes les entrées. x -=np.mean(x,axis = 0) est équivalent à x = x-np.mean(x,axis = 0). Similar forx/np.std (x) `.

Dans le cas de tableaux multidimensionnels, la même chose se produit, mais au lieu de calculer la moyenne sur tout le tableau, vous calculez simplement la moyenne sur le premier "axe". L'axe est le mot numpy pour la dimension. Donc, si votre x est en deux dimensions, alors np.mean(x,axis =0) = [np.mean(x[:,0], np.mean(x[:,1])...]. La radiodiffusion assurera à nouveau que cela est fait pour tous les éléments.

Notez que cela ne fonctionne qu'avec la première dimension, sinon les formes ne correspondront pas à la diffusion. Si vous voulez normaliser un autre axe, vous devez faire quelque chose comme:

x -= np.expand_dims(np.mean(x,axis = n),n)
2
Jürg Merlin Spaak

Clé ici sont les opérateurs d'affectation. Ils effectuent en fait certaines opérations sur la variable d'origine . A + = c est en fait égal à a = a + c. 

Donc en effet un (dans votre cas x) doit être défini à l’avance. 

Chaque méthode prend un tableau/iterable (x) en entrée et génère une valeur (ou un tableau si un tableau multidimensionnel a été entré), qui est donc appliquée dans vos opérations d'affectation.
Le paramètre axe signifie que vous appliquez l'opération mean ou std sur les lignes. Par conséquent, vous prenez des valeurs pour chaque ligne dans une colonne donnée et effectuez la moyenne ou std . Axis = 1 prendrait les valeurs de chaque colonne pour une ligne donnée. 

Avec les deux opérations, vous supprimez d’abord la moyenne pour que la moyenne de votre colonne soit désormais centrée sur 0. Ensuite, lorsque vous divisez par std, vous réduisez la dispersion des données autour de ce zéro et vous être dans un intervalle de [-1, +1] autour de 0. 

Alors maintenant, chacune de vos valeurs de colonne est centrée autour de zéro et normalisée.

Il existe d'autres techniques de mise à l'échelle, telles que la suppression de la valeur minimale ou maximale et la division par la plage de valeurs.

1
Ando Jurai