Spec-Zone.ru › NumPy 2.0

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

Веса. Если не 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 была 2-мерной, коэффициенты для 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

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

Примечания

Любые значения mask в 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.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-ma-polyfit-1.png

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

Spec-Zone.ru

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