Учебники

SciPy — Интерполировать

В этой главе мы обсудим, как интерполяция помогает в SciPy.

Что такое интерполяция?

Интерполяция — это процесс нахождения значения между двумя точками на линии или кривой. Чтобы помочь нам вспомнить, что это значит, мы должны думать о первой части слова «inter» как о значении «enter», что напоминает нам о том, чтобы заглянуть «внутрь» данных, которые у нас были изначально. Этот инструмент, интерполяция, полезен не только в статистике, но и в науке, бизнесе или при необходимости прогнозирования значений, попадающих в две существующие точки данных.

Давайте создадим некоторые данные и посмотрим, как можно выполнить эту интерполяцию с помощью пакета scipy.interpolate .

import numpy as np
from scipy import interpolate
import matplotlib.pyplot as plt
x = np.linspace(0, 4, 12)
y = np.cos(x**2/3+4)
print x,y

Вышеуказанная программа сгенерирует следующий вывод.

(
   array([0.,  0.36363636,  0.72727273,  1.09090909,  1.45454545, 1.81818182, 
          2.18181818,  2.54545455,  2.90909091,  3.27272727,  3.63636364,  4.]),
            
   array([-0.65364362,  -0.61966189,  -0.51077021,  -0.31047698,  -0.00715476,
           0.37976236,   0.76715099,   0.99239518,   0.85886263,   0.27994201,
          -0.52586509,  -0.99582185])
)

Теперь у нас есть два массива. Предполагая, что эти два массива являются двумя измерениями точек в пространстве, давайте построим график, используя следующую программу, и посмотрим, как они выглядят.

plt.plot(x, y,’o’)
plt.show()

Вышеуказанная программа сгенерирует следующий вывод.

интерполирование

1-D Интерполяция

Класс interp1d в scipy.interpolate — это удобный метод для создания функции на основе фиксированных точек данных, которая может быть оценена в любом месте области, определенной данными, с использованием линейной интерполяции.

Используя приведенные выше данные, давайте создадим интерполяционную функцию и нарисуем новый интерполированный граф.

f1 = interp1d(x, y,kind = 'linear')

f2 = interp1d(x, y, kind = 'cubic')

Используя функцию interp1d, мы создали две функции f1 и f2. Эти функции для данного входа x возвращают y. Третий тип переменных представляет тип метода интерполяции. «Линейный», «Ближайший», «Ноль», «Линейный», «Квадратичный», «Кубический» — это несколько методов интерполяции.

Теперь давайте создадим новый вход большей длины, чтобы увидеть явную разницу интерполяции. Мы будем использовать ту же функцию старых данных на новых данных.

xnew = np.linspace(0, 4,30)

plt.plot(x, y, 'o', xnew, f(xnew), '-', xnew, f2(xnew), '--')

plt.legend(['data', 'linear', 'cubic','nearest'], loc = 'best')

plt.show()

Вышеуказанная программа сгенерирует следующий вывод.

1-D Интерполяция

Сплайны

Чтобы нарисовать плавные кривые через точки данных, разработчики когда-то использовали тонкие гибкие полоски из дерева, твердой резины, металла или пластика, называемые механическими сплайнами. Чтобы использовать механический сплайн, штыри помещались в разумный выбор точек вдоль кривой в проекте, а затем сплайн сгибался так, чтобы он касался каждого из этих штифтов.

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

Одномерный сплайн

Одномерный сглаживающий сплайн соответствует заданному набору точек данных. Класс UnivariateSpline в scipy.interpolate — это удобный метод для создания функции на основе класса фиксированных точек данных — scipy.interpolate.UnivariateSpline (x, y, w = None, bbox = [None, None], k = 3, s). = Нет, ext = 0, check_finite = False).

Параметры — Ниже приведены параметры одномерного сплайна.

  • Это соответствует сплайну y = spl (x) степени k для предоставленных данных x, y.

  • ‘w’ — указывает вес для подгонки сплайна. Должен быть позитивным. Если нет (по умолчанию), все веса равны.

  • ‘s’ — определяет количество узлов, указывая условие сглаживания.

  • ‘k’ — степень сглаживающего сплайна. Должно быть <= 5. По умолчанию k = 3, кубический сплайн.

  • Ext — управляет режимом экстраполяции для элементов, не входящих в интервал, определенный последовательностью узлов.

    • если ext = 0 или «extrapolate», возвращает экстраполированное значение.

    • если ext = 1 или ‘ноль’, возвращает 0

    • если ext = 2 или ‘поднимать’, вызывает ошибку ValueError

    • если ext = 3 из ‘const’, возвращает граничное значение.

  • check_finite — проверять, содержат ли входные массивы только конечные числа.

Это соответствует сплайну y = spl (x) степени k для предоставленных данных x, y.

‘w’ — указывает вес для подгонки сплайна. Должен быть позитивным. Если нет (по умолчанию), все веса равны.

‘s’ — определяет количество узлов, указывая условие сглаживания.

‘k’ — степень сглаживающего сплайна. Должно быть <= 5. По умолчанию k = 3, кубический сплайн.

Ext — управляет режимом экстраполяции для элементов, не входящих в интервал, определенный последовательностью узлов.

если ext = 0 или «extrapolate», возвращает экстраполированное значение.

если ext = 1 или ‘ноль’, возвращает 0

если ext = 2 или ‘поднимать’, вызывает ошибку ValueError

если ext = 3 из ‘const’, возвращает граничное значение.

check_finite — проверять, содержат ли входные массивы только конечные числа.

Давайте рассмотрим следующий пример.

import matplotlib.pyplot as plt
from scipy.interpolate import UnivariateSpline
x = np.linspace(-3, 3, 50)
y = np.exp(-x**2) + 0.1 * np.random.randn(50)
plt.plot(x, y, 'ro', ms = 5)
plt.show()

Используйте значение по умолчанию для параметра сглаживания.

Сплайны

spl = UnivariateSpline(x, y)
xs = np.linspace(-3, 3, 1000)
plt.plot(xs, spl(xs), 'g', lw = 3)
plt.show()

Вручную измените величину сглаживания.