Рубрики
Без рубрики

Установка данных с UnivariatesPline Scipy () и LsqunivariateSpline ()

https://youtu.be/kkrgqwow_vq Эта статья исследует использование функций .univariatespline () и .LSQUNIVARiateSpline (), из Scipy Package. Что такое сплайны? Сплайны – это математические функции, которые описывают ансамбль многочленов, которые взаимосвязаны друг с другом в определенных точках, называемых узлами СПП. Они используются для интерполяции набора точек данных с … установки данных с помощью Univariatespline Scipy () и LsqunivariateSpline () Подробнее »

Автор оригинала: Andrea Ridolfi.

В этой статье рассматриваются использование функций. Univariatespline () и .Lsqunivariatespline. (), из Scipy упаковка.

Что такое сплайны?

Сплайны – это математический Функции, которые описывают ансамбль Polynomials которые взаимосвязаны друг с другом в определенных точках, называемых Узлы сплайна.

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

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

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

  • i) Как создать функцию сплайна для подходит Данный набор точек данных,
  • II) Какие функции мы можем затем использовать для экстраполировать Значение точек в пределах установленного диапазона,
  • III) Как Улучшить фитинг и
  • iv) Как рассчитать связанные Ошибка . Отказ

Сплайны – математическая перспектива

В математике сплайны являются функциями, описываемыми ансамблем полиномов.

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

Один из главных Характеристики сплайнов – их преемственность; Они непрерывны по всему интервалу, в котором они определены; Это позволяет генерировать гладкую кривую, которая соответствует нашему набору точек данных.

Один из главных Преимущества Использование сплайнов для установки проблем вместо одного полинома, является возможность использования многочленных функций более низкой степени для описания очень сложных функций.

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

Вот хорошее видео, которое объясняет простые условия этого вопроса:

