Ho uno spettro di energia da un rivelatore di raggi cosmici. Lo spettro segue una curva esponenziale ma avrà grumi ampi (e forse molto lievi). I dati, ovviamente, contengono un elemento di rumore.Gradiente di dati rumorosi, python
Sto cercando di appianare i dati e quindi tracciare il gradiente. Finora ho usato la funzione scipy per lisciarlo e poi np.gradient().
Come si può vedere dall'immagine, il metodo della funzione gradiente è trovare le differenze tra ogni punto e non mostra i grumi in modo molto chiaro.
Fondamentalmente ho bisogno di un grafico gradiente uniforme. Qualsiasi aiuto sarebbe fantastico!
che ho provato metodi 2 spline:
def smooth_data(y,x,factor):
print "smoothing data by interpolation..."
xnew=np.linspace(min(x),max(x),factor*len(x))
smoothy=spline(x,y,xnew)
return smoothy,xnew
def smooth2_data(y,x,factor):
xnew=np.linspace(min(x),max(x),factor*len(x))
f=interpolate.UnivariateSpline(x,y)
g=interpolate.interp1d(x,y)
return g(xnew),xnew
Edit: Provato differenziazione numerica:
def smooth_data(y,x,factor):
print "smoothing data by interpolation..."
xnew=np.linspace(min(x),max(x),factor*len(x))
smoothy=spline(x,y,xnew)
return smoothy,xnew
def minim(u,f,k):
""""functional to be minimised to find optimum u. f is original, u is approx"""
integral1=abs(np.gradient(u))
part1=simps(integral1)
part2=simps(u)
integral2=abs(part2-f)**2.
part3=simps(integral2)
F=k*part1+part3
return F
def fit(data_x,data_y,denoising,smooth_fac):
smy,xnew=smooth_data(data_y,data_x,smooth_fac)
y0,xnnew=smooth_data(smy,xnew,1./smooth_fac)
y0=list(y0)
data_y=list(data_y)
data_fit=fmin(minim, y0, args=(data_y,denoising), maxiter=1000, maxfun=1000)
return data_fit
Tuttavia, appena ritorna di nuovo nello stesso grafico!
Quale livello di lisciatura avrebbe senso per te? quello che produce una derivata tra circa -10 e +1, con la maggior parte dei valori tra -1 e +1? – EOL
Nota a margine: ti consiglio di leggere e applicare [PEP 8] (http://www.python.org/dev/peps/pep-0008/) al tuo "stile" di codifica. Questo renderà il tuo codice più facile da leggere, come lo segue la maggior parte dei programmatori Python (o una buona parte di esso). Piccoli dettagli come gli abituali spazi attorno a '=' nelle assegnazioni o dopo le virgole negli elenchi di parametri rendono il codice più leggibile. – EOL