Вопрос или проблема
Фон
Продолжение Интерполяция сплайнами – почему куб с производной второго порядка,
следуя Кубическая интерполяция сплайнами на YouTube. Пример из YouTube приведен ниже.
Реализовано с использованием scipy.interpolate.splrep и попыткой понять, что представляют собой возвращаемые значения функции splrep.
Учитывая набор точек данных (x[i], y[i]), определить гладкое приближение сплайна степени k на интервале xb <= x <= xe.
Возвращает
tck : кортеж
Кортеж
(t, c, k), содержащий вектор узлов, коэффициенты B-сплайна и степень сплайна.
import numpy as np
from pylab import plt, mpl
plt.style.use('seaborn')
mpl.rcParams['font.family'] = 'serif'
%matplotlib inline
def create_plot(x, y, styles, labels, axlabels):
plt.figure(figsize=(10, 6))
for i in range(len(x)):
plt.plot(x[i], y[i], styles[i], label=labels[i])
plt.xlabel(axlabels[0])
plt.ylabel(axlabels[1])
plt.legend(loc=0)
x = np.array([3.0, 4.5, 7.0, 9.0])
y = np.array([2.5, 1.0, 2.5, 0.5])
create_plot([x], [y], ['b'], ['y'], ['x', 'y'])
import scipy.interpolate as spi
interpolation = spi.splrep(x, y, k=3)
IX = np.linspace(3, 9, 100)
IY = spi.splev(IX, interpolation)
create_plot(
[x, IX],
[y, IY],
['b', 'ro'],
['x', 'IY:интерполяция'],
['x', 'y']
)
Вопросы
Как интерпретировать и понять возвращаемые значения и какие ресурсы использовать для понимания?
Кортеж (t, c, k), содержащий вектор узлов, коэффициенты B-сплайна и степень сплайна.
Возвращаемое значение о узлах
interpolation[0]
array([3., 3., 3., 3., 9., 9., 9., 9.])
Я думал, что первый элемент кортежа будет узлами, которые должны быть x, но нет. Что это за значения 3., 3. … ?
Возвращаемые значения о коэффициентах B-сплайна
interpolation[1]
array([ 2.5 , -2.21111111, 6.18888889, 0.5 , 0. , 0. , 0. , 0. ])
Пожалуйста, помогите или предложите, куда мне обратиться и что нужно понять о “коэффициентах B-сплайна”, чтобы интерпретировать эти значения?
Решение для первого интервала (0.186566, 1.6667, 0.24689), поэтому я думал, что эти значения будут во втором элементе, но нет. Как решение связано с возвращаемыми значениями?
t (узлы) — это точки, в которых соединяются разные части B-сплайна.
c — это веса базисных функций B-сплайна, поскольку интерполированная кривая является взвешенной суммой базисных функций.
B-сплайн, который интерполирует между данными (x, y), имеет это уравнение:
с базисными функциями, определяемыми рекурсией на разных интервалах:
Ответ или решение
Точки сопряжения и веса: понимание выходных данных scipy.interpolate.splrep
Теория (Theory)
Уравновешенное и гибкое средство для аппроксимации и интерполяции множества данных можно найти в сплайнах, а именно в B-сплайнах, которые обеспечивают гладкое и последовательное соединение в зависимости от указанной степени. Функция splrep
из библиотеки SciPy предназначена для обеспечения такой функциональности. Она возвращает кортеж (t, c, k)
, где:
t
— вектор узлов: Определяет точки, в которых кусочные полиномы, составляющие B-сплайн, соединяются.c
— коэффициенты B-сплайна: Это веса базисных функций сплайна, которые определяют форму каждого кусочного полинома.k
— степень сплайна: Это степень полиномов, составляющих B-сплайн. По умолчанию равна 3, что соответствует кубическим сплайнам.
Пример (Example)
Рассмотрим выполнение функции splrep
на заданных данных:
import numpy as np
import scipy.interpolate as spi
x = np.array([3.0, 4.5, 7.0, 9.0])
y = np.array([2.5, 1.0, 2.5, 0.5])
interpolation = spi.splrep(x, y, k=3)
Узлы (t)
Вы можете ожидать, что узлы будут совпадать с входными точками x
, но это не так. Узлы (t)
включают дополнительные точки для обеспечения необходимых краевых условий кубического сплайна:
interpolation[0]
# array([3., 3., 3., 3., 9., 9., 9., 9.])
Эта избыточность в узлах обеспечивает гладкость сплайна в начале и в конце интервала аппроксимации. Например, для кубических сплайнов минимальное количество повторений узлов равно трем для начальных и конечных узлов, чтобы обеспечить непрерывность и гладкость второй производной в этих точках.
Коэффициенты (c)
Коэффициенты B-сплайна (c)
– это веса базисных функций, которые определяют форму полинома сплайна:
interpolation[1]
# array([ 2.5 , -2.21111111, 6.18888889, 0.5 , 0. , 0. , 0. , 0. ])
Эти коэффициенты не обязательно визуально соотносятся с заданными значениями y
. Вместо этого они представляют взвешенные комбинации базисных функций, применяемых к узлам, которые в совокупности определяют кривую через аппроксимируемые данные. Каждое значение соответствует весу конкретного базиса, и именно их линейная комбинация формирует сглаженную кривую.
Применение (Application)
Использование splrep
и splev
предоставляет мощный механизм для интерполяции и аппроксимации данных. Преимущества применения данных функций в задачах интерполяции включают в себя:
-
Гладкость и непрерывность: Сплайны обеспечивают гладкость через производные до
k-1
порядка, что делает их идеальными для нужд, требующих гладкой аппроксимации, таких как графика, моделирование кривых и траекторий. -
Гибкость: B-сплайны, формируемые с помощью
splrep
, очень гибки. Они достаточны для точной аппроксимации данных, но при этом избегают избыточной волатильности и осцилляций, присущих полиномам высокого порядка. -
Практическое приложение: Ex.: в значениях
IX
иIY
, полученных следующим образом:IX = np.linspace(3, 9, 100) IY = spi.splev(IX, interpolation)
Мы видим, как сплайн применяет узлы и веса для интерполяции сглаженной кривой. Попрактиковаться в работе со сплайнами можно через сравнение полученных аппроксимированных значений с реальными, что всегда полезно для визуализации результатов в процессе обучения.
Изучение интерполяции сплайнов с помощью scipy.interpolate.splrep
предоставляет надежные инструменты для анализа данных. Хорошее понимание выходных данных этой функции позволяет глубже погружаться в анализ и обработки данных, предоставляя более точные и глубокие интуитивные знания о структуре ваших данных.