numpy.polynomial.polynomial.polyfit#

polynomial.polynomial.polyfit(x, y, deg, rcond=None, полный=False, w=None)[источник]#

Аппроксимация полинома методом наименьших квадратов.

Возвращает коэффициенты полинома степени deg который является наименьшим квадратичным приближением к значениям данных y заданные в точках x. Если y является одномерным, возвращаемые коэффициенты также будут одномерными. Если y является двумерным, выполняется несколько подгонок, одна для каждого столбца y, и полученные коэффициенты сохраняются в соответствующих столбцах возвращаемого 2-D массива. Подобранные полином(ы) имеют вид

\[p(x) = c_0 + c_1 * x + ... + c_n * x^n,\]

где n является deg.

Параметры:
xarray_like, форма (M,)

x-координаты M точки выборки (данных) (x[i], y[i]).

yarray_like, форма (M,) или (M, K)

y-координаты точек выборки. Несколько наборов точек выборки, имеющих одинаковые x-координаты, могут быть (независимо) подогнаны одним вызовом polyfit передавая в для y двумерный массив, содержащий один набор данных в каждом столбце.

degцелое число или 1-D array_like

Степень(и) аппроксимирующих полиномов. Если deg является единственным целым числом все члены до и включая deg-й член включены в подгонку. Для версий NumPy >= 1.11.0 вместо этого может использоваться список целых чисел, указывающих степени членов для включения.

rcondfloat, опционально

Относительное число обусловленности подгонки. Сингулярные значения меньше чем rcond, относительно наибольшего сингулярного значения, будет проигнорировано. Значение по умолчанию: len(x)*eps, где eps является относительной точностью типа float платформы, примерно 2e-16 в большинстве случаев.

полныйbool, необязательно

Переключатель, определяющий характер возвращаемого значения. Когда False (по умолчанию) возвращаются только коэффициенты; когда True, диагностическая информация из сингулярного разложения (используемого для решения матричного уравнения подгонки) также возвращается.

warray_like, форма (M,), необязательный

Веса. Если не None, вес w[i] применяется к не возведённому в квадрат остатку y[i] - y_hat[i] в x[i]. В идеале веса выбираются так, чтобы ошибки произведений w[i]*y[i] все имеют одинаковую дисперсию. При использовании взвешивания по обратной дисперсии используйте w[i] = 1/sigma(y[i]). Значение по умолчанию — None.

Возвращает:
coefndarray, форма (deg + 1,) или (deg + 1, K)

Коэффициенты полинома упорядочены от низких к высоким. Если y был двумерным, коэффициенты в столбце k of coef представляют полиномиальную аппроксимацию данных в y’s k-й столбец.

[остатки, ранг, сингулярные значения, rcond]list

Эти значения возвращаются только если full == True

  • остатки – сумма квадратов остатков подгонки методом наименьших квадратов

  • ранг – числовой ранг масштабированной матрицы Вандермонда

  • singular_values – сингулярные значения масштабированной матрицы Вандермонда

  • rcond – значение rcond.

Для более подробной информации см. numpy.linalg.lstsq.

Вызывает:
RankWarning

Возникает, если матрица в методе наименьших квадратов вырождена. Предупреждение выводится только если full == False. Предупреждения могут быть отключены с помощью:

>>> import warnings
>>> warnings.simplefilter('ignore', np.exceptions.RankWarning)

Смотрите также

numpy.polynomial.chebyshev.chebfit
numpy.polynomial.legendre.legfit
numpy.polynomial.laguerre.lagfit
numpy.polynomial.hermite.hermfit
numpy.polynomial.hermite_e.hermefit
polyval

Вычисляет полином.

polyvander

Матрица Вандермонда для степеней.

numpy.linalg.lstsq

Вычисляет аппроксимацию методом наименьших квадратов по матрице.

scipy.interpolate.UnivariateSpline

Вычисляет сплайн-аппроксимации.

Примечания

Решение — это коэффициенты полинома p который минимизирует сумму взвешенных квадратов ошибок

\[E = \sum_j w_j^2 * |y_j - p(x_j)|^2,\]

где \(w_j\) являются весами. Эта проблема решается путем настройки (обычно) переопределенной матричной системы уравнений:

\[V(x) * c = w * y,\]

где V является взвешенной псевдо матрицей Вандермонда x, c являются коэффициентами, которые нужно решить, w являются весами, и y являются наблюдаемыми значениями. Это уравнение затем решается с использованием сингулярного разложения V.

Если некоторые из сингулярных значений V настолько малы, что ими пренебрегают (и full == False), a RankWarning будет вызвано. Это означает, что значения коэффициентов могут быть плохо определены. Подгонка к полиному меньшей степени обычно устраняет предупреждение (но может быть не тем, что вы хотите, конечно; если у вас есть независимые причины для выбора степени, которая не работает, вам, возможно, придется: а) пересмотреть эти причины и/или б) пересмотреть качество ваших данных). rcond параметр также может быть установлен на значение меньше его значения по умолчанию, но полученная модель может быть ложной и иметь большие вклады от ошибок округления.

Полиномиальные аппроксимации с двойной точностью обычно «неудачны» примерно на степени 20. Аппроксимации с использованием рядов Чебышёва или Лежандра обычно лучше обусловлены, но многое всё ещё зависит от распределения точек выборки и гладкости данных. Если качество аппроксимации недостаточно, сплайны могут быть хорошей альтернативой.

Примеры

>>> import numpy as np
>>> from numpy.polynomial import polynomial as P
>>> x = np.linspace(-1,1,51)  # x "data": [-1, -0.96, ..., 0.96, 1]
>>> rng = np.random.default_rng()
>>> err = rng.normal(size=len(x))
>>> y = x**3 - x + err  # x^3 - x + Gaussian noise
>>> c, stats = P.polyfit(x,y,3,full=True)
>>> c # c[0], c[1] approx. -1, c[2] should be approx. 0, c[3] approx. 1
array([ 0.23111996, -1.02785049, -0.2241444 ,  1.08405657]) # may vary
>>> stats # note the large SSR, explaining the rather poor results
[array([48.312088]),                                        # may vary
 4,
 array([1.38446749, 1.32119158, 0.50443316, 0.28853036]),
 1.1324274851176597e-14]

То же самое без добавленного шума

>>> y = x**3 - x
>>> c, stats = P.polyfit(x,y,3,full=True)
>>> c # c[0], c[1] ~= -1, c[2] should be "very close to 0", c[3] ~= 1
array([-6.73496154e-17, -1.00000000e+00,  0.00000000e+00,  1.00000000e+00])
>>> stats # note the minuscule SSR
[array([8.79579319e-31]),
 np.int32(4),
 array([1.38446749, 1.32119158, 0.50443316, 0.28853036]),
 1.1324274851176597e-14]