make_lsq_spline#
- scipy.interpolate.make_lsq_spline(x, y, t, k=3, w=None, ось=0, check_finite=True, *, метод='qr')[источник]#
Создать сглаживающий B-сплайн, удовлетворяющий критерию наименьших квадратов (LSQ).
Результат представляет собой линейную комбинацию
\[S(x) = \sum_j c_j B_j(x; t)\]базисных элементов B-сплайна, \(B_j(x; t)\), который минимизирует
\[\sum_{j} \left( w_j \times (S(x_j) - y_j) \right)^2\]- Параметры:
- xarray_like, shape (m,)
Абсциссы.
- yarray_like, shape (m, …)
Ординаты.
- tarray_like, форма (n + k + 1,).
Узлы. Узлы и точки данных должны удовлетворять условиям Шёнберга-Уитни.
- kint, необязательный
Степень B-сплайна. По умолчанию кубическая,
k = 3.- warray_like, shape (m,), optional
Веса для сплайн-аппроксимации. Должны быть положительными. Если
None, тогда все веса равны. По умолчаниюNone.- осьint, необязательный
Ось интерполяции. По умолчанию равна нулю.
- check_finitebool, необязательно
Проверять ли, что входные массивы содержат только конечные числа. Отключение может повысить производительность, но может привести к проблемам (сбоям, незавершению), если входные данные содержат бесконечности или NaN. По умолчанию True.
- методstr, optional
Метод решения линейной задачи наименьших квадратов. Допустимые значения: "norm-eq" (явное построение и решение нормальной системы уравнений) и "qr" (использование QR-факторизации матрицы плана). По умолчанию "qr".
- Возвращает:
Смотрите также
BSplineбазовый класс, представляющий объекты B-сплайнов
make_interp_splineаналогичная фабричная функция для интерполяционных сплайнов
LSQUnivariateSplineпроцедура подгонки сплайна на основе FITPACK
splrepподпрограмма подгонки на основе FITPACK
Примечания
Количество точек данных должно быть больше степени сплайна
k.Узлы
tдолжны удовлетворять условиям Шёнберга-Уитни, т.е. должно существовать подмножество точек данныхx[j]такой, чтоt[j] < x[j] < t[j+k+1], дляj=0, 1,...,n-k-2.Примеры
Сгенерировать некоторые зашумленные данные:
>>> import numpy as np >>> import matplotlib.pyplot as plt >>> rng = np.random.default_rng() >>> x = np.linspace(-3, 3, 50) >>> y = np.exp(-x**2) + 0.1 * rng.standard_normal(50)
Теперь подгоним сглаживающий кубический сплайн с предопределёнными внутренними узлами. Здесь мы делаем вектор узлов (k+1)-регулярным, добавляя граничные узлы:
>>> from scipy.interpolate import make_lsq_spline, BSpline >>> t = [-1, 0, 1] >>> k = 3 >>> t = np.r_[(x[0],)*(k+1), ... t, ... (x[-1],)*(k+1)] >>> spl = make_lsq_spline(x, y, t, k)
Для сравнения мы также построим интерполяционный сплайн для того же набора данных:
>>> from scipy.interpolate import make_interp_spline >>> spl_i = make_interp_spline(x, y)
Построить оба графика:
>>> xs = np.linspace(-3, 3, 100) >>> plt.plot(x, y, 'ro', ms=5) >>> plt.plot(xs, spl(xs), 'g-', lw=3, label='LSQ spline') >>> plt.plot(xs, spl_i(xs), 'b-', lw=3, alpha=0.7, label='interp spline') >>> plt.legend(loc='best') >>> plt.show()
обработка NaN: Если входные массивы содержат
nanзначения, результат не полезен, поскольку базовые процедуры подгонки сплайнов не могут работать сnan. Обходным решением является использование нулевых весов для точек данных, не являющихся числами:>>> y[8] = np.nan >>> w = np.isnan(y) >>> y[w] = 0. >>> tck = make_lsq_spline(x, y, t, w=~w)
Обратите внимание на необходимость замены
nanчисловым значением (точное значение не имеет значения, пока соответствующий вес равен нулю.)