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()
© 2005–2024 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/2.0/reference/generated/numpy.ma.polyfit.html