Spec-Zone.ru › NumPy 1.18

numpy.polynomial.polynomial.polyfit

numpy.polynomial.polynomial.polyfit(x, y, deg, rcond=None, full=False, w=None) [source]

Нахождение наилучшей полиномиальной аппроксимации методом наименьших квадратов.

Возвращает коэффициенты полинома степени deg , который является наилучшей аппроксимацией методом наименьших квадратов для значений данных y в точках x. Если y является одномерным, возвращаемые коэффициенты также будут одномерными. Если y является двумерным, выполняются несколько подгонок, по одной для каждого столбца y, и полученные коэффициенты сохраняются в соответствующих столбцах двумерного результата. Аппроксимируемый полином(ы) имеют вид

p(x) = c_0 + c_1 * x + ... + c_n * x^n,

где n есть deg.

Параметры
xarray_like, shape (M,)

Координаты x выборочных (данных) точек M (x[i], y[i]).

yarray_like, shape (M,) or (M, K)

Координаты y выборочных точек. Несколько наборов выборочных точек, имеющих одинаковые координаты x, могут быть (независимо) аппроксимированы с помощью вызова polyfit путем передачи для y двумерного массива, который содержит один набор данных в каждом столбце.

degint or 1-D array_like

Степень(и) аппроксимирующих полиномов. Если deg — это единственное целое число, в аппроксимацию включаются все члены вплоть до и включая deg-й член. Для версий NumPy >= 1.11.0 вместо этого можно использовать список целых чисел, определяющих степени членов, которые нужно включить.

rcondfloat, optional

Относительное число обусловленности аппроксимации. Сингулярные значения, меньшие rcond, относительно наибольшего сингулярного значения, будут игнорироваться. Значение по умолчанию равно len(x)*eps, где eps — относительная точность плавающей точки платформы, примерно 2e-16 в большинстве случаев.

fullbool, optional

Переключатель, определяющий характер возвращаемого значения. При значении False (по умолчанию) возвращаются только коэффициенты; при значении True, вместе с коэффициентами возвращается диагностическая информация из разложения по сингулярным значениям (используется для решения матричного уравнения подгонки).

warray_like, shape (M,), optional

Веса. Если не равно None, вклад каждой точки (x[i],y[i]) в аппроксимацию взвешен значением w[i]. В идеале веса выбираются таким образом, чтобы ошибки произведений w[i]*y[i] имели одинаковую дисперсию. Значение по умолчанию равно None.

Новая в версии 1.5.0.

Возвращает
coefndarray, shape (deg + 1,) or (deg + 1, K)

Коэффициенты полинома в порядке возрастания степеней. Если y было двумерным, коэффициенты в столбце k из coef представляют собой полиномиальную аппроксимацию данных в y-ом столбце.

[residuals, rank, singular_values, rcond]list

Эти значения возвращаются только если full = True

resid – сумма квадратов остатков наилучшей аппроксимации методом наименьших квадратов rank – числовой ранг масштабированной матрицы Вандермонда sv – сингулярные значения масштабированной матрицы Вандермонда rcond – значение rcond.

Для получения более подробной информации см. linalg.lstsq.

Возбуждает
RankWarning

Возбуждается, если матрица в наилучшей аппроксимации методом наименьших квадратов имеет недостаточный ранг. Предупреждение возбуждается только если full == False. Предупреждения можно отключить следующим образом:

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

См. также

chebfit, legfit, lagfit, hermfit, hermefit

polyval

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

polyvander

Матрица Вандермонда для степеней.

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), будет возбуждено предупреждение RankWarning. Это означает, что значения коэффициентов могут быть плохо определены. Аппроксимация по полиному более низкой степени, как правило, устраняет предупреждение (но может не быть тем, что вам нужно; если у вас есть причины для выбора степени, которая не работает, вам, возможно, придется: а) пересмотреть эти причины и/или б) пересмотреть качество ваших данных). Параметр rcond также можно установить на значение, меньшее, чем по умолчанию, но полученная аппроксимация может быть некорректной и иметь большие вклады от погрешности округления.

Полиномиальные аппроксимации с двойной точностью, как правило, «выходят из строя» примерно на степени 20. Аппроксимации с помощью рядов Чебышева или Лежандра, как правило, лучше обусловлены, но многое все еще может зависеть от распределения выборочных точек и гладкости данных. Если качество аппроксимации недостаточно, сплайны могут быть хорошей альтернативой.

Примеры

>>> np.random.seed(123)
>>> from numpy.polynomial import polynomial as P
>>> x = np.linspace(-1,1,51) # x "data": [-1, -0.96, ..., 0.96, 1]
>>> y = x**3 - x + np.random.randn(len(x)) # x^3 - x + N(0,1) "noise"
>>> c, stats = P.polyfit(x,y,3,full=True)
>>> np.random.seed(123)
>>> c # c[0], c[2] should be approx. 0, c[1] approx. -1, c[3] approx. 1
array([ 0.01909725, -1.30598256, -0.00577963,  1.02644286]) # may vary
>>> stats # note the large SSR, explaining the rather poor results
 [array([ 38.06116253]), 4, array([ 1.38446749,  1.32119158,  0.50443316, # may vary
          0.28853036]), 1.1324274851176597e-014]

То же самое без добавления шума

>>> y = x**3 - x
>>> c, stats = P.polyfit(x,y,3,full=True)
>>> c # c[0], c[2] should be "very close to 0", c[1] ~= -1, c[3] ~= 1
array([-6.36925336e-18, -1.00000000e+00, -4.08053781e-16,  1.00000000e+00])
>>> stats # note the minuscule SSR
[array([  7.46346754e-31]), 4, array([ 1.38446749,  1.32119158, # may vary
           0.50443316,  0.28853036]), 1.1324274851176597e-014]

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

Spec-Zone.ru

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