• Автор записи:
  • Рубрика записи:Scipy
  • Время чтения:6 минут чтения
  • Комментарии к записи:0 комментариев

Сглаживание данных (Smoothing) — это процесс удаления шума из набора данных с помощью алгоритма. В результате можно будет легче различить важные закономерности. Сглаживание данных можно использовать в экономическом анализе, а также для прогнозирования тенденций, например тех, которые наблюдаются в ценах на ценные бумаги. Целью сглаживания данных является устранение единичных выбросов и учет сезонности.

В процессе сбора данных можно устранить или уменьшить любую волатильность или другие виды шума. Сглаживание данных – это термин, обозначающий это.

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

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

Содержание

Сплайн сглаживания

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

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

В Python Scipy есть класс scipy.interpolate.UnivariateSpline(), который подгоняет одномерный сглаживающий сплайн к существующему набору точек данных.

Синтаксис:

class scipy.interpolate.UnivariateSpline(x, y, w=None, bbox=[None, None], k=3, s=None, ext=0, check_finite=False)

Где параметры:

  • x (array_data, N): одномерный массив с отдельными входными данными. Должно быть, поднимается; если s равно 0, оно должно строго возрастать.
  • y (array_data, N): Зависимые входные данные в одномерном массиве, длина которого равна x.
  • w (N, array_data): веса для подгонки сплайнов. Оно должно быть позитивным. Все веса эквивалентны, если w равен None. По умолчанию не используется.
  • bbox (array_data, 2): 2-последовательность, определяющая периметр интервала аппроксимации. Bbox равен [x[0], x[-1]], если bbox равен None. По умолчанию не используется.
  • k (int): степень сглаживающего сплайна. K = 3 — кубический сплайн, следовательно, должно быть 1 = k = 5. Существует 3.
  • s (float): количество узлов определялось положительным коэффициентом сглаживания. Пока условие сглаживания не будет выполнено, количество узлов будет увеличиваться.
  • ext (string, int): определяет, как выполняется экстраполяция для элементов, находящихся за пределами диапазона, указанного в последовательности узлов.
    • если ext=0 или «экстраполировать», верните экстраполированное значение.
    • если ext=1 или «нули», вернуть 0
    • если ext=2 или «поднять», вызвать ValueError
    • если ext=3 из «const», верните граничное значение.
  • check_finite (boolean): если необходимо проверить, что входные массивы содержат только конечные числа. Отключение может улучшить производительность, но если входные данные содержат бесконечности или NaN, это может вызвать проблемы(сбои, отсутствие завершения или нелогичные результаты). Значение по умолчанию — «Ложь».

Импортируйте необходимые библиотеки или методы, используя приведенный ниже код Python.

import numpy as np
import matplotlib.pyplot as plt
from scipy import interpolate

Сгенерируйте x и y и постройте их график, используя приведенный ниже код.

rng_ = np.random.default_rng()
x_ = np.linspace(-4, 4, 50)
y_ = np.exp(-x_**2) + 0.1 * rng_.standard_normal(50)
plt.plot(x_, y_, 'ro', ms=5)

Пример сплайна сглаживания Python Scipy

Сглаживание данных с помощью метода UnivariateSpline() со значениями параметров по умолчанию с использованием приведенного ниже кода.

spline = interpolate.UnivariateSpline(x_, y_)
xs_ = np.linspace(-4, 4, 1000)
plt.plot(xs_, spline(xs_), 'g', lw=2)

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

spline.set_smoothing_factor(0.5)
plt.plot(xs_, spline(xs_), 'b', lw=3)
plt.show()

Метод set_smoothing_factor(), который продолжает вычисление сплайнов с использованием указанного коэффициента сглаживания s и узлов, обнаруженных во время предыдущего вызова.

Метод set_smoothing_factor()

Фильтр сглаживания

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

После того, как все соседи грубо согласованы друг с другом, окно снова сдвигается на одну точку данных.

