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, shape (M,) -
Координаты x M точек-образцов
(x[i], y[i]). -
yarray_like, shape (M,) or (M, K) -
Координаты y точек-образцов. Несколько наборов точек-образцов с одинаковыми координатами x можно одновременно аппроксимировать, передав двумерный массив, содержащий по одному набору данных в каждом столбце.
-
degint -
Степень аппроксимирующего полинома
-
rcondfloat, optional -
Относительное число обусловленности аппроксимации. Сингулярные значения, меньшие этого значения относительно наибольшего сингулярного значения, будут игнорироваться. Значение по умолчанию — len(x)*eps, где eps — относительная точность типа float, примерно 2e-16 в большинстве случаев.
-
fullbool, optional -
Переключатель, определяющий характер возвращаемого значения. Если False (значение по умолчанию), возвращаются только коэффициенты. Если True, возвращается также диагностическая информация из разложения по сингулярным значениям.
-
warray_like, shape (M,), optional -
Веса, применяемые к координатам y точек-образцов. При гауссовых погрешностях используйте 1/sigma (а не 1/sigma**2).
-
covbool or str, optional -
Если задано и не
False, возвращается не только оценка, но и её ковариационная матрица. По умолчанию ковариации масштабируются на chi2/dof, где dof = M - (deg + 1), т.е., веса предполагаются ненадежными за исключением относительной оценки, и всё масштабируется так, что уменьшенная chi2 равна единице. Это масштабирование пропускается, еслиcov='unscaled', что актуально для случая, когда веса равны 1/sigma**2, и sigma является надёжной оценкой погрешности.
-
- Возвращает
-
-
pndarray, shape (deg + 1,) or (deg + 1, K) -
Коэффициенты полинома, старшая степень вначале. Если
yбыл двумерным, коэффициенты дляk-го набора данных находятся вp[:,k]. - residuals, rank, singular_values, rcond
-
Присутствуют только если
full= True. Residuals — сумма квадратов остатков наименьших квадратов, эффективный ранг масштабированной матрицы коэффициентов Вандермонда, её сингулярные значения и заданное значениеrcond. Более подробная информация приведена вlinalg.lstsq. -
Vndarray, shape (M,M) or (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 и наоборот.
Решение минимизирует среднеквадратичную ошибку
в уравнениях:
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()
© 2005–2021 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/1.20/reference/generated/numpy.ma.polyfit.html