Je veux utiliser numpy.polyfit
pour les calculs physiques, j'ai donc besoin de l'ampleur de l'erreur.
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.
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
: