2012-08-06 12 views
7

Sto cercando di adattare alcuni punti dati con incertezze y in python. I dati sono etichettati in python come x, ye yerr. Ho bisogno di fare un adattamento lineare su quei dati nella scala del loglog. Come riferimento, se i risultati di misura sono correttamente, ho confrontare i risultati pitone con quelli di ScidavisCome includere correttamente le incertezze nel montaggio con Python

ho provato curve_fit con

def func(x, a, b): 
    return np.exp(a* np.log(x)+np.log(b)) 

popt, pcov = curve_fit(func, x, y,sigma=yerr) 

nonché kmpfit con

def funcL(p, x): 
    a,b = p 
    return (np.exp(a*np.log(x)+np.log(b))) 

def residualsL(p, data): 
    a,b=p 
    x, y, errorfit = data 
    return (y-funcL(p,x))/errorfit 

a0=1 
b0=0.1 
p0 = [a0,b0] 
fitterL = kmpfit.Fitter(residuals=residualsL, data=(x,y,yerr)) 
fitterL.parinfo = [{}, {}] 
fitterL.fit(params0=p0) 

e quando Sto cercando di adattare i dati con uno di quelli senza incertezze (ad esempio impostando yerr = 1), tutto funziona bene ei risultati sono identici a quelli di scidavis. Ma se imposto le incertezze del file di dati ottengo dei risultati inquietanti. In python ottengo cioè a = 0.86 e in scidavis a = 0.14. Ho letto qualcosa sul fatto che gli errori sono inclusi come pesi. Devo cambiare qualcosa, per calcolare correttamente la vestibilità? O cosa sto sbagliando?

edit: ecco un esempio di un file di dati (x, y, Yerr)

3.942387e-02 1.987800e+00 5.513165e-01 
6.623142e-02 7.126161e+00 1.425232e+00 
9.348280e-02 1.238530e+01 1.536208e+00 
1.353088e-01 1.090471e+01 7.829126e-01 
2.028446e-01 1.023087e+01 3.839575e-01 
3.058446e-01 8.403626e+00 1.756866e-01 
4.584524e-01 7.345275e+00 8.442288e-02 
6.879677e-01 6.128521e+00 3.847194e-02 
1.032592e+00 5.359025e+00 1.837428e-02 
1.549152e+00 5.380514e+00 1.007010e-02 
2.323985e+00 6.404229e+00 6.534108e-03 
3.355974e+00 9.489101e+00 6.342546e-03 
4.384128e+00 1.497998e+01 2.273233e-02 

e il risultato:

in python: 
    without uncertainties: a=0.06216 +/- 0.00650 ; b=8.53594 +/- 1.13985 
    with uncertainties: a=0.86051 +/- 0.01640 ; b=3.38081 +/- 0.22667 
in scidavis: 
    without uncertainties: a = 0.06216 +/- 0.08060; b = 8.53594 +/- 1.06763 
    with uncertainties: a = 0.14154 +/- 0.005731; b = 7.38213 +/- 2.13653 

risposta

3

devo essere equivoco qualcosa. I vostri dati pubblicati non sembra nulla di simile

f(x,a,b) = np.exp(a*np.log(x)+np.log(b)) 

La linea rossa è il risultato di scipy.optimize.curve_fit, la linea verde è il risultato di scidavis.

La mia ipotesi è che né l'algoritmo converge verso un buon adattamento, quindi non sorprende che i risultati non corrispondono.


non riesco a spiegare come scidavis trova i suoi parametri, ma secondo le definizioni quanto ho capito loro, scipy è trovare parametri con più bassi dei minimi quadrati residui di scidavis:

import numpy as np 
import matplotlib.pyplot as plt 
import scipy.optimize as optimize 

def func(x, a, b): 
    return np.exp(a* np.log(x)+np.log(b)) 

def sum_square(residuals): 
    return (residuals**2).sum() 

def residuals(p, x, y, sigma): 
    return 1.0/sigma*(y - func(x, *p)) 

data = np.loadtxt('test.dat').reshape((-1,3)) 
x, y, yerr = np.rollaxis(data, axis = 1) 
sigma = yerr 

popt, pcov = optimize.curve_fit(func, x, y, sigma = sigma, maxfev = 10000) 
print('popt: {p}'.format(p = popt)) 
scidavis = (0.14154, 7.38213) 
print('scidavis: {p}'.format(p = scidavis)) 

print('''\ 
sum of squares for scipy: {sp} 
sum of squares for scidavis: {d} 
'''.format(
      sp = sum_square(residuals(popt, x = x, y = y, sigma = sigma)), 
      d = sum_square(residuals(scidavis, x = x, y = y, sigma = sigma)) 
    )) 

plt.plot(x, y, 'bo', x, func(x,*popt), 'r-', x, func(x, *scidavis), 'g-') 
plt.errorbar(x, y, yerr) 
plt.show() 

rendimenti

popt: [ 0.86051258 3.38081125] 
scidavis: (0.14154, 7.38213) 
sum of squares for scipy: 53249.9915654 
sum of squares for scidavis: 239654.84276 

enter image description here

+0

Grazie per la risposta. Effettivamente cambia un po 'il risultato, ma sfortunatamente è ancora lontano dal risultato di scidavis ... –

+0

Potresti postare alcuni dati e il risultato di scidavis in modo che quelli di noi senza scidavis installati possano sperimentare? – unutbu

+0

vedi la mia modifica sopra. sfortunatamente non riesco ancora ad aggiungere le foto :( –

Problemi correlati