Splines Избегайте этого, изменяя уравнение подходящего по поводу различных интервалов, которые характеризуют начальный набор точек данных. С исторической точки зрения слово «СПП» происходит от гибких устройств сплаи, которые использовались судостроителями, которые использовались судостроителями, чтобы нарисовать гладкие формы в проектировании сосудов. В настоящее время они также находят большое приложение в качестве фундаментальных инструментов во многих программном обеспечении CAD ( https://en.wikipedia.org/wiki/spline_(mathematics) ).

Scipy. Univariatespline.

В первой части этой статьи мы исследуем функцию .Univariatespline. () ; которые могут быть использованы для соответствия сплайна определенной степени к некоторым точкам данных.

Чтобы понять, как работает эта функция, мы начинаем с генерации наших начальных массивов X и Y точек данных. Массив X (называемый «X») определяется с помощью np.linspace () функция; А массив определяется путем эксплуатации NP.RANDOM Функция называется .randn () , который возвращает образец из стандартного нормального распределения.

Смотрите: https://numpy.org/devdocs/reference/random/generated/numpy.random.randn.html Для дополнительной документации.

import matplotlib.pyplot as plt
from scipy.interpolate import UnivariateSpline, LSQUnivariateSpline
import numpy as np

#x and y array definition (initial set of data points)
x = np.linspace(0, 10, 30)
y = np.sin(0.5*x)*np.sin(x*np.random.randn(30))

Как только мы определили начальный набор точек данных, мы можем вызвать функцию .Univariatespline. () , от Scipy Package и рассчитайте сплайн, который наилучшим образом подходит для наших очков.

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

Как также можно увидеть в документации ( https://docs.cscipy.org/doc/scipy/reference/generated/scipy.interpolate.univariatespline.html ), .Univariatespline. () Функция принимает в качестве обязательных входов X и Y массивов точек данных, которые мы хотим соответствовать.

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

Одним из важнейших параметров является «K», который относится к степени полиномов, которые определяют сегменты сплайна. ” k “может варьироваться от одного до пяти; увеличение степени полиномов позволяет лучшему фитингу более сложных функций; однако, чтобы не вводить артефакты в нашей форме; лучшая практика – использовать более низкую степень, которая позволяет лучше процедура подгонки.

Другой соответствующий параметр – это «S», это номер поплавка, который определяет так называемый Коэффициент сглаживания , который напрямую влияет на количество узлов, присутствующих в СПП. Точнее, как только мы исправим определенное значение «S», количество узлов будет увеличено до разницы между значением исходных точек данных в массиве Y и их соответствующими начислениями на сплайном сплайна, меньше значения « S »(см. Документацию для математической формулы). Следует понимать, что чем ниже значение «S», тем выше точность подходящего монтажа и (большую часть времени) n ° узлов, поскольку мы просим меньшую разницу между исходными точками и установленными.

Теперь, когда параметры, которые управляют формой нашего сплайна, являются более четкими, мы можем вернуться к коду и определить функцию сплайна. В частности, мы дадим в качестве входных массивов Ранее определены массивы «X» и «Y» ; Значение коэффициента сглаживания изначально устанавливается на пять, а параметр «k» остается с указанием значения по умолчанию, которое три.

#spline definition  
spline = UnivariateSpline(x, y, s = 5)  

Вывод .Univariatespline. () Функция – это функция, которая соответствует данному набору точек данных. На данный момент мы можем создавать более плотный массив X, называемый «X_SPline» и оценивать соответствующие значения на оси Y, используя функцию сплайна, только что определенную; Затем мы храним их в массиве «y_spline» и генерируйте сюжет.

x_spline = np.linspace(0, 10, 1000)
y_spline = spline(x_spline)
#Plotting
fig = plt.figure()
ax = fig.subplots()
ax.scatter(x, y)
ax.plot(x_spline, y_spline, 'g')
plt.show()

Результатом этой процедуры отображается на рисунке 1.

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

Один из лучших способов улучшить эту ситуацию – использовать метод .set_smoothing_factor (ы) ; которые продолжают расчет сплайна в соответствии с новым коэффициентом сглаживания («S», учитывая как единственный вход), не изменяя узлы, уже найденные во время последнего вызова. Это представляет собой удобную стратегию, действительно, сплайны могут быть очень чувствительны к изменениям в коэффициенте сглаживания; Это означает, что изменение функции сглаживания, непосредственно в. Univariatespline () Звонок, может значительно изменить выходной результат в срок действия формы сплайна (имейте в виду, что наша цель всегда может получить наилучшее в форме с более простой возможным сплайном). Следующие строки кода описывают определение новой и более точной функции сплайна с коэффициентом сглаживания, равный 0,5.

После применения вышеупомянутого метода процедура идентична описанной для генерации первого сплайна.

# Changing the smoothing factor for a better fit
spline.set_smoothing_factor(0.05)
y_spline2 = spline(x_spline)

Мы заключаем, зарабатываем результат; На рисунке 2 Отображение окончательного выхода, новый SPLED – это синяя кривая, нанесенная вместе со старой (зеленой кривой) и начальными точками данных (светло-голубые точки).

#Plotting
fig = plt.figure()
ax = fig.subplots()
ax.scatter(x, y)
ax.plot(x_spline, y_spline, 'g', alpha =0.5)
ax.plot(x_spline, y_spline2, 'b')
plt.show()

Как видно из рисунка 2, вновь сгенерированная функция SPLINE хорошо описывает начальные точки данных и по-прежнему пропускают узлами, которые были обнаружены в исходном вызове (точках данных, общие для обоих функций сплаи)).

Мы заключаем эту часть, иллюстрируя некоторые полезные методы, которые можно использовать после генерации правильной функции сплаи, для описания наших точек данных. Первый из этих методов называется «.__ Call __ (x)», что позволяет оценить значение определенных точек на сплайном, приведенном в виде списка или одного числа. Следующие строки описывают приложение этого метода (мы оцениваем сплайн для значения 2 в оси X).

#evaluate point along the spline
print(spline.__call__(2))

Результат Печать Команда 0,5029480519149454. Еще один важный метод – .get_ResiDual () , который позволяет получить взвешенные сумма в квадратных остатках приближения СППЛ (проще просто оценка ошибки в процедуре подгонки).

#get the residuals
print(spline.get_residual())

Результат для этого случая составляет 0,049997585478530546. В некоторых приложениях это может быть некоторая интерес для расчета определенного интеграла сплайна (то есть площадь под кривой СПП между определенным диапазоном вдоль оси x); Для этого метод .интеграл ( a, b ) представляет собой самое простое решение; «А» и «B» – это нижние и верхние пределы вдоль оси X, между которой мы хотим оценить область (в этом случае мы рассчитываем область под сплайн, от 1 до 2). Применение этого метода проиллюстрирована в следующих строках.

#definite integral of the spline
print(spline.integral(1,2))

Результат интеграции составляет -0.2935394976155577. Последний метод позволяет получить значения точек, в которых СПП пересекает ось X, то есть решения уравнений, определяющих функцию СПП. Способ называется .Roots (), его применение показано в следующих строках.

#finding the roots of the spline function
print(spline.roots())

Выход этой последней строки – это массив, содержащий значения точек, для которых сплайн пересекает ось X, а именно:

[1.21877130e-03 3.90089909e-01 9.40446113e-01 1.82311679e+00 2.26648393e+00 3.59588983e+00 3.99603385e+00 4.84430942e+00 6.04000192e+00 6.29857365e+00 7.33532448e+00 9.54966590e+00]

Scipy. Lsqunivariatespline.

В последней части этой статьи мы представим .Lsqunivariatespline. () , другая функция, которая может быть использована для генерации стр. С практической точки зрения он работает аналогично .Univariatespline. () Действительно, как мы увидим, очень мало различий в том, как мы называем и определим его в нашем скрипте.

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

Это означает, что у нас есть Полный контроль над узлами это определит сплайн; по-разному, в предыдущем случае количество узлов косвенно регулируется через выбор коэффициента сглаживания. Чтобы оценить, как наш сплайн будет изменяться за счет увеличения количества узлов, мы начинаем с определения двух разных массивов, «T» и «T1», T1 – это более плотный массив.

#LSQUnivariateSpline
t = np.array([0.5, 1, 2.5])
t1 = np.linspace(1, 9, 20)

Функция . Lsqunivariatespline () Принимает в качестве обязательного ввода, массивы X, Y и массив «T», который содержит координаты узлов, которые определяют наш сплайн. Важным условием, которое необходимо учитывать, заключается в том, что координаты узлов должны находиться в пределах диапазона массива X.

В нашем случае мы будем использовать одни и те же массивы X и Y, используемые для предыдущего случая. На этом этапе мы должны дважды вызвать функцию, чтобы показать разницу между двумя наборами массивов узлов. Кроме того, мы указываем параметр «k», который снова относится к степени полиномов, которые описывают сплайн.

LSQUspline = LSQUnivariateSpline(x, y, t1, k = 4)
LSQUspline1 = LSQUnivariateSpline(x, y, t, k = 4)

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

#Plotting
plt.scatter(x, y, s=8)
plt.plot(x_spline, LSQUspline(x_spline), color = 'b')
plt.plot(x_spline, LSQUspline1(x_spline), color = 'g')
plt.show()

Конечный результат отображается на рисунке 3; Как видно, увеличивая количество узлов, функция SPLINE лучше приближается к точкам данных. Если мы проверяем тщательно, оба сплайны проходят для узлов, указанных в массивах «T» и «T1» соответственно. Большинство методов, ранее показанных для .Univariatespline () Работайте над этой функцией тоже (для дополнительной документации, пожалуйста, обратитесь к https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.lsqunivariateSpline.html ).

Заключение

Чтобы заключить, в этой статье мы изучили функции сплаи, их власть и универсальность.

Одна вещь, которая важно иметь в виду, это то, что когда мы используем Splines для подгонки и интерполирования данного набора точек данных, мы никогда не должны превышать со степенью полиномов, которые определяют сплайн; Это следует избегать нежелательных ошибок и неправильной интерпретации исходных данных.

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

Оригинал: “https://blog.finxter.com/fitting-data-with-scipys-univariatespline-and-lsqunivariatespline/”