Сглаживание данных относится к методам устранения нежелательного шума или поведения в данных, в то время как обнаружение отклонений идентифицирует точки данных, которые значительно отличаются от остальных данных.
Методы перемещения окон - это способы обработки данных меньшими партиями за один раз, как правило, для статистического представления окрестности точек в данных. Скользящее среднее - это обычный метод сглаживания данных, который перемещает окно вдоль данных, вычисляя среднее значение точек внутри каждого окна. Это может помочь устранить незначительные отклонения от одной точки данных к другой.
Например, рассмотрим измерения скорости ветра, выполняемые каждую минуту в течение примерно 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')

Скользящее среднее достигает общей формы данных, но не захватывает долины (локальные минимумы) очень точно. Поскольку точки долины окружены двумя большими соседями в каждом окне, среднее значение не очень хорошее приближение к этим точкам. Если сделать размер окна больше, среднее значение полностью устранит более короткие пики. Для этого типа данных можно рассмотреть альтернативные методы сглаживания.
Amean = movmean(Anoise,5); plot(t,A,t,Amean) axis tight legend('Original Data','Moving Mean - Window Size 5','location','best')

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 является еще одним методом сглаживания, который особенно полезен, когда в данных помимо шума присутствуют отклонения. Введите отклонение в шумные данные и используйте надежный Lowess для сглаживания данных, что устраняет отклонение.
Anoise(36) = 20; Arlowess = smoothdata(Anoise,'rlowess',5); plot(t,Anoise,t,Arlowess) axis tight legend('Noisy Data','Robust Lowess')

Отклонения в данных могут значительно искажать результаты обработки данных и другие вычисленные величины. Например, при попытке сглаживания данных, содержащих отклонения, с помощью движущейся медианы можно получить вводящие в заблуждение пики или впадины.
Amedian = smoothdata(Anoise,'movmedian'); plot(t,Anoise,t,Amedian) axis tight legend('Noisy Data','Moving Median')

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. 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