Усреднение данных относится к методам для устранения нежелательного шума или поведений в данных, в то время как определение выбросов идентифицирует точки данных, которые существенно отличаются от остальной части данных.
Движущиеся методы окна являются способами обработать данные в меньших пакетах за один раз, обычно по порядку статистически представлять окружение точек в данных. Скользящее среднее значение является общими данными, сглаживающими метод, который двигает окно вдоль данных, вычисляя среднее значение точек в каждом окне. Это может помочь устранить незначительные изменения от одной точки данных до следующего.
Например, считайте измерения скорости ветра бравшимися каждую минуту в течение приблизительно 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')
Функция smoothdata
предоставляет несколько возможностей сглаживания, таких как метод Savitzky-Golay, который является популярным методом сглаживания, используемым в обработке сигналов. По умолчанию smoothdata
выбирает размер окна лучшего предположения для метода в зависимости от данных.
Используйте метод Savitzky-Golay, чтобы сглаживать сигнал с шумом 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')
Выбросы в данных могут значительно скосить результаты обработки данных и другие вычисленные количества. Например, при попытке сглаживать данные, содержащие выбросы с движущейся медианой, можно получить вводящий в заблуждение peaks или долины.
Amedian = smoothdata(Anoise,'movmedian'); plot(t,Anoise,t,Amedian) axis tight legend('Noisy Data','Moving Median')
Функция isoutlier
возвращает логическую единицу, когда выброс обнаруживается. Проверьте индекс и значение выброса в 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