Какая ошибка numpy.polyfit?
Я хочу использовать numpy.polyfit
для физических вычислений, поэтому мне нужна величина ошибки.
Ответы
Ответ 1
Если вы укажете full=True
в своем обращении к polyfit
, он будет содержать дополнительную информацию:
>>> 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
Возвращаемое остаточное значение представляет собой сумму квадратов ошибок соответствия, не уверен, что это вы после:
>>> np.sum((np.polyval(np.polyfit(x, y, 2), x) - y)**2)
7.1926072073491056
В версии 1.7 есть также ключевое слово cov
, которое вернет матрицу ковариации для ваших коэффициентов, которую вы могли бы использовать для вычисления неопределенности самих коэффициентов соответствия.
Ответ 2
Как вы можете видеть в документации:
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`.
Это означает, что если вы можете поместиться и получить остатки как:
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)
Затем p
- ваши подходящие параметры, а res
будут остатками, как описано выше. _
- это потому, что вам не нужно сохранять последние три параметра, поэтому вы можете просто сохранить их в переменной _
, которую вы не будете использовать. Это соглашение и не требуется.
@Jaime ответ объясняет, что такое остаточные средства. Другая вещь, которую вы можете сделать, - это посмотреть на квадратные отклонения как функцию (сумма которой равна res
). Это особенно полезно для того, чтобы увидеть тенденцию, которая не соответствовала достаточно. res
может быть большим из-за статистического шума или, возможно, систематического плохого подбора, например:
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')
Итак, на рисунке обратите внимание на плохую посадку рядом с x = 0
:
![polyfit]()