Spec-Zone.ru › NumPy 1.16

numpy.ma.polyfit

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

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

Найти полином p(x) = p[0] * x**deg + ... + p[deg] степени deg по точкам (x, y). Возвращает вектор коэффициентов p, минимизирующий среднеквадратическую ошибку в порядке deg, deg-1, … 0.

Метод класса Polynomial.fit рекомендуется для нового кода, так как он более устойчив численно. Для получения дополнительной информации см. документацию метода.

Параметры:
x : array_like, shape (M,)

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

y : array_like, shape (M,) or (M, K)

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

deg : int

Степень подгоняемого полинома

rcond : float, optional

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

full : bool, optional

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

w : array_like, shape (M,), optional

Веса, применяемые к координатам y точек выборки. Для гауссовых погрешностей используйте 1/sigma (а не 1/sigma**2).

cov : bool or str, optional

Если задано и не False, возвращает не только оценку, но и ее ковариационную матрицу. По умолчанию ковариации масштабируются на chi2/sqrt(N-dof), т.е., предполагается, что веса ненадежны за исключением относительного смысла, и все масштабируется таким образом, что приведенная chi2 равна единице. Этот масштабирование опускается, если cov='unscaled', что важно для случая, когда веса равны 1/sigma**2, а sigma — надежная оценка погрешности.

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

Коэффициенты полинома, старшая степень впереди. Если y был двумерным, коэффициенты для k-го набора данных находятся в p[:,k].

residuals, rank, singular_values, rcond

Присутствуют только если full = True. Остатки наименьших квадратов, эффективный ранг матрицы коэффициентов Вандермонда, ее сингулярные значения и заданное значение rcond. Для получения более подробной информации см. linalg.lstsq.

V : ndarray, 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-th набор данных находятся в V[:,:,k]

Предупреждения:
RankWarning

Ранг матрицы коэффициентов в аппроксимации наименьших квадратов недостаточный. Предупреждение поднимается только если full = False.

Предупреждения можно отключить, используя

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

См. также

polyval
Вычисление значений полинома.
linalg.lstsq
Вычисляет аппроксимацию наименьших квадратов.
scipy.interpolate.UnivariateSpline
Вычисляет сплайновые аппроксимации.

Примечания

Любые значения, замаскированные в 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://ru.wikipedia.org/wiki/%D0%90%D0%BF%D0%BF%D1%80%D0%BE%D1%85%D1%81%D0%B8%D0%BC%D0%B0%D1%86%D0%B8%D1%8F_%D0%BA%D1%80%D0%B8%D0%B2%D1%8B%D1%85
[2] Википедия, «Полиномическая интерполяция», https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%BE%D0%BC%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%BF%D0%BE%D0%BB%D1%8F%D1%86%D0%B8%D1%8F

Примеры

>>> 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])

Для работы с полиномами удобно использовать объекты poly1d:

>>> p = np.poly1d(z)
>>> p(0.5)
0.6143849206349179
>>> p(3.5)
-0.34732142857143039
>>> p(10)
22.579365079365115

Полиномы высокой степени могут колебаться очень сильно:

>>> p30 = np.poly1d(np.polyfit(x, y, 30))
/... RankWarning: Polyfit may be poorly conditioned...
>>> p30(4)
-0.80000000000000204
>>> p30(5)
-0.99999999999999445
>>> p30(4.5)
-0.10547061179440398

Иллюстрация:

>>> 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–2019 NumPy Developers
Licensed under the 3-clause BSD License.
https://docs.scipy.org/doc/numpy-1.16.1/reference/generated/numpy.ma.polyfit.html

Spec-Zone.ru

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