Сглаживание данных и определение выбросов

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

Методы скользящего окна

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

Для примера рассмотрим измерения скорости ветра, проводимые каждую минуту в течение около 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')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Measured Wind Speed, Average Wind Speed over 5 min Window.

Точно так же можно вычислить медианную скорость ветра в скользящем окне, используя 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')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Measured Wind Speed, Median Wind Speed over 5 min Window.

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

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')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Original Data, Noisy Data.

Используйте скользящее среднее значение с размером окна 3, чтобы сгладить зашумленные данные.

window = 3;
Amean = movmean(Anoise,window);
plot(t,A,t,Amean)
axis tight
legend('Original Data','Moving Mean - Window Size 3')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent 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')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Original Data, Moving Mean - Window Size 5.

Общие методы сглаживания

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

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

[Asgolay,window] = smoothdata(Anoise,'sgolay');
plot(t,A,t,Asgolay)
axis tight
legend('Original Data','Savitzky-Golay','location','best')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Original Data, Savitzky-Golay.

window
window = 3

Устойчивый метод Лоуэсса является еще одним методом сглаживания, который особенно полезен, когда выбросы присутствуют в данных в дополнение к шуму. Введите выбросы в зашумленные данные и используйте робастный Lowess, чтобы сгладить данные, что устраняет выбросы.

Anoise(36) = 20;
Arlowess = smoothdata(Anoise,'rlowess',5);
plot(t,Anoise,t,Arlowess)
axis tight
legend('Noisy Data','Robust Lowess')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Noisy Data, Robust Lowess.

Обнаружение выбросов

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

Amedian = smoothdata(Anoise,'movmedian');
plot(t,Anoise,t,Amedian)
axis tight
legend('Noisy Data','Moving Median')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent 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')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent 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

Figure contains an axes. The axes contains an object of type line.

По умолчанию 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')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent 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')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Original Data, Smoothed Data with Sample Points.

См. также

| | | |

Похожие темы