В Python Scipy есть метод savgol_filter() в модуле scipy.signal, который использует фильтр Савицкого-Голея для массива.

Синтаксис:

scipy.signal.savgol_filter(x, window_length, polyorder, deriv=0, delta=1.0, axis=- 1, mode='interp', cval=0.0)

Где параметры:

  • x (array_data): данные, которые будут фильтроваться. Перед фильтрацией x будет преобразован в тип numpy.float64, если он не является массивом с плавающей запятой одинарной или двойной точности.
  • window_length (int): размер окна фильтра. Если выбран режим «interp», длина окна должна быть меньше или равна размеру x.
  • ployorder (int): порядок полинома, который использовался для соответствия данным. Длина окна должна быть меньше полипорядка.
  • deriv (int): порядок вычисления производной. Это должно быть целое число, которое не является отрицательным. Если значение по умолчанию равно 0, данные фильтруются, но не дифференцируются.
  • delta (float): интервал выборки, который будет подвергаться фильтру. Используется только тогда, когда deriv > 0. По умолчанию используется значение 1.0.
  • axis(int): направление, в котором должен применяться фильтр по оси X массива. -1 — значение по умолчанию.
  • mode (строка): должно быть «interp», «перенос», «ближайший», «константа» или «зеркало». На основании этого определяется тип расширения, которое следует применить к дополненному сигналу перед применением фильтра. Если для режима установлено значение «constant», cval предоставляет значение заполнения. Дополнительную информацию о «зеркале», «константе», «обертке» и «ближайшем» см. в примечаниях. Никакое расширение не используется, когда выбран режим «interp» по умолчанию. Вместо этого к значениям длины последнего окна ребра подгоняется полином полипорядка степени, и этот полином затем используется для расчета выходных значений для длины последнего окна / 2.
  • cval (скаляр): если режим «постоянный», значение для заполнения ввода за краями. Значение по умолчанию — 0.

Метод savgol_filter() возвращает отфильтрованные данные.

Импортируйте необходимые библиотеки или методы, используя приведенный ниже код Python.

import numpy as np
import matplotlib.pyplot as plt
from scipy import signal

Сгенерируйте зашумленные данные и постройте график данных.

x_ = np.linspace(0,2*np.pi,200)
y_ = np.sin(x_) + np.random.random(200) * 0.2
plt.plot(x_, y_)

Теперь примените фильтр Савицкого-Голея к зашумленным данным, чтобы сгладить их.

yhat_ = signal.savgol_filter(y_, 49, 3)

plt.plot(x_, y_)
plt.plot(x_,yhat_, color='green')
plt.show()

Метод savgol_filter()

Метод interp1d()

Метод interp1d() Python Scipy в модуле scipy.interpolate, который используется для интерполяции одномерных функций. Массивы значений с именами x и y используются для аппроксимации функции f: y = f.

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

Синтаксис приведен ниже.

class scipy.interpolate.interp1d(x, y, bounds_error=None,kind='linear', axis=- 1, copy=True)

Где параметры:

  • x (array_data): одномерный массив реальных значений.
  • y (array_data): Массив ND с реальным значением. На оси интерполяции длина y должна совпадать с длиной x.
  • kind (str): определяет тип интерполяции в виде строки или целого числа, а также порядок использования сплайн-интерполятора. Строка должна относиться к одной из следующих категорий: линейная, ближайшая, ближайшая, нулевая, линейная, квадратичная, кубическая, предыдущая или следующая. Термины «нулевой», «линейный», «квадратичный» и «кубический» обозначают сплайн-интерполяции нулевого, первого, второго или третьего порядка; «Предыдущий», «следующий» и «ближайший» просто возвращают предыдущее или следующее значение точки; «Ближайший вверх», который округляет в большую сторону, и «ближайший», который округляет в меньшую сторону, используются при интерполяции полуцелых чисел(например, 0,5, 1,5). Линейный — значение по умолчанию.
  • axis (int): указывает ось Y, которая будет использоваться для интерполяции. Последняя ось y — это значение интерполяции по умолчанию.
  • copy (boolean): если True, x и y копируются внутри класса. Если значение равно False, используются ссылки x и y. Копирование — действие по умолчанию.
  • Bounds_error (boolean): если True, любая попытка интерполяции значения за пределами диапазона x приводит к ошибке ValueError(где необходима экстраполяция). Если значение равно False, значение заполнения присваивается значениям, выходящим за пределы. Ошибки возникают по умолчанию, если не указано значение fill value=»extrapolate».

