Spec-Zone.ru › NumPy 1.21

numpy.ma.polyfit

ma.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, 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,), необязательно

Веса, применяемые к координатам y выборочных точек. Для гауссовых неопределённостей используйте 1/sigma (а не 1/sigma**2).

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

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

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

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

residuals, rank, singular_values, rcond

Присутствуют только если full = True. Residuals — сумма квадратов остатков подгонки наименьших квадратов, эффективный ранг масштабированной матрицы коэффициентов Вандермонда, её сингулярные значения и указанное значение rcond. Подробнее см. linalg.lstsq.

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

Присутствует только если full = False и cov`=True. The covariance matrix of the polynomial coefficient estimates. The diagonal of this matrix are the variance estimates for each coefficient. If y is a 2-D array, then the covariance matrix for the `k-й набор данных находится в V[:,:,k].

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

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

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

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

См. также

polyval

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

linalg.lstsq

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

scipy.interpolate.UnivariateSpline

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

Примечания

Любые значения, замаскированные в x, распространяются на y и наоборот.

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

\[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.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-ma-polyfit-1.png

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

Spec-Zone.ru

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