Сглаживание данных относится к методам устранения нежелательного шума или поведения в данных, в то время как определение выбросов идентифицирует точки данных, которые значительно отличаются от остальных данных.
Методы скользящего окна являются способами обработки данных в меньших пакетах за раз, обычно в порядок статистически представлять окрестность точек в данных. Скользящее среднее является общим методом сглаживания данных, который скользит по окну вдоль данных, вычисляя среднее значение точек внутри каждого окна. Это может помочь исключить незначительные изменения от одной точки данных к следующей.
Для примера рассмотрим измерения скорости ветра, проводимые каждую минуту в течение около 3 часов. Используйте movmean
функция с размером окна 5 минуты для сглаживания высокоскоростных порывов ветра.
load windData.mat mins = 1:length(speed); window = 5; meanspeed = movmean(speed,window); plot(mins,speed,mins,meanspeed) axis tight legend('Measured Wind Speed','Average Wind Speed over 5 min Window','location','best') xlabel('Time') ylabel('Speed')
Точно так же можно вычислить медианную скорость ветра в скользящем окне, используя movmedian
функция.
medianspeed = movmedian(speed,window); plot(mins,speed,mins,medianspeed) axis tight legend('Measured Wind Speed','Median Wind Speed over 5 min Window','location','best') xlabel('Time') ylabel('Speed')
Не все данные подходят для сглаживания методом скользящего окна. Для примера создайте синусоидальный сигнал с введенным случайным шумом.
t = 1:0.2:15; A = sin(2*pi*t) + cos(2*pi*0.5*t); Anoise = A + 0.5*rand(1,length(t)); plot(t,A,t,Anoise) axis tight legend('Original Data','Noisy Data','location','best')
Используйте скользящее среднее значение с размером окна 3, чтобы сгладить зашумленные данные.
window = 3; Amean = movmean(Anoise,window); plot(t,A,t,Amean) axis tight legend('Original Data','Moving Mean - Window Size 3')
Скользящее среднее значение достигает общей формы данных, но не очень точно захватывает овраги (локальные минимумы). Поскольку точки оврага окружены двумя большими соседями в каждом окне, среднее значение не очень хорошее приближение к этим точкам. Если вы делаете размер окна больше, среднее значение полностью устраняет более короткий peaks. Для этого типа данных можно рассмотреть альтернативные методы сглаживания.
Amean = movmean(Anoise,5); plot(t,A,t,Amean) axis tight legend('Original Data','Moving Mean - Window Size 5','location','best')
The smoothdata
функция обеспечивает несколько опции сглаживания, таких как метод Савицкого-Голая, который является популярным методом сглаживания, используемым в обработке сигналов. По умолчанию smoothdata
выбирает оптимальный размер окна для метода в зависимости от данных.
Используйте метод Савицкого-Голая, чтобы сгладить сигнал с шумом Anoise
, и выход окна, который он использует. Этот метод обеспечивает лучшее приближение оврага по сравнению с movmean
.
[Asgolay,window] = smoothdata(Anoise,'sgolay'); plot(t,A,t,Asgolay) axis tight legend('Original Data','Savitzky-Golay','location','best')
window
window = 3
Устойчивый метод Лоуэсса является еще одним методом сглаживания, который особенно полезен, когда выбросы присутствуют в данных в дополнение к шуму. Введите выбросы в зашумленные данные и используйте робастный Lowess, чтобы сгладить данные, что устраняет выбросы.
Anoise(36) = 20; Arlowess = smoothdata(Anoise,'rlowess',5); plot(t,Anoise,t,Arlowess) axis tight legend('Noisy Data','Robust Lowess')
Выбросы в данных могут значительно искажать результаты обработки данных и другие вычисленные величины. Например, если вы пытаетесь сглаживать данные, содержащие выбросы с помощью движущейся медианы, можно получить вводящие в заблуждение peaks или овраги.
Amedian = smoothdata(Anoise,'movmedian'); plot(t,Anoise,t,Amedian) axis tight legend('Noisy Data','Moving Median')
The isoutlier
функция возвращает логический 1, когда обнаружены выбросы. Проверьте индекс и значение выбросов в Anoise
.
TF = isoutlier(Anoise); ind = find(TF)
ind = 36
Aoutlier = Anoise(ind)
Aoutlier = 20
Можно использовать filloutliers
функция для замены выбросов в данных путем определения метода заливки. Для примера заполните выбросы Anoise
со значением его соседа сразу направо.
Afill = filloutliers(Anoise,'next'); plot(t,Anoise,t,Afill) axis tight legend('Noisy Data with Outlier','Noisy Data with Filled Outlier')
Не все данные состоят из одинаково разнесенных точек, что может повлиять на методы обработки данных. Создайте datetime
вектор, который содержит нерегулярное время дискретизации для данных в Airreg
. The time
вектор представляет выборки, взятые каждую минуту в течение первых 30 минут, затем ежечасно в течение двух дней.
t0 = datetime(2014,1,1,1,1,1);
timeminutes = sort(t0 + minutes(1:30));
timehours = t0 + hours(1:48);
time = [timeminutes timehours];
Airreg = rand(1,length(time));
plot(time,Airreg)
axis tight
По умолчанию smoothdata
сглаживает относительно одинаково разнесенных целых чисел, в этом случае 1,2,...,78
. Поскольку целочисленные метки времени не координируются с дискретизацией точек в Airreg
первые полчаса данных все еще появляются зашумленными после сглаживания.
Adefault = smoothdata(Airreg,'movmean',3); plot(time,Airreg,time,Adefault) axis tight legend('Original Data','Smoothed Data with Default Sample Points')
Многие функции обработки данных в MATLAB ®, включая smoothdata
, movmean
, и filloutliers
, позволяют вам обеспечить точки выборки, гарантируя, что данные обрабатываются относительно его модулей дискретизации и частот. Чтобы удалить высокочастотные изменения в первые полчаса данных в Airreg
, используйте 'SamplePoints'
опция с метками времени в time
.
Asamplepoints = smoothdata(Airreg,'movmean',hours(3),'SamplePoints',time); plot(time,Airreg,time,Asamplepoints) axis tight legend('Original Data','Smoothed Data with Sample Points')
filloutliers
| isoutlier
| movmean
| movmedian
| smoothdata