Импортируйте необходимые библиотеки или методы, используя приведенный ниже код Python.

import numpy as np
import matplotlib.pyplot as plt
from scipy import interpolate

Создайте данные x и y и интерполируйте их.

x_ = np.arange(0, 15)
y_ = np.exp(-x_/4.0)
f_ = interp1d(x_, y_)

Постройте вычисленные значения.

xnew_ = np.arange(0, 10, 0.1)
ynew_ = f_(xnew_) 
plt.plot(x_, y_, 'o', xnew_, ynew_, '-')
plt.show()

Метод interp1d()

Метод LSQUnivariateSpline()

В Python Scipy LSQUnivariateSpline() — это дополнительная функция создания сплайна. Как мы увидим, он функционирует практически аналогично UnivariateSpline().

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

Синтаксис приведен ниже.

class scipy.interpolate.LSQUnivariateSpline(x, y, t, w=None, bbox=[None, None], k=3, ext=0, check_finite=False)

Где параметры:

  • x (array_data): входные размеры точек данных должны увеличиваться.
  • y (array_data): Размерность точек входных данных.
  • t (array_data): узлы внутри сплайна, порядок должен быть возрастающим.
  • w (array_data): веса для подгонки сплайнов. Должно быть, это поднимает настроение. Если None, все веса равны(по умолчанию).
  • bbox (array_data): 2-последовательность, определяющая периметр интервала аппроксимации. Если нет, bbox равен [x[0], x[-1]].
  • k (int): степень сглаживающего сплайна. Оно должно быть 1 k 5. По умолчанию используется K = 3, кубический сплайн.
  • ext (string,int): определяет, как выполняется экстраполяция для элементов за пределами диапазона, указанного в последовательности узлов.
    • если ext=0 или «экстраполировать», верните экстраполированное значение.
    • если ext=1 или «нули», вернуть 0
    • если ext=2 или «поднять», вызвать ValueError
    • если ext=3 из «const», верните граничное значение.
  • check_finite (boolean): если необходимо проверить, что входные массивы содержат только конечные числа. Отключение может повысить производительность, но если входные данные содержат бесконечности или NaN, это может вызвать проблемы(сбои, отсутствие завершения или нелогичные результаты). Значение по умолчанию — «Ложь».

Импортируйте необходимые библиотеки или методы, используя приведенный ниже код Python.

import numpy as np
import matplotlib.pyplot as plt
from scipy import interpolate

Создайте x и y, а затем постройте их график.

rng_ = np.random.default_rng()
x_ = np.linspace(-4, 4, 50)
y_ = np.exp(-x_**2) + 0.1 * rng_.standard_normal(50)
plt.plot(x_, y_, 'ro', ms=5)

Установите сглаживающий сплайн с заданными внутренними узлами.

t_ = [-1, 0, 1]
spline = interpolate.LSQUnivariateSpline(x_, y_, t_)
xs_ = np.linspace(-4, 4, 1000)
plt.plot(x_, y_, 'ro', ms=5)
plt.plot(xs_, spline(xs_), 'g-', lw=3)
plt.show()

Метод LSQUnivariateSpline()

Метод set_smoothing_factor(s)

