Spec-Zone.ru › NumPy 2.0

numpy.polyfit

numpy.polyfit(x, y, deg, rcond=None, full=False, w=None, cov=False)[source]

Наименьшие квадраты полиномиальной подгонки.

Примечание

Эта часть относится к старому API полиномов. С версии 1.4 предпочтительнее использовать новый API полиномов, определённый в numpy.polynomial. Сводка отличий приведена в руководстве по переходу.

Построение полинома p(x) = p[0] * x**deg + ... + p[deg] степени deg к точкам (x, y). Возвращает вектор коэффициентов p, который минимизирует среднеквадратическую ошибку в порядке deg-1, … 0.

Для новых кодов рекомендуется использовать метод класса Polynomial.fit, так как он более стабилен с точки зрения вычислений. Дополнительная информация приведена в документации метода.

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

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

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

Координаты y точек выборки. Несколько наборов точек выборки, имеющих одинаковые координаты x, могут быть подгонены сразу путём передачи двумерного массива, содержащего один набор данных на столбец.

degint

Степень подгоняемого полинома

rcondfloat, необязательно

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

fullbool, необязательно

Переключатель, определяющий характер возвращаемого значения. При значении 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.

covbool или str, необязательно

Если задано и не False, возвращается не только оценка, но и её ковариационная матрица. По умолчанию ковариации масштабируются на chi2/dof, где dof = M - (deg + 1), то есть предполагается, что веса ненадежны только в относительном смысле, и всё масштабируется таким образом, чтобы уменьшенная chi2 равнялась единице. Этот масштабирование опущено, если cov='unscaled', как это актуально для случая, когда веса w = 1/sigma, причём sigma является надёжной оценкой неопределённости.

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

Коэффициенты полинома, старшая степень впереди. Если y было двумерным, коэффициенты для k-го набора данных находятся в p[:,k].

residuals, rank, singular_values, rcond

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

  • residuals — сумма квадратов остатков подгонки наименьших квадратов
  • rank — эффективный ранг отмасштабированной матрицы Вандермонда

    матрицы коэффициентов

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

    матрицы коэффициентов

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

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

Vndarray, форма (deg + 1, deg + 1) или (deg + 1, deg + 1, K)

Присутствует только если full == False и cov == True. Ковариационная матрица оценок коэффициентов полинома. Диагональ этой матрицы — оценки дисперсий для каждого коэффициента. Если y является двумерным массивом, ковариационная матрица для k-го набора данных находятся в V[:,:,k]

Предупреждения:
RankWarning

Ранг матрицы коэффициентов в подгонке наименьших квадратов недостаточный. Предупреждение выводится только если full == False.

Предупреждения можно отключить, используя

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

См. также

polyval

Вычисление значений полинома.

linalg.lstsq

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

scipy.interpolate.UnivariateSpline

Вычисление подгонки сплайнов.

Примечания

Решение минимизирует среднеквадратичную ошибку

\[E = \sum_{j=0}^k |p(x_j) - y_j|^2\]

в уравнениях:

x[0]**n * p[0] + ... + x[0] * p[n-1] + p[n] = y[0]
x[1]**n * p[0] + ... + x[1] * p[n-1] + p[n] = y[1]
...
x[k]**n * p[0] + ... + x[k] * p[n-1] + p[n] = y[k]

Матрица коэффициентов коэффициентов p — это матрица Вандермонда.

polyfit выводит RankWarning, когда подгонка наименьших квадратов плохо обусловлена. Это означает, что оптимальная подгонка не определена из-за численной ошибки. Результаты могут быть улучшены путём понижения степени полинома или заменой x на x - x.mean(). Параметр rcond также можно установить на значение меньше его значения по умолчанию, но полученная подгонка может быть ложной: включение вклада от малых сингулярных значений может добавить шума в результат.

Обратите внимание, что подгонка коэффициентов полинома в принципе плохо обусловлена, когда степень полинома велика или интервал точек выборки плохо центрирован. В этих случаях всегда следует проверять качество подгонки. Когда полиномиальные подгонки неудовлетворительны, сплайны могут быть хорошей альтернативой.

Ссылки

[1]

Википедия, «Подгонка кривых», https://en.wikipedia.org/wiki/Curve_fitting

[2]

Википедия, «Полиномическая интерполяция», https://en.wikipedia.org/wiki/Polynomial_interpolation

Примеры

>>> import warnings
>>> x = np.array([0.0, 1.0, 2.0, 3.0,  4.0,  5.0])
>>> y = np.array([0.0, 0.8, 0.9, 0.1, -0.8, -1.0])
>>> z = np.polyfit(x, y, 3)
>>> z
array([ 0.08703704, -0.81349206,  1.69312169, -0.03968254]) # may vary

Удобно использовать объекты poly1d для работы с полиномами:

>>> p = np.poly1d(z)
>>> p(0.5)
0.6143849206349179 # may vary
>>> p(3.5)
-0.34732142857143039 # may vary
>>> p(10)
22.579365079365115 # may vary

Полиномы высокой степени могут сильно колебаться:

>>> with warnings.catch_warnings():
...     warnings.simplefilter('ignore', np.exceptions.RankWarning)
...     p30 = np.poly1d(np.polyfit(x, y, 30))
...
>>> p30(4)
-0.80000000000000204 # may vary
>>> p30(5)
-0.99999999999999445 # may vary
>>> p30(4.5)
-0.10547061179440398 # may vary

Иллюстрация:

>>> import matplotlib.pyplot as plt
>>> xp = np.linspace(-2, 6, 100)
>>> _ = plt.plot(x, y, '.', xp, p(xp), '-', xp, p30(xp), '--')
>>> plt.ylim(-2,2)
(-2, 2)
>>> plt.show()
../../_images/numpy-polyfit-1.png

© 2005–2024 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/2.0/reference/generated/numpy.polyfit.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API