web-dev-qa-db-fra.com

Quelle est l'erreur de numpy.polyfit?

Je veux utiliser numpy.polyfit pour les calculs physiques, j'ai donc besoin de l'ampleur de l'erreur.

26
varantir

Si vous spécifiez full=True dans votre appel à polyfit , il inclura des informations supplémentaires:

>>> x = np.arange(100)
>>> y = x**2 + 3*x + 5 + np.random.Rand(100)
>>> np.polyfit(x, y, 2)
array([ 0.99995888,  3.00221219,  5.56776641])
>>> np.polyfit(x, y, 2, full=True)
(array([ 0.99995888,  3.00221219,  5.56776641]), # coefficients
 array([ 7.19260721]), # residuals
 3, # rank
 array([ 11.87708199,   3.5299267 ,   0.52876389]), # singular values
 2.2204460492503131e-14) # conditioning threshold

La valeur résiduelle renvoyée est la somme des carrés des erreurs d'ajustement, je ne sais pas si c'est ce que vous recherchez:

>>> np.sum((np.polyval(np.polyfit(x, y, 2), x) - y)**2)
7.1926072073491056

Dans la version 1.7, il existe également un mot clé cov qui renverra la matrice de covariance de vos coefficients, que vous pourriez utiliser pour calculer l'incertitude des coefficients d'ajustement eux-mêmes.

28
Jaime

Comme vous pouvez le voir dans la documentation :

Returns
-------
p : ndarray, shape (M,) or (M, K)
    Polynomial coefficients, highest power first.
    If `y` was 2-D, the coefficients for `k`-th data set are in ``p[:,k]``.

residuals, rank, singular_values, rcond : present only if `full` = True
    Residuals of the least-squares fit, the effective rank of the scaled
    Vandermonde coefficient matrix, its singular values, and the specified
    value of `rcond`. For more details, see `linalg.lstsq`.

Ce qui signifie que si vous pouvez faire un ajustement et obtenir les résidus comme:

 import numpy as np
 x = np.arange(10)
 y = x**2 -3*x + np.random.random(10)

 p, res, _, _, _ = numpy.polyfit(x, y, deg, full=True)

Ensuite, les p sont vos paramètres d'ajustement, et les res seront les résidus, comme décrit ci-dessus. Le _ parce que vous n'avez pas besoin d'enregistrer les trois derniers paramètres, vous pouvez donc simplement les enregistrer dans la variable _ que vous n'utiliserez pas. Ceci est une convention et n'est pas obligatoire.


@ La réponse de Jaime explique ce que signifie le résidu. Une autre chose que vous pouvez faire est de regarder ces écarts au carré comme une fonction (dont la somme est res). Cela est particulièrement utile pour voir une tendance qui ne correspondait pas suffisamment. res peut être important à cause du bruit statistique, ou éventuellement d'un mauvais ajustement systématique, par exemple:

x = np.arange(100)
y = 1000*np.sqrt(x) + x**2 - 10*x + 500*np.random.random(100) - 250

p = np.polyfit(x,y,2) # insufficient degree to include sqrt

yfit = np.polyval(p,x)

figure()
plot(x,y, label='data')
plot(x,yfit, label='fit')
plot(x,yfit-y, label='var')

Donc, dans la figure, notez le mauvais ajustement près de x = 0:
polyfit

20
askewchan