numpy.polyfit
-
numpy.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, минимизирующих среднеквадратичную ошибку.Параметры: x : array_like, форма (M,)
Координаты x M выборочных точек
(x[i], y[i]).y : array_like, форма (M,) или (M, K)
Координаты y выборочных точек. Несколько наборов выборочных точек с одинаковыми координатами x могут быть аппроксимированы одновременно, передавая двумерный массив, содержащий один набор данных на столбец.
deg : int
Степень аппроксимирующего полинома
rcond : float, необязательно
Относительное число обусловленности аппроксимации. Сингулярные значения, меньшие этого значения по отношению к наибольшему сингулярному значению, будут проигнорированы. Значение по умолчанию равно len(x)*eps, где eps - относительная точность типа float, примерно 2e-16 в большинстве случаев.
full : bool, необязательно
Переключатель, определяющий характер возвращаемого значения. При значении False (по умолчанию) возвращаются только коэффициенты, а при True - также диагностическая информация из разложения по сингулярным значениям.
w : array_like, форма (M,), необязательно
Веса, применяемые к координатам y выборочных точек. Для гауссовых неопределённостей используйте 1/sigma (а не 1/sigma**2).
cov : bool, необязательно
Возвратить оценку и ковариационную матрицу оценки. Если full = True, то cov не возвращается.
Возвращает: p : ndarray, форма (M,) или (M, K)
Коэффициенты полинома, старшая степень первой. Если
yбыл 2-мерным, коэффициенты дляk-го набора данных находятся вp[:,k].residuals, rank, singular_values, rcond :
Присутствуют только если
full= True. Остатки наименьших квадратов, эффективный ранг матрицы коэффициентов расширенной матрицы Вандермонда, её сингулярные значения и заданное значениеrcond. Для получения дополнительной информации см.linalg.lstsq.V : ndarray, форма (M,M) или (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[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также можно установить на значение, меньшее его значения по умолчанию, но полученная аппроксимация может быть ложной: включение вкладов от малых сингулярных значений может добавить в результат численный шум.Обратите внимание, что подгонка полиномиальных коэффициентов изначально плохо обусловлена, когда степень полинома велика или интервал выборочных точек плохо центрирован. В этих случаях следует всегда проверять качество аппроксимации. Когда полиномиальные аппроксимации неудовлетворительны, сплайны могут быть хорошей альтернативой.
Ссылки
[R58] Википедия, «Аппроксимация кривых», http://ru.wikipedia.org/wiki/Аппроксимация_кривых [R59] Википедия, «Полиномическая интерполяция», http://ru.wikipedia.org/wiki/Полиномиальная_интерполяция Примеры
>>> 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()
(Исходный код, png, pdf)
© 2008–2016 NumPy Developers
Licensed under the NumPy License.
https://docs.scipy.org/doc/numpy-1.11.0/reference/generated/numpy.polyfit.html