Какая ошибка 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