2015-06-30 4 views
6

ho visto questo modello nel codice di qualcuno:Il chiamare random.normal su un array di valori aggiunge rumore?

import numpy as np 
# Create array 
xx = np.linspace(0.0, 100.0, num=100) 
# Add Noise 
xx = np.random.normal(xx) 

e sembra aggiungere un po 'di rumore a ogni valore della matrice, ma non riesco a trovare alcuna documentazione per questo. Cosa sta succedendo? Cosa determina le proprietà (cioè il ridimensionamento) del rumore? Il valore indicato viene considerato come media (ovvero il parametro loc) di ciascun campionamento dalla distribuzione normal?

Sarei anche molto curioso di sapere perché questo comportamento non sembra essere coperto nella documentazione.

+0

Funziona anche per il parametro di scala, ad esempio np.random.normal (loc = np.zeros ((4,4)), scale = np.array (intervallo (1,17)). Reshape ((4, 4))) – Felix

risposta

8

Non lo vedo nemmeno documentato, ma molte funzioni di numpy che richiedono un narray saranno operate on it element-wise. In ogni caso, si può facilmente verificare che quando si passa un array è chiamata numpy.random.normal per ogni elemento della matrice utilizzando valore di tale elemento come media e restituisce un array:

In [9]: xx = numpy.array([1, 10, 100, 1000]) 

In [10]: numpy.random.normal(xx) 
Out[10]: 
array([ 9.45865328e-01, 1.11542264e+01, 9.88601302e+01, 
     1.00120448e+03]) 

Sembra che esso utilizza il valore predefinito 1.0 per la scala. È possibile ignorare questo, però:

In [12]: numpy.random.normal(xx, 10) 
Out[12]: array([ 8.92500743, -5.66508088, 97.33440273, 1003.37940455]) 

In [13]: numpy.random.normal(xx, 100) 
Out[13]: array([ -75.13092966, -47.0841671 , 154.12913986, 816.3126146 ]) 
1

Come supplemento alle osservazioni e l'esempio di cui sopra, la documentazione è lì nel mio attuazione NumPy.
in forma abbreviata, con grandi tagli:

help(np.random.normal) 
    normal(loc=0.0, scale=1.0, size=None)  
    Draw random samples from a normal (Gaussian) distribution. 
    Parameters 
    ---------- 
    loc : float Mean ("centre") of the distribution. 
    scale : float Standard deviation (spread or "width") of the 
        distribution. 
    size : tuple of ints, Output shape. 
      If the given shape is, e.g., ``(m, n, k)``, then 
      ``m * n * k`` samples are drawn. 

Se si desidera produrre un certo numero di valori di dati con una forma particolare, centrato su un mezzo con una deviazione standard specificato, è possibile effettuare le seguenti operazioni.

>>> x = 10 
>>> vals = np.random.normal(x,3.,(10,)) 
>>> vals 
array([ 10.6999745 , 9.58139692, 14.04490407, 9.54797132, 
     10.18378835, 11.42772729, 5.22100578, 9.51757533, 
     12.95314676, 13.77068901]) 

che genera un array di 10 valori, la forma (10), con una media di 10 e valori sviluppa entro +/- 3 deviazioni std. Vengono forniti anche la funzione di distribuzione effettiva, i riferimenti e un esempio di codice matplotlib. Sto usando np.version.version '1.8.0'.

Questa è una funzione utile se si desidera produrre campioni di punti (X, Y) centrati su un valore medio con uno spread noto.