Класс scipy.interpolate.UnivariateSpline() имеет метод set_smoothing_factor(s), который постоянно вычисляет сплайны, используя узлы, обнаруженные в предыдущем вызове, и предоставленный коэффициент сглаживания s.

Импортируйте необходимые библиотеки или методы, используя приведенный ниже код Python.

import numpy as np
import matplotlib.pyplot as plt
from scipy import interpolate

Сгенерируйте x и y и постройте их график.

x_ = np.linspace(-4, 4, 50)
y_ = np.sin(x_) + np.random.random(50) * 0.8
plt.plot(x_, y_, 'ro', ms=5)

Метод set_smoothing_factor(s)

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

spline = interpolate.UnivariateSpline(x_, y_)
xs_ = np.linspace(-4, 4, 500)
plt.plot(xs_, spline(xs_), 'g', lw=2)

Теперь используйте метод set_smoothing_factor(0.7), чтобы настроить гладкость данных.

spline.set_smoothing_factor(0.7)
plt.plot(xs_, spline(xs_), 'b', lw=3)
plt.show()

Фактор сглаживания

Мметод interp2d()

В Python Scipy есть метод interp2d() в модуле scipy.interpolate, который использует двумерную сетку для интерполяции. Массивы значений x, y и z используются для аппроксимации функции f: z = f(x, y) дает скалярное значение z.

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

Минимальный минимум точек данных, необходимых вдоль оси интерполяции, равен(k+1)**2, где k равно 1 для линейной интерполяции, 3 для кубической интерполяции и 5 для интерполяции пятой степени.

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

Синтаксис приведен ниже.

class scipy.interpolate.interp2d(x, y,  bounds_error=False,z, kind='linear', copy=True, fill_value=None)

Где параметры:

  • xy (array_data): координаты точек данных определяются с помощью массивов. Если точки находятся на регулярной сетке, x и y можно использовать для определения координат столбца и строки соответственно.
  • z (array_data): значения интерполяции для функции в точках данных. Предполагая упорядочивание Фортрана(order=’F’), z выравнивается перед использованием, если это многомерный массив. Если x и y задают координаты столбца и строки, длина сплющенного массива z равна len(x)*len(y) или len(z) == len(x) == len(y).
  • kind (quintic, кубический, линейный): Соответствующий вид сплайн-интерполяции. По умолчанию установлено «линейное».
  • copy (boolean): если True, x, y и z копируются внутри класса. Ссылки разрешены, если установлено значение False. Копирование используется по умолчанию.
  • borders_error (boolean): если это значение равно True, ValueError возникает всякий раз, когда интерполированные значения ожидаются за пределами домена(x, y) входных данных. Если значение равно False, используется значение заполнения.
  • fill_value (число): значение, которое будет использоваться, если оно задано, для точек вне области интерполяции. Значения за пределами домена экстраполируются с использованием экстраполяции ближайшего соседа, если они отсутствуют(Нет).

Импортируйте необходимые библиотеки или методы, используя приведенный ниже код Python.

import numpy as np
import matplotlib.pyplot as plt
from scipy import interpolate

Создайте двумерную сетку, используя приведенный ниже код.

x_ = np.arange(-4.01, 4.01, 0.20)
y_ = np.arange(-4.01, 4.01, 0.20)
xx_, yy_ = np.meshgrid(x_, y_)
z_ = np.sin(xx_**2+yy_**2)

Интерполируйте приведенные выше данные.

f_ = interp2d(x_, y_, z_, kind='cubic')

Постройте результат, используя только что полученную функцию интерполяции, используя приведенный ниже код:

xnew_ = np.arange(-4.01, 4.01, 1e-2)
ynew_ = np.arange(-4.01, 4.01, 1e-2)
znew_ = f_(xnew_, ynew_)
plt.plot(x_, z_[0, :], 'ro-', xnew_, znew_[0, :], 'b-')
plt.show()

Python Scipy сглаживает 2D-данные

Добавить комментарий