numpy.polynomial.polynomial.polyfit#
- polynomial.polynomial.polyfit(x, y, deg, rcond=None, полный=False, w=None)[источник]#
Аппроксимация полинома методом наименьших квадратов.
Возвращает коэффициенты полинома степени deg который является наименьшим квадратичным приближением к значениям данных y заданные в точках x. Если y является одномерным, возвращаемые коэффициенты также будут одномерными. Если y является двумерным, выполняется несколько подгонок, одна для каждого столбца y, и полученные коэффициенты сохраняются в соответствующих столбцах возвращаемого 2-D массива. Подобранные полином(ы) имеют вид
\[p(x) = c_0 + c_1 * x + ... + c_n * x^n,\]где n является deg.
- Параметры:
- xarray_like, форма (M,)
x-координаты M точки выборки (данных)
(x[i], y[i]).- yarray_like, форма (M,) или (M, K)
y-координаты точек выборки. Несколько наборов точек выборки, имеющих одинаковые x-координаты, могут быть (независимо) подогнаны одним вызовом
polyfitпередавая в для y двумерный массив, содержащий один набор данных в каждом столбце.- degцелое число или 1-D array_like
Степень(и) аппроксимирующих полиномов. Если deg является единственным целым числом все члены до и включая deg-й член включены в подгонку. Для версий NumPy >= 1.11.0 вместо этого может использоваться список целых чисел, указывающих степени членов для включения.
- rcondfloat, опционально
Относительное число обусловленности подгонки. Сингулярные значения меньше чем rcond, относительно наибольшего сингулярного значения, будет проигнорировано. Значение по умолчанию:
len(x)*eps, где eps является относительной точностью типа float платформы, примерно 2e-16 в большинстве случаев.- полныйbool, необязательно
Переключатель, определяющий характер возвращаемого значения. Когда
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.
- Возвращает:
- coefndarray, форма (deg + 1,) или (deg + 1, K)
Коэффициенты полинома упорядочены от низких к высоким. Если y был двумерным, коэффициенты в столбце k of coef представляют полиномиальную аппроксимацию данных в y’s k-й столбец.
- [остатки, ранг, сингулярные значения, rcond]list
Эти значения возвращаются только если
full == Trueостатки – сумма квадратов остатков подгонки методом наименьших квадратов
ранг – числовой ранг масштабированной матрицы Вандермонда
singular_values – сингулярные значения масштабированной матрицы Вандермонда
rcond – значение rcond.
Для более подробной информации см.
numpy.linalg.lstsq.
- Вызывает:
- RankWarning
Возникает, если матрица в методе наименьших квадратов вырождена. Предупреждение выводится только если
full == False. Предупреждения могут быть отключены с помощью:>>> import warnings >>> warnings.simplefilter('ignore', np.exceptions.RankWarning)
Смотрите также
numpy.polynomial.chebyshev.chebfitnumpy.polynomial.legendre.legfitnumpy.polynomial.laguerre.lagfitnumpy.polynomial.hermite.hermfitnumpy.polynomial.hermite_e.hermefitpolyvalВычисляет полином.
polyvanderМатрица Вандермонда для степеней.
numpy.linalg.lstsqВычисляет аппроксимацию методом наименьших квадратов по матрице.
scipy.interpolate.UnivariateSplineВычисляет сплайн-аппроксимации.
Примечания
Решение — это коэффициенты полинома p который минимизирует сумму взвешенных квадратов ошибок
\[E = \sum_j w_j^2 * |y_j - p(x_j)|^2,\]где \(w_j\) являются весами. Эта проблема решается путем настройки (обычно) переопределенной матричной системы уравнений:
\[V(x) * c = w * y,\]где V является взвешенной псевдо матрицей Вандермонда x, c являются коэффициентами, которые нужно решить, w являются весами, и y являются наблюдаемыми значениями. Это уравнение затем решается с использованием сингулярного разложения V.
Если некоторые из сингулярных значений V настолько малы, что ими пренебрегают (и
full==False), aRankWarningбудет вызвано. Это означает, что значения коэффициентов могут быть плохо определены. Подгонка к полиному меньшей степени обычно устраняет предупреждение (но может быть не тем, что вы хотите, конечно; если у вас есть независимые причины для выбора степени, которая не работает, вам, возможно, придется: а) пересмотреть эти причины и/или б) пересмотреть качество ваших данных). rcond параметр также может быть установлен на значение меньше его значения по умолчанию, но полученная модель может быть ложной и иметь большие вклады от ошибок округления.Полиномиальные аппроксимации с двойной точностью обычно «неудачны» примерно на степени 20. Аппроксимации с использованием рядов Чебышёва или Лежандра обычно лучше обусловлены, но многое всё ещё зависит от распределения точек выборки и гладкости данных. Если качество аппроксимации недостаточно, сплайны могут быть хорошей альтернативой.
Примеры
>>> import numpy as np >>> from numpy.polynomial import polynomial as P >>> x = np.linspace(-1,1,51) # x "data": [-1, -0.96, ..., 0.96, 1] >>> rng = np.random.default_rng() >>> err = rng.normal(size=len(x)) >>> y = x**3 - x + err # x^3 - x + Gaussian noise >>> c, stats = P.polyfit(x,y,3,full=True) >>> c # c[0], c[1] approx. -1, c[2] should be approx. 0, c[3] approx. 1 array([ 0.23111996, -1.02785049, -0.2241444 , 1.08405657]) # may vary >>> stats # note the large SSR, explaining the rather poor results [array([48.312088]), # may vary 4, array([1.38446749, 1.32119158, 0.50443316, 0.28853036]), 1.1324274851176597e-14]
То же самое без добавленного шума
>>> y = x**3 - x >>> c, stats = P.polyfit(x,y,3,full=True) >>> c # c[0], c[1] ~= -1, c[2] should be "very close to 0", c[3] ~= 1 array([-6.73496154e-17, -1.00000000e+00, 0.00000000e+00, 1.00000000e+00]) >>> stats # note the minuscule SSR [array([8.79579319e-31]), np.int32(4), array([1.38446749, 1.32119158, 0.50443316, 0.28853036]), 1.1324274851176597